程序验证(五):一阶理论的过程

2024-03-02 14:38

本文主要是介绍程序验证(五):一阶理论的过程,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

程序验证(五):一阶理论的过程

主要讨论 T E T_E TE的量词自由片段以及 T A T_A TA

等价理论的判定

等价及未解释函数理论(Theory of Equality and Uninterpreted Functions)

除=外的谓词实际上使我们的讨论不必要地复杂化,去除这些累赘谓词的方法如下:

  1. 对每个谓词 p p p,引入一个新的(fresh)函数符号 f p f_p fp
  2. 引入一个新的常量 ∙ \bullet
  3. 将每个谓词实例 p ( t 1 , . . . , t n ) p(t_1 ,..., t_n) p(t1,...,tn)替换为 f p ( t 1 , . . . , t n ) = ∙ f_p(t_1 ,..., t_n)=\bullet fp(t1,...,tn)=
    这样就得到了等价及未解释函数理论(EUF):
    • EUF中唯一的谓词就是=
    • 所有的公理都是相等或不等

转化方法举例:
x = y → ( p ( x ) ↔ p ( y ) ) x=y\to (p(x)\leftrightarrow p(y)) x=y(p(x)p(y))
转化为
x = y → ( ( f p ( x ) = ∙ ) ↔ ( f p ( y ) = ∙ ) ) x=y\to ((f_p (x)=\bullet)\leftrightarrow (f_p (y)=\bullet)) x=y((fp(x)=)(fp(y)=))
p ( x ) ∧ q ( x , y ) ∧ q ( y , z ) → ¬ q ( x , z ) p(x)\wedge q(x,y)\wedge q(y,z)\to \neg q(x,z) p(x)q(x,y)q(y,z)¬q(x,z)
转化为
( f p ( x ) = ∙ ∧ f q ( x , y ) = ∙ ∧ f q ( y , z ) = ∙ ) → f q ( x , z ) ≠ ∙ (f_p(x)=\bullet \wedge f_q(x,y)=\bullet \wedge f_q(y,z)=\bullet) \to f_q(x,z)\ne \bullet (fp(x)=fq(x,y)=fq(y,z)=)fq(x,z)=

一些概念

关系(relation)

给定 S S S上的二元关系 R R R ∀ s 1 , s 2 ∈ S \forall s_1,s_2\in S s1,s2S,或者 s 1 R s 2 s_1Rs_2 s1Rs2或者 ¬ ( s 1 R s 2 ) \neg (s_1Rs_2) ¬(s1Rs2)
一个二元关系 R R R若满足以下三个性质,即为一个等价关系(equivalence relation):

  • 自反性: ∀ x ∈ S . s R s \forall x\in S.sRs xS.sRs
  • 对称性: ∀ s 1 , s 2 ∈ S . s 1 R s 2 → s 2 R s 1 \forall s_1,s_2\in S.s_1Rs_2\to s_2Rs_1 s1,s2S.s1Rs2s2Rs1
  • 传递性: ∀ s 1 , s 2 , s 3 ∈ S . s 1 R s 2 ∧ s 2 R s 3 → s 1 R s 3 \forall s_1,s_2,s_3\in S.s_1Rs_2 \wedge s_2Rs_3 \to s_1Rs_3 s1,s2,s3S.s1Rs2s2Rs3s1Rs3
    一个二元关系 R R R是同余关系(congruence relation),如果它除以上三个性质外,还满足函数同余性:
  • 函数同余性: ∀ s , t ∈ S n . ( ⋀ i = 1 n s i R t i ) → f ( s ) R f ( t ) \forall s,t \in S^n .(\bigwedge ^n_{i=1} s_iRt_i)\to f(s)Rf(t) s,tSn.(i=1nsiRti)f(s)Rf(t)
类(class)

R R R S S S上的一个等价关系,则 s ∈ S s\in S sS R R R下的等价类(equivalence class)为:
[ s ] R ≡ { s ′ ∈ S : s R s ′ } [s] _R \equiv \{s'\in S:sRs'\} [s]R{sS:sRs}
S S S中的每个元素都属于 R R R的一个等价类
如果 R R R是同余关系,那么 [ s ] R [s]_R [s]R s s s的同余类
举例:
Consider the relation ≡ 2 \equiv _2 2 over Z \mathbb{Z} Z, where a ≡ 2 b a\equiv _2 b a2b iff ( a m o d 2 ) = ( b m o d 2 ) (a~mod~2)=(b~mod~2) (a mod 2)=(b mod 2)
The equivalence class of 4 under ≡ 2 \equiv_2 2 is:
[ 4 ] ≡ 2 = { n ∈ Z : ( n m o d 2 ) = 0 } = { n ∈ Z : n i s e v e n } [4]_{\equiv_2} = \{n\in \mathbb{Z}: (n~mod~2)=0\}=\{n\in \mathbb{Z} : n~is~even\} [4]2={nZ:(n mod 2)=0}={nZ:n is even}

分割(partition)

S S S的一个分割 P P P是一个 S S S的子集的集合,满足:

  • total: ( ⋃ S ′ ∈ P S ′ ) = S (\bigcup _{S'\in P} S')=S (SPS)=S
  • disjoint: ∀ S 1 , S 2 ∈ P . S 1 ≠ S 2 → S 1 ∩ S 2 = ∅ \forall S_1, S_2 \in P.S_1\ne S_2\to S_1 \cap S_2 = \empty S1,S2P.S1=S2S1S2=
    等价关系 R R R 产生了 S S S的一个分割,叫做 S S S除以 R R R的商,也就是
    S / R = { [ s ] R : s ∈ S } S/R = \{[s]_R : s\in S\} S/R={[s]R:sS}
    例如,商 Z / ≡ 2 Z/\equiv_2 Z/2即为这个分割:
    { { n ∈ Z : n i s o d d } , { n ∈ Z : n i s e v e n } } \{\{n\in Z :~n~is~odd\},\{n\in Z:~n~is~even\}\} {{nZ: n is odd},{nZ: n is even}}
关系的精化(refinement)

给定 S S S上两个关系 R 1 R_1 R1 R 2 R_2 R2,我们说 R 1 R_1 R1精化了 R 2 R_2 R2,写作 R 1 ≺ R 2 R_1 \prec R_2 R1R2,如果满足条件:
∀ s 1 , s 2 ∈ S . s 1 R 1 s 2 → s 1 R 2 s 2 \forall s_1, s_2\in S.s_1R_1s_2 \to s_1R_2s_2 s1,s2S.s1R1s2s1R2s2
我们可以把二元关系 R R R视为一个对(pair)的集合 R ^ \hat{R} R^,也就是:
∀ s 1 , s 2 ∈ S , i f s 1 R s 2 , t h e n ( s 1 , s 2 ) ∈ R ^ \forall s_1,s_2 \in S,~if~s_1Rs_2,~then~(s_1,s_2)\in \hat{R} s1,s2S, if s1Rs2, then (s1,s2)R^
于是我们知道 R 1 ≺ R 2 R_1 \prec R_2 R1R2当且仅当 R ^ 1 ⊆ R ^ 2 \hat{R}_1 \subseteq \hat{R}_2 R^1R^2
举例:
R 1 : { s R 1 s : s ∈ S } R_1:\{sR_1s:s\in S\} R1:{sR1s:sS}
R 2 : { s 1 R 2 s 2 : s 1 , s 2 ∈ S } R_2:\{s_1R_2s_2:s_1,s_2\in S\} R2:{s1R2s2:s1,s2S}
那么
R 1 ≺ R 2 R_1 \prec R_2 R1R2

等价闭包(equivalence closure)

一个 S S S上的关系 R R R的等价闭包 R E R^E RE是这样的一个等价关系,满足:

  • R R R精化 R E R^E RE: R ≺ R E R\prec R^E RRE
  • 对于其他满足 R ≺ R ′ R\prec R' RR的等价关系 R ′ R' R,或者 R ′ = R E R'=R^E R=RE或者 R E ≺ R ′ R^E \prec R' RER
    也就是说, R E R^E RE是包含 R R R的最小的等价关系
    与之相似, R R R的同余闭包(congruence closure) R C R^C RC是包含 R R R的最小同余关系。
    等价闭包的构造:一个例子
    有一个论域 S = { a , b , c , d } S=\{a,b,c,d\} S={a,b,c,d},一个关系 R R R满足:
    a R b , b R c , d R d aRb,bRc,dRd aRb,bRc,dRd
    为了构造 R E R^E RE,根据定义逐步构造:
构造依据
( a , b ) , ( b , c ) , ( d , d ) ∈ R E (a,b),(b,c),(d,d)\in R^E (a,b),(b,c),(d,d)RE R ⊆ R E R\subseteq R^E RRE
( a , a ) , ( b , b ) , ( c , c ) ∈ R E (a,a),(b,b),(c,c)\in R^E (a,a),(b,b),(c,c)RE自反性
( b , a ) , ( c , b ) ∈ R E (b,a),(c,b)\in R^E (b,a),(c,b)RE对称性
( a , c ) ∈ R E (a,c)\in R^E (a,c)RE传递性
( c , a ) ∈ R E (c,a)\in R^E (c,a)RE对称性

最后
R E = { ( a , b ) , ( b , a ) , ( a , a ) , ( b , b ) , ( b , c ) , ( c , a ) , ( c , b ) , ( c , c ) , ( d , d ) } R^E = \{(a,b),(b,a),(a,a),(b,b),(b,c),(c,a),(c,b),(c,c),(d,d)\} RE={(a,b),(b,a),(a,a),(b,b),(b,c),(c,a),(c,b),(c,c),(d,d)}

T E T_E TE的判定

T E T_E TE的量词自由片段是可判定的

核心逻辑

给定一个 T E T_E TE-公式 F F F:
F : ( s 1 = t 1 ) ∧ ⋯ ∧ ( s m = t m ) ∧ ( s m + 1 ≠ t m + 1 ) ∧ ⋯ ∧ ( s n ≠ t n ) F:(s_1 = t_1)\wedge\dots\wedge (s_m = t_m)\wedge(s_{m+1}\ne t_{m+1})\wedge\dots\wedge (s_n \ne t_n) F:(s1=t1)(sm=tm)(sm+1=tm+1)(sn=tn)
F F F T E T_E TE-可满足的,当且仅当存在一个同余关系~,使得:

  • 对每个 i ∈ { 1 , … , m } i\in \{1,\dots ,m\} i{1,,m}, s i s_i si ~ t i t_i ti
  • 对每个 i ∈ { m + 1 , … , n } i\in \{m+1,\dots ,n\} i{m+1,,n}, s i ̸ s_i \not si~ t i t_i ti
    这样一个同余关系定义了 F F F T E T_E TE-解释 ( D , I ) (D,I) (D,I):
  • D D D由~的同余类构成
  • I I I D D D的元素赋值给 F F F的子项(subterm)来满足~
  • I I I赋值了=,一个与~相似的关系
    我们把 ( D , I ) ⊨ F (D,I)\models F (D,I)F简记为~ ⊨ F \models F F
同余闭包算法

S F S_F SF F F F的子项,~是 S F S_F SF上的关系,那么该算法如下:

  1. 在子项集合 S F S_F SF上构造 { s 1 = t 1 , … , s + m = t m } \{s_1=t_1,\dots ,s+m=t_m\} {s1=t1,,s+m=tm}的同余闭包~
  2. 如果对于任何 i ∈ { m + 1 , … , n } i\in \{m+1,\dots ,n\} i{m+1,,n} s i s_i si~ t i t_i ti,那么返回 u n s a t unsat unsat
  3. 否则,返回 s a t sat sat
    第一步中,构造同余闭包的方法如下:
  • 从“最好”的同余关系开始
    ~ 0 = { { s } : s ∈ S F } _0 = \{\{s\}:s\in S_F\} 0={{s}:sSF}
    这里 S F S_F SF每个子项都在它本身构成的同余类里
  • 对于每个 i ∈ { 1 , … , m } i\in \{1,\dots , m\} i{1,,m}, 通过把 s i = t i s_i = t_i si=ti加入~ i − 1 _{i-1} i1 构造~ i _i i
    • 将同余类 [ s i ] ∼ i − 1 [s_i]_{\sim _{i-1}} [si]i1 [ t i ] ∼ i − 1 [t_i]_{\sim _{i-1}} [ti]i1merge起来
    • 将任何通过以上步骤产生的新的同余关系传递下去
举例
1

判断以下公式的可满足性:
F : f ( a , b ) = a ∧ f ( f ( a , b ) , b ) ≠ a F: f(a,b) = a\wedge f(f(a,b),b)\ne a F:f(a,b)=af(f(a,b),b)=a

  1. 建立子项集合 S F S_F SF: S F = { a , b , f ( a , b ) , f ( f ( a , b ) , b ) } S_F = \{a,b,f(a,b),f(f(a,b),b)\} SF={a,b,f(a,b),f(f(a,b),b)}
  2. 构造 S F S_F SF上的“最好”的闭包关系: { { a } , { b } , { f ( a , b ) } , { f ( f ( a , b ) , b ) } } \{\{a\},\{b\},\{f(a,b)\},\{f(f(a,b),b)\}\} {{a},{b},{f(a,b)},{f(f(a,b),b)}}
  3. 对于每个 i ∈ { 1 , … , m } i\in \{1,\dots ,m\} i{1,,m},将同余类 [ s i ] ∼ i − 1 [s_i]_{\sim _{i-1}} [si]i1 [ t i ] ∼ i − 1 [t_i]_{\sim_{i-1}} [ti]i1merge起来
    这里由 f ( a , b ) = a f(a,b) = a f(a,b)=a得到: { { a , f ( a , b ) } , { b } , { f ( f ( a , b ) , b ) } } \{\{a,f(a,b)\},\{b\},\{f(f(a,b),b)\}\} {{a,f(a,b)},{b},{f(f(a,b),b)}}
  4. 每次merge之后,使用公理以推进
    f ( a , b ) ∼ a , b ∼ b f(a,b)\sim a,b\sim b f(a,b)a,bb,有 f ( f ( a , b ) , b ) ∼ f ( a , b ) f(f(a,b),b)\sim f(a,b) f(f(a,b),b)f(a,b),从而: { { a , f ( a , b ) , f ( f ( a , b ) , b ) } , { b } } \{\{a,f(a,b),f(f(a,b),b)\},\{b\}\} {{a,f(a,b),f(f(a,b),b)},{b}}
    这也就是 S F S_F SF的同余闭包
  5. F F F T E T_E TE-不可满足的,因为 f ( f ( a , b ) , b ) ∼ a f(f(a,b),b)\sim a f(f(a,b),b)a F F F声称 f ( f ( a , b ) , b ) ≠ a f(f(a,b),b)\ne a f(f(a,b),b)=a
2

判断以下公式的可满足性:
F : f ( f ( f ( a ) ) ) = a ∧ f ( f ( f ( f ( f ( a ) ) ) ) ) = a ∧ f ( a ) ≠ a F:f(f(f(a)))=a\wedge f(f(f(f(f(a)))))=a\wedge f(a)\ne a F:f(f(f(a)))=af(f(f(f(f(a)))))=af(a)=a

  1. 建立子项集合 S F S_F SF S F = { a , f ( a ) , f 2 ( a ) , f 3 ( a ) , f 4 ( a ) , f 5 ( a ) } S_F = \{a,f(a),f^2(a),f^3(a),f^4(a),f^5(a)\} SF={a,f(a),f2(a),f3(a),f4(a),f5(a)}
  2. 构造 S F S_F SF上的初始同余关系: { { a } , { f ( a ) } , { f 2 ( a ) } , { f 3 ( a ) } , { f 4 ( a ) } , { f 5 ( a ) } } \{\{a\},\{f(a)\},\{f^2(a)\},\{f^3(a)\},\{f^4(a)\},\{f^5(a)\}\} {{a},{f(a)},{f2(a)},{f3(a)},{f4(a)},{f5(a)}}
  3. f 3 ( a ) = a f^3(a) = a f3(a)=a,合并 { f 3 ( a ) } \{f^3(a)\} {f3(a)} { a } \{a\} {a} { { a , f 3 ( a ) } , { f ( a ) } , { f 2 ( a ) } , { f 4 ( a ) } , { f 5 ( a ) } } \{\{a,f^3(a)\},\{f(a)\},\{f^2(a)\},\{f^4(a)\},\{f^5(a)\}\} {{a,f3(a)},{f(a)},{f2(a)},{f4(a)},{f5(a)}}
  4. f 3 ( a ) ∼ a f^3(a)\sim a f3(a)a,推导出 f 4 ( a ) ∼ f ( a ) f^4(a)\sim f(a) f4(a)f(a) { { a , f 3 ( a ) } , { f ( a ) , f 4 ( a ) } , { f 2 ( a ) } , { f 5 ( a ) } } \{\{a,f^3(a)\},\{f(a),f^4(a)\},\{f^2(a)\},\{f^5(a)\}\} {{a,f3(a)},{f(a),f4(a)},{f2(a)},{f5(a)}}
  5. f 4 ( a ) ∼ f ( a ) f^4(a)\sim f(a) f4(a)f(a),推导出 f 5 ( a ) ∼ f 2 ( a ) f^5(a)\sim f^2(a) f5(a)f2(a) { { a , f 3 ( a ) } , { f ( a ) , f 4 ( a ) } , { f 2 ( a ) , f 5 ( a ) } } \{\{a,f^3(a)\},\{f(a),f^4(a)\},\{f^2(a),f^5(a)\}\} {{a,f3(a)},{f(a),f4(a)},{f2(a),f5(a)}}
  6. f 5 ( a ) = a f^5(a)=a f5(a)=a,合并 { f 2 ( a ) , f 5 ( a ) } \{f^2(a),f^5(a)\} {f2(a),f5(a)} { a , f 3 ( a ) } \{a,f^3(a)\} {a,f3(a)} { { a , f 2 ( a ) , f 3 ( a ) , f 5 ( a ) } , { f ( a ) , f 4 ( a ) } } \{\{a,f^2(a),f^3(a),f^5(a)\},\{f(a),f^4(a)\}\} {{a,f2(a),f3(a),f5(a)},{f(a),f4(a)}}
  7. f 3 ( a ) ∼ f 2 ( a ) f^3(a)\sim f^2(a) f3(a)f2(a),推导出 f 4 ( a ) ∼ f 3 ( a ) f^4(a)\sim f^3(a) f4(a)f3(a) { { a , f ( a ) , f 2 ( a ) , f 3 ( a ) , f 4 ( a ) , f 5 ( a ) } } \{\{a,f(a),f^2(a),f^3(a),f^4(a),f^5(a)\}\} {{a,f(a),f2(a),f3(a),f4(a),f5(a)}}
    这就是 S F S_F SF的同余闭包
  8. F F F声称 f ( a ) ≠ a f(a)\ne a f(a)=a,而 f ( a ) ∼ a f(a)\sim a f(a)a,所以 u n s a t unsat unsat
    实现同余闭包算法的底层算法:并查集
性质

可靠性与完备性:如果同余闭包算法返回 s a t sat sat那么量词自由的 F F F就是 T E − s a t T_E-sat TEsat
复杂度: O ( e 2 ) O(e^2) O(e2)(参见并查集算法)

数组的判定理论

核心逻辑

T A T_A TA可满足性判定归约为 T E T_E TE可满足性判定
如果一个 Σ Z \Sigma_Z ΣZ-公式 F F F不包含任何写项:

  • 将每个数组变量 a a a与一个新的(fresh)函数符号 f a f_a fa关联起来
  • 将每个读项 a [ i ] a[i] a[i]替换为 f a ( i ) f_a(i) fa(i)
  • 判断并返回得到的公式的 T E T_E TE可满足性
    否则,取一个项 a ⟨ i ◃ v ⟩ [ j ] a\langle i\triangleleft v\rangle [j] aiv[j],并分为两种情况:
  • F [ a ⟨ i ◃ v ⟩ [ j ] ] F[a\langle i\triangleleft v\rangle [j]] F[aiv[j]]替换为$F_1:F[v]\wedge i=j
  • F [ a ⟨ i ◃ v ⟩ [ j ] ] F[a\langle i\triangleleft v\rangle [j]] F[aiv[j]]替换为 F 2 : F [ a [ j ] ] ∧ i ≠ j F_2:F[a[j]]\wedge i\ne j F2:F[a[j]]i=j
  • 递归地对 F 1 F_1 F1 F 2 F_2 F2做以上处理。只要有一个分支是 s a t sat sat,那么返回 s a t sat sat
  • 否则,返回 u n s a t unsat unsat
举例

判断以下公式的可满足性:
F : i 1 = j ∧ i 1 ≠ i 2 ∧ a [ j ] = v 1 ∧ a ⟨ i 1 ◃ v 1 ⟩ ⟨ i 2 ◃ v 2 ⟩ [ j ] ≠ a [ j ] F:i_1 = j\wedge i_1\ne i_2 \wedge a[j]=v_1 \wedge a\langle i_1 \triangleleft v_1 \rangle \langle i_2 \triangleleft v_2 \rangle [j]\ne a[j] F:i1=ji1=i2a[j]=v1ai1v1i2v2[j]=a[j]
F F F本身知, i 2 ≠ j i_2 \ne j i2=j:
F 2 : i 1 = j ∧ i 1 ≠ i 2 ∧ a [ j ] = v 1 ∧ a ⟨ i 1 ◃ v 1 ⟩ [ j ] ≠ a [ j ] ∧ i 2 ≠ j F_2:i_1=j\wedge i_1\ne i_2\wedge a[j] = v_1\wedge a\langle i_1\triangleleft v_1\rangle [j]\ne a[j]\wedge i_2\ne j F2:i1=ji1=i2a[j]=v1ai1v1[j]=a[j]i2=j
其中有一个写项,所以分为两种情况:
F 3 : i 1 = j ∧ i 1 ≠ i 2 ∧ a [ j ] = v 1 ∧ v 1 ≠ a [ j ] ∧ i 2 ≠ j ∧ i 1 = j F_3:i_1 =j\wedge i_1\ne i_2 \wedge a[j]=v_1 \wedge v_1\ne a[j]\wedge i_2\ne j\wedge i_1 =j F3:i1=ji1=i2a[j]=v1v1=a[j]i2=ji1=j
F 4 : i 1 = j ∧ i 1 ≠ i 2 ∧ a [ j ] = v 1 ∧ a [ j ] ≠ a [ j ] ∧ i 2 ≠ j ∧ i 1 ≠ j F_4:i_1=j\wedge i_1\ne i_2\wedge a[j]=v_1 \wedge a[j]\ne a[j]\wedge i_2\ne j\wedge i_1\ne j F4:i1=ji1=i2a[j]=v1a[j]=a[j]i2=ji1=j
二者都是不可满足的
所有的分支都是 u n s a t unsat unsat,所以得出结论: F F F T A T_A TA-不可满足的

性质

可靠性与完备性:给定一个 Σ A \Sigma_A ΣA公式 F F F,以上判定算法返回 s a t sat sat当且仅当 F F F T A T_A TA-可满足的,否则,它返回 u n s a t unsat unsat
复杂度:这是一个NP完全问题。

这篇关于程序验证(五):一阶理论的过程的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/766450

相关文章

C# WinForms存储过程操作数据库的实例讲解

《C#WinForms存储过程操作数据库的实例讲解》:本文主要介绍C#WinForms存储过程操作数据库的实例,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、存储过程基础二、C# 调用流程1. 数据库连接配置2. 执行存储过程(增删改)3. 查询数据三、事务处

JSON Web Token在登陆中的使用过程

《JSONWebToken在登陆中的使用过程》:本文主要介绍JSONWebToken在登陆中的使用过程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录JWT 介绍微服务架构中的 JWT 使用结合微服务网关的 JWT 验证1. 用户登录,生成 JWT2. 自定义过滤

java中使用POI生成Excel并导出过程

《java中使用POI生成Excel并导出过程》:本文主要介绍java中使用POI生成Excel并导出过程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录需求说明及实现方式需求完成通用代码版本1版本2结果展示type参数为atype参数为b总结注:本文章中代码均为

SpringCloud之LoadBalancer负载均衡服务调用过程

《SpringCloud之LoadBalancer负载均衡服务调用过程》:本文主要介绍SpringCloud之LoadBalancer负载均衡服务调用过程,具有很好的参考价值,希望对大家有所帮助,... 目录前言一、LoadBalancer是什么?二、使用步骤1、启动consul2、客户端加入依赖3、以服务

Oracle存储过程里操作BLOB的字节数据的办法

《Oracle存储过程里操作BLOB的字节数据的办法》该篇文章介绍了如何在Oracle存储过程中操作BLOB的字节数据,作者研究了如何获取BLOB的字节长度、如何使用DBMS_LOB包进行BLOB操作... 目录一、缘由二、办法2.1 基本操作2.2 DBMS_LOB包2.3 字节级操作与RAW数据类型2.

C#原型模式之如何通过克隆对象来优化创建过程

《C#原型模式之如何通过克隆对象来优化创建过程》原型模式是一种创建型设计模式,通过克隆现有对象来创建新对象,避免重复的创建成本和复杂的初始化过程,它适用于对象创建过程复杂、需要大量相似对象或避免重复初... 目录什么是原型模式?原型模式的工作原理C#中如何实现原型模式?1. 定义原型接口2. 实现原型接口3

Spring Security注解方式权限控制过程

《SpringSecurity注解方式权限控制过程》:本文主要介绍SpringSecurity注解方式权限控制过程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、摘要二、实现步骤2.1 在配置类中添加权限注解的支持2.2 创建Controller类2.3 Us

Spring AI集成DeepSeek三步搞定Java智能应用的详细过程

《SpringAI集成DeepSeek三步搞定Java智能应用的详细过程》本文介绍了如何使用SpringAI集成DeepSeek,一个国内顶尖的多模态大模型,SpringAI提供了一套统一的接口,简... 目录DeepSeek 介绍Spring AI 是什么?Spring AI 的主要功能包括1、环境准备2

SpringBoot集成图片验证码框架easy-captcha的详细过程

《SpringBoot集成图片验证码框架easy-captcha的详细过程》本文介绍了如何将Easy-Captcha框架集成到SpringBoot项目中,实现图片验证码功能,Easy-Captcha是... 目录SpringBoot集成图片验证码框架easy-captcha一、引言二、依赖三、代码1. Ea

pycharm远程连接服务器运行pytorch的过程详解

《pycharm远程连接服务器运行pytorch的过程详解》:本文主要介绍在Linux环境下使用Anaconda管理不同版本的Python环境,并通过PyCharm远程连接服务器来运行PyTorc... 目录linux部署pytorch背景介绍Anaconda安装Linux安装pytorch虚拟环境安装cu