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

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

相关文章

SpringBoot 整合 Grizzly的过程

《SpringBoot整合Grizzly的过程》Grizzly是一个高性能的、异步的、非阻塞的HTTP服务器框架,它可以与SpringBoot一起提供比传统的Tomcat或Jet... 目录为什么选择 Grizzly?Spring Boot + Grizzly 整合的优势添加依赖自定义 Grizzly 作为

mysql-8.0.30压缩包版安装和配置MySQL环境过程

《mysql-8.0.30压缩包版安装和配置MySQL环境过程》该文章介绍了如何在Windows系统中下载、安装和配置MySQL数据库,包括下载地址、解压文件、创建和配置my.ini文件、设置环境变量... 目录压缩包安装配置下载配置环境变量下载和初始化总结压缩包安装配置下载下载地址:https://d

springboot整合gateway的详细过程

《springboot整合gateway的详细过程》本文介绍了如何配置和使用SpringCloudGateway构建一个API网关,通过实例代码介绍了springboot整合gateway的过程,需要... 目录1. 添加依赖2. 配置网关路由3. 启用Eureka客户端(可选)4. 创建主应用类5. 自定

最新版IDEA配置 Tomcat的详细过程

《最新版IDEA配置Tomcat的详细过程》本文介绍如何在IDEA中配置Tomcat服务器,并创建Web项目,首先检查Tomcat是否安装完成,然后在IDEA中创建Web项目并添加Web结构,接着,... 目录配置tomcat第一步,先给项目添加Web结构查看端口号配置tomcat    先检查自己的to

SpringBoot集成SOL链的详细过程

《SpringBoot集成SOL链的详细过程》Solanaj是一个用于与Solana区块链交互的Java库,它为Java开发者提供了一套功能丰富的API,使得在Java环境中可以轻松构建与Solana... 目录一、什么是solanaj?二、Pom依赖三、主要类3.1 RpcClient3.2 Public

Android数据库Room的实际使用过程总结

《Android数据库Room的实际使用过程总结》这篇文章主要给大家介绍了关于Android数据库Room的实际使用过程,详细介绍了如何创建实体类、数据访问对象(DAO)和数据库抽象类,需要的朋友可以... 目录前言一、Room的基本使用1.项目配置2.创建实体类(Entity)3.创建数据访问对象(DAO

SpringBoot整合kaptcha验证码过程(复制粘贴即可用)

《SpringBoot整合kaptcha验证码过程(复制粘贴即可用)》本文介绍了如何在SpringBoot项目中整合Kaptcha验证码实现,通过配置和编写相应的Controller、工具类以及前端页... 目录SpringBoot整合kaptcha验证码程序目录参考有两种方式在springboot中使用k

SpringBoot整合InfluxDB的详细过程

《SpringBoot整合InfluxDB的详细过程》InfluxDB是一个开源的时间序列数据库,由Go语言编写,适用于存储和查询按时间顺序产生的数据,它具有高效的数据存储和查询机制,支持高并发写入和... 目录一、简单介绍InfluxDB是什么?1、主要特点2、应用场景二、使用步骤1、集成原生的Influ

SpringBoot实现websocket服务端及客户端的详细过程

《SpringBoot实现websocket服务端及客户端的详细过程》文章介绍了WebSocket通信过程、服务端和客户端的实现,以及可能遇到的问题及解决方案,感兴趣的朋友一起看看吧... 目录一、WebSocket通信过程二、服务端实现1.pom文件添加依赖2.启用Springboot对WebSocket

浅析Spring Security认证过程

类图 为了方便理解Spring Security认证流程,特意画了如下的类图,包含相关的核心认证类 概述 核心验证器 AuthenticationManager 该对象提供了认证方法的入口,接收一个Authentiaton对象作为参数; public interface AuthenticationManager {Authentication authenticate(Authenti