量词实例化
定义置换就是用一个变量替换另一个变量,如
θ={a/b}
是说这个置换的名字叫θ,它将语句中的变量a都换成变量b。应用一个变换可以这样表示
SUBSET(θ,α)
表示对语句α应用置换θ
全称量词实例化可以用任意的变量置换全称量化的变量,如对于
∀x(King(x)∧Greedy(x)⇒Evil(x))
令置换 θ={x/John},可得到
King(John)∧Greedy(John)⇒Evil(John)
存在量词实例化同样使用置换,不过置换的变量应当是从未出现的,称为斯科伦常量,如
∃x(Crown(x)∧OnHead(x,John))
可得
Crown(C1)∧OnHead(C1,John)
其中C1是斯科伦常量,它从未出现过。在进行实例化后,得到的语句应取代原先的语句,意为存在量词实例化只能进行一次。但是全称量词可以多次实例化,可以获得多种不同的结果
量词约简为命题推断
量词的约简分为两步
- 对全称量词的语句,枚举所有的对象进行实例化
- 对存在量词的语句,用斯科伦常量进行一次实例化
不过此处会出现问题,函数作用与对象上会得到对象,它还能再被函数作用一次得到新的对象。这回陷入无限的嵌套中
对于该问题有Herbrand定理
Note
如果有限的一阶语句蕴含某个语句α,则一定存在有限步的推导。即将这些一阶语句命题化后存在一个有限嵌套深度的子集可以完成证明
这说明一阶逻辑的蕴含问题是半可判定的,也就是说存在有限步内能判断语句成立,却不能判断语句不成立
不过即便不考虑函数,对于n个对象和一个k元谓词,实例化的复杂度也是指数级的
其中有大量无关的语句。为了只实例化需要的实例,需要引入一般化肯定前件(GMP)
一般化肯定前件
对于n个原子语句p1,p2,⋯,pn和1个蕴含语句,更准确来说应该是一阶确定子句,只有一个正文字
p1′∧p2′∧⋯∧pn′⇒q
如果能找到一个置换θ使得对应语句相同
SUBSET(θ,pi)=SUBSET(θ,p1′)
注意等值表示的是相同而不是逻辑上的相等。那么给定前件为p1′,p2′,⋯,pn′的该蕴含语句
p1′,p2′,⋯,pn′,(p1′∧p2′∧⋯∧pn′⇒q)
可以被替换为结论的置换
SUBSET(θ,q)
一个简单的例子是
∀x(King(x)∧Greedy(x)⇒Evil(x))King(John)∀yGreedy(y)Brother(John,Richard)
由于取置换
θ={x/John,y/John}
各语句被置换后有
Subst(θ,p1′)=Subst(θ,p1)=King(John)
Subst(θ,p2′)=Subst(θ,p2)=Greedy(John)
那么原来的蕴含语句Subst(θ,q)就应被实例化为
Evil(John)
没有多余的实例化
GMP的核心在于那个置换,称为合一子。两个语句的合一子可能不止一种,但是会存在一个最一般的合一子,其他所有的何意子都可以在其基础上再施加置换得到,称为最一般合一子MGU
不过使用GMP的条件是所有的变量假设均为全称量词,并且只能作用于一阶确定子句。在这个条件下,GMP是可靠且完备的
一阶逻辑的归结
一阶逻辑转换为合取范式
要对一阶逻辑使用归结,应当先将一阶逻辑语句转换为合取范式CNF。要将语句转化为CNF,应当先消去蕴含,利用逻辑等值式
A⇒B≡¬A∨B
使用时需要注意,虽然需要对∀,∃取反,但是内层的⇒取反时不应影响外层的量词,如
∀x[∀yAnimal(y)⇒Loves(x,y)]⇒[∃yLoves(y,x)]
→∀x¬[∀y¬Animal(y)∨Loves(x,y)∨(∃yLoves(y,x))]
其中∀x是外层的量词,作用于蕴含的两端,不受取反影响;而蕴含的前提中∃y不作用于结论,应当取反
第二步是将非号移到量词作用域的内部,形成一系列由与
和或
连接的原子语句,如
∀x¬[∀y¬Animal(y)∨Loves(x,y)∨(∃yLoves(y,x))]
→∀x[∃yAnimal(y)∧¬Loves(x,y)∨(∃yLoves(y,x))]
第三步是变量标准化,不同语句间如果不是同一个对象应使用不同的名字,虽然量词的修饰允许,但为了后续步骤还是需要这样做,如此处将蕴含结论的y换为了另一个名称z
∀x[∃yAnimal(y)∧¬Loves(x,y)∨(∃yLoves(y,x))]
→∀x[∃yAnimal(y)∧¬Loves(x,y)∨∃zLoves(z,x)]
第四步是将存在量词实例化。需要注意的是,此处实例化并不是化为斯科伦常量,而是斯科伦函数。它是所有基本对象的函数,代表未知的确定函数,这是因为斯科伦常量太过一般,至少斯科伦函数能提供自变量的信息。如
∀x[∃yAnimal(y)∧¬Loves(x,y)∨∃zLoves(z,x)]
→∀x[Animal(F(x))∧¬Loves(x,F(x))∨Loves(G(x),x)]
不一样的变量应替换为不一样的斯科伦函数
最后将全称量词去除,因为斯科伦函数可以是所有基本对象的任意函数,本身就是对所有基本对象的实例化。上面的例子中,最后将得到语句
Animal(F(x))∧¬Loves(x,F(x))∨Loves(G(x),x)
不过为了得到CNF的形式,还需将其转为合取
[Animal(F(x))∨Loves(G(x),x)]∧[¬Loves(x,F(x))∨Loves(G(x),x)]
一阶逻辑的归结规则
Note
对于两个一阶逻辑的CNF语句,若其中各有一个文字,在某种置换规则θ作用下互为反文字,则这两个文字可以被消去
具体来说,对于一阶逻辑语句
a0∧a1∧a2∧⋯∧an
b0∧b1∧b2∧⋯∧bm
若存在一个置换规则使得θ使得
SUBSET(θ,b0)=¬a0
则它们两个等价于
SUBSET(θ,a1∧a2∧⋯∧an∧b1∧b2∧⋯∧bm
归结是可靠且完备的