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

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

相关文章

浅析Spring Security认证过程

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

作业提交过程之HDFSMapReduce

作业提交全过程详解 (1)作业提交 第1步:Client调用job.waitForCompletion方法,向整个集群提交MapReduce作业。 第2步:Client向RM申请一个作业id。 第3步:RM给Client返回该job资源的提交路径和作业id。 第4步:Client提交jar包、切片信息和配置文件到指定的资源提交路径。 第5步:Client提交完资源后,向RM申请运行MrAp

【机器学习】高斯过程的基本概念和应用领域以及在python中的实例

引言 高斯过程(Gaussian Process,简称GP)是一种概率模型,用于描述一组随机变量的联合概率分布,其中任何一个有限维度的子集都具有高斯分布 文章目录 引言一、高斯过程1.1 基本定义1.1.1 随机过程1.1.2 高斯分布 1.2 高斯过程的特性1.2.1 联合高斯性1.2.2 均值函数1.2.3 协方差函数(或核函数) 1.3 核函数1.4 高斯过程回归(Gauss

Solr 使用Facet分组过程中与分词的矛盾解决办法

对于一般查询而言  ,  分词和存储都是必要的  .  比如  CPU  类型  ”Intel  酷睿  2  双核  P7570”,  拆分成  ”Intel”,”  酷睿  ”,”P7570”  这样一些关键字并分别索引  ,  可能提供更好的搜索体验  .  但是如果将  CPU  作为 Facet  字段  ,  最好不进行分词  .  这样就造成了矛盾  ,  解决方法

Python:豆瓣电影商业数据分析-爬取全数据【附带爬虫豆瓣,数据处理过程,数据分析,可视化,以及完整PPT报告】

**爬取豆瓣电影信息,分析近年电影行业的发展情况** 本文是完整的数据分析展现,代码有完整版,包含豆瓣电影爬取的具体方式【附带爬虫豆瓣,数据处理过程,数据分析,可视化,以及完整PPT报告】   最近MBA在学习《商业数据分析》,大实训作业给了数据要进行数据分析,所以先拿豆瓣电影练练手,网络上爬取豆瓣电影TOP250较多,但对于豆瓣电影全数据的爬取教程很少,所以我自己做一版。 目

ORACLE语法-包(package)、存储过程(procedure)、游标(cursor)以及java对Result结果集的处理

陈科肇 示例: 包规范 CREATE OR REPLACE PACKAGE PACK_WMS_YX IS-- Author : CKZ-- Created : 2015/8/28 9:52:29-- Purpose : 同步数据-- Public type declarations,游标 退休订单TYPE retCursor IS REF CURSOR;-- RETURN vi_co_co

OpenStack创建虚拟机过程

OpenStack创建虚拟机过程 一、在分析OpenStack创建虚拟机的过程之前,先来梳理一下需要用用到哪些组件。 二、每一步都需要去keystone去进行验证,下图有详细的流程。 登录界面或命令行通过RESTful API向keystone获取认证信息。keystone通过用户请求认证信息,并生成auth-token返回给对应的认证请求。界面或命令行通过RESTful API

Maven生命周期:深入理解构建过程

目录 1. Maven生命周期简介 2. 默认生命周期的阶段 3. 清理生命周期 4. 站点生命周期 5. Maven生命周期的灵活性 6. 结论         在Java开发中,Maven是一个不可或缺的工具,它通过自动化项目的构建、依赖管理和文档生成等任务,极大地提高了开发效率。Maven的核心之一是其构建生命周期,它定义了项目构建过程中的一系列阶段。在这篇文章中,我们将深

JVM工作过程

将JVM工作过程粗略分为5个阶段,包括加载阶段、链接阶段、初始化阶段、执行阶段、回收阶段 其中, (1)加载阶段、链接阶段的解析部分主要由类加载器完成 (2)初始化阶段是由JVM的类加载机制在类加载过程的最后阶段自动触发的。 (3)执行阶段主要由执行引擎负责 (4)回收阶段主要是垃圾收集器(Garbage Collector)负责。 所以,在Java虚拟机(JVM)中,读取字节码文件、解析字节码

【QNX+Android虚拟化方案】120 - Android 侧 USB2.0 插拔过程

【QNX+Android虚拟化方案】120 - Android 侧 USB2.0 插拔过程 基于原生纯净代码,自学总结 纯技术分享,不会也不敢涉项目、不泄密、不传播代码文档!!! 本文禁止转载分享 !!! 汇总链接:《【QNX+Android虚拟化方案】00 - 系列文章链接汇总》 本文链接:《【QNX+Android虚拟化方案】120 - Android 侧 USB2.0