一阶逻辑自动推理系统
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
一阶逻辑自动推理系统
一基础知识
(1)定义 1设t是LF(X)中的项,若t为常量或变元,则t为 0元项,记为 0-T;若t为
fn(t1 t2……tn)的形式,则t为 n元项。
(2)定义2 设g是LF(X)中的广义文字,若g为如下形式:
P( f1( f2( f m(t) )))或ØP( f1( f2( f m(t) )))
这里P是LF(X)中的谓词符号,f i(i = 1 2 m)是LF(X)中的函数符号且f i(i = 1 2 m)为0 元或1 元,t为常量或变元,且g中不含有蕴涵算子“®”,则称g为简单广义文字,称m为g的复杂度。
(3)定理1 设g1,g2是LF(X)中的简单广义文字,且g1,g2分别
为如下形式:
P(f ( f ( f(a) ))) (k个f)
ØP(f ( f ( f(x) ))) (k个f)
这里k,l分别是g1,g2的复杂度,a是LF(X)中的常量,x是LF(X)中的变元,f 是LF(X)中的函数符号。
如果k < l,则(g1 g2)不是α -归结对。
(4)定义3 设C 是LF(X) 中的子句,且C 为如下形式:
g1 Ú g2 Ú Ú g n,其中g i(i = 1 2 n)为LF(X)中简单广义文字,则称C为简单广义子句。(5)定义4 设S ={C1 C2 C m}是LF(X)中的子句集,若C i(i = 1 2 m)为简单广义子句,则称S为简单广义子句集。
(6)定理2LF(X)中子句集S为α-不可满足的当且仅当存在S中子句的基例的有穷集合S′,S′是α-不可满足的。
(7)定理3 设S为LF(X)中的子句集,S*是S经过基替换后得到的子句集,若S*是α-不可满足的,则S是α-不可满足的。
(8)引理1 LF(X)中的子句集S={C1 C2 C m}是α-不可满足的当且仅当对于任意的p i Î G i ,存在最一般合一σ,使得pσ1 Ù pσ2 Ù Ù pσm £ α,这里G i是子句C i中的广义文字集合。
(9)定理4 LF(X)中的子句集S为α-不可满足,当且仅当S的每一条路径上均有α- 归结对,即对任意的P i Î H i(i = 1 2 m),{P1 P2 P m}中有α-归结对。
(10)定理5 设S = S1 S2是LF(X)中的子句集,S1 ={C1 C2 C k},S2 ={C k + 1 C k + 2 C m},如果存在S的一条无α-归结对的前k元子路径R1,并且R1与子句集S2无α-归结对,则S为α-不可满足的当且仅当S2为α-不可满足的
(11)定理6 将LF(X)中的子句集S中子句的次序调换或S中某个子句中文字的次序调换不改变S的α-不可满足性和α-可满足性。
二简单子句集的归结自动推理算法
为了便于计算机程序的编制,首先对LF(X)中的子句集S
进行如下的预处理:
(1)定义一个二维数组C[m][n]来存储子句集S,其中n为子句集S中所有子句所含文字的最大数,则C[i]表示S中子句C i;C[i][0]表示子句C i广义文字的个数,C[i][ j]表示子句C i中第j个广义文字,i Î{1 2 m},j Î{1 2 n};
(2)定义一个二维数组Com[i][ j],Com[i][ j]表示子句C i中第j个广义文字的复杂度;
(3)定义一个一维数组num[i],num[i]表示子句C i中基广义文字的个数,num[θ[i]]表示子句C i进行θ替换后生成的新的基广义文字的个数;
(4)变量k用于标记当前子句的位置;
(5)定义两个一维数组p[k]和R[n],用p[i]记录子句C k中当前搜索位置,而R[1 2 k]来储存在S中目前的路径(k表示路径的有效长度);
(6)定义与二维数组C[i][ j]相对应的变量t[i][ j](i Î{1 2 m},j Î{1 2 n}),在同一路径上的t[i][ j] = 1的两个广义文字是α-归结对;
(7)定义与C[i]相对应的数组t[i],用于保存子句C[i]中所对应的t[i][ j];
(8)定义一个二维数组G[i][p[i]],G[i][p[i]]表示子句C i中当前路径p[i]的所有基例。
详细的算法如下:
(1)置循环变量k = 0,p(0) = 1,t[i][ j] = 0,R[0] = C[0][p[0]]。
(2)判断是否存在路径R[1 2 m]上广义文字对应的t[i][ j]全为0。
(2.1)若存在,则选择这样路径中复杂度最高的基广义文字C[i][ j],此时会出现两种情况:
(2.1.1)这样的广义文字存在多个,则选择将C[i][ j]作为初始文字,G[i][p[i]]=:G[i][p[i]] {C[i][ j]},转到第(4)步;
(2.1.2)这样的广义文字若不存在,则转到(3.2)。
(2.2)若不存在,则S是α-不可满足的且输出G[i][p[i]],算法结束。
(3)在S中选定C[k]
(3.1)若S中含有基广义文字,则在S中选定这样的子句C[i]:
A.C[i]中含有最复杂的基广义文字C[i][ j];
B.满足条件A的最短的子句,G[i][p[i]]=:G[i][p[i]] {C[i][ j]}。
(3.2)若S中不含有基广义文字,则在S中选定这样的子句C[i]:
A.C[i]中含有最复杂的广义文字C[i][ j];
B.满足条件A的最短的子句。
(3.3)如果i ¹k,则将子句C[i]与C[k]的位置对调,t[i]与t[k]的位置对调。
(3.4)如果j ¹p[k],则将C[i][ j]与C[i][k]的位置对调,t[i][ j]与t[i][k]的位置对调。(4)在后m - 1 - k中选择C[k + 1],C[k + 1]中含有与C[k][p[k]]为α-归结对的广义文字
(4.1)若这样的子句不存在:
A.若m - 1 - k > 2,则删除前k + 1个子句,重置S。
a.C[i] = C[i + k + 1],i = 1 2 m - 2 - k;
b.C[i] = 0;
c.k = 0,转到第(1)步;
B.若m - 1 - k = 2,如果C[m - 1]与C[m - 2]是α-归结对,则子句集S是α-不可满足的,算法结束;
C.若m - 1 - k = 2,如果C[m - 1]与C[m - 2]不是α-归结对,则子句集S是α-可满足的,算法结束;
D.若m - 1 - k £ 1,则子句集S是α-可满足的,算法结束。
(4.2)若这样的子句有多个:
(4.2.1)选择这样的子句C[i]。
a.含有与C[k][p[k]]为α-归结对的广义文字;
b.C[i][ j]中的变量对于子句C[i]中的其他广义文字是独立的;
c.满足条件a和b的且含有复杂度最高的广义文字的子句;
d.满足条件a、b 和c 的最短的子句;
(4.2.2)否则,选择满足如下条件的子句C[i]:
a.含有与C[k][p[k]]为α-归结对的复杂度最高的广义文字;