程序验证(三):一阶逻辑
语法
逻辑符号
包括:
- 命题连接符: ∧ , ∨ , ¬ , → , ↔ \wedge , \vee , \neg , \to , \leftrightarrow ∧,∨,¬,→,↔
- 变元: v , y , z , x 1 , x 2 , . . . v,y,z,x_1,x_2, ... v,y,z,x1,x2,...
- 量词: ∃ \exists ∃, ∀ \forall ∀
非逻辑符号(参数)
包括:
- 常量: c 1 , c 2 , . . . c_1, c_2, ... c1,c2,...
- 函数符号: g , h , f , f 1 , f 2 , . . . g,h,f,f_1,f_2, ... g,h,f,f1,f2,...
- 谓词符号: r , q , p , p 1 , p 2 , . . . r,q,p,p_1,p_2 , ... r,q,p,p1,p2,...
谓词与函数符号通过元数(arity)联系起来,也就是:
元数:一个描述参数数量的自然数
举例: - = : = : =:: arity 2
- f ( a , b , c ) f(a,b,c) f(a,b,c): arity 3
- 常量:可以视为0元函数
项(term)
项是用来描述对象的表达式
定义:
- 常量是项
- 变量是项
- 对于n元函数符号 f f f, f ( t 1 , . . . , t n ) f(t_1, ..., t_n) f(t1,...,tn)是一个项,如果 t 1 , . . . , t n t_1, ... ,t_n t1,...,tn是项
原子公式(atom)
一阶逻辑(FOL)中的原子公式取值或为真、或为假
定义:
- ⊥ \bot ⊥, ⊤ \top ⊤为原子
- 对于每个n元谓词符号 p p p, p ( t 1 , . . . , t n ) p(t_1, ..., t_n) p(t1,...,tn)是一个原子如果 t 1 , . . . , t n t_1, ... , t_n t1,...,tn是项
一个文字(literal)是一个原子或它的非。
公式(formula)
一个一阶逻辑公式是:
- 一个文字
- 使用 ¬ , ∧ , ∨ , → , ↔ \neg ,\wedge ,\vee ,\to ,\leftrightarrow ¬,∧,∨,→,↔连接的公式
- 使用量词(quantifier)的公式
两种量词: - ∀ x . F [ x ] : " F o r a l l x , F [ x ] " \forall x.F[x]:~"For~all~x,~F[x]" ∀x.F[x]: "For all x, F[x]"
- ∃ x . F [ x ] : " T h e r e e x i s t s a n x s u c h t h a t F [ x ] " \exists x.F[x]:~"There~exists~an~x~such~that~F[x]" ∃x.F[x]: "There exists an x such that F[x]"
其中, - x x x是约束变元(quantified variable)
- F [ x ] F[x] F[x]是量词的辖域(scope)
- x x x在 F [ x ] F[x] F[x]中被量词约束(bind)
- 如果 F F F中 y y y没有被任何量词约束,那么它是自由(free)的
一阶逻辑公式的一些名称: - 一个不包含自由变量的公式是关闭的(closed)(也叫做一个句子)
- 一个包含自由变量的公式是开放的(open)
- 一个不包含任何变量的公式是ground
一阶逻辑表达式举例
“All cats have more days than dogs”
∀ x , y . d o g ( x ) ∧ c a t ( y ) → n d a y s ( y ) > n d a y s ( x ) \forall x,y.dog(x)\wedge cat(y)\to ndays(y) > ndays(x) ∀x,y.dog(x)∧cat(y)→ndays(y)>ndays(x)
“The numeric array a is sorted”
f o r a l l i . 0 ≤ i < ∣ a ∣ → a [ i ] ≤ a [ i + 1 ] forall i.0\le i< |a|\to a[i] \le a[i+1] foralli.0≤i<∣a∣→a[i]≤a[i+1]
“Graph G contains a triangle”
∃ v 1 , v 2 , v 3 . e ( v 1 , v 2 ) ∧ e ( v 2 , v 3 ) ∧ e ( v 3 , v 1 ) \exists v_1 ,v_2 ,v_3 .e(v_1, v_2)\wedge e(v_2, v_3)\wedge e(v_3, v_1) ∃v1,v2,v3.e(v1,v2)∧e(v2,v3)∧e(v3,v1)
语义
一个一阶逻辑解构是一个对(pair) S = ( D , I ) S=(D,I) S=(D,I),这里:
- D D D是论域(universe of discourse),也就是说,一个我们要讨论的对象的非空集合
- I I