有算法求程序(逻辑运算的)
算法的预处理
为便于计算机程序的编制,提高归结的速度,我们首先对子句集S进行如下的预处理:
1、对于输入的子句集进行三种规则(单文字规则、纯文字规则和Tautology规则)的删除策略,得到子句集S。
实际上,本算法只需进行Tautology规则即可。
2、对S中n个不同的原子进行编码,用[1,n]中整数来表示这些原子,用[-n,-1]中的整数来表示这些原子的否定。从而任何一个文字都可用[-n,n]上的一个整数来表示。
3、我们定义一个二维数组sen[m][n]来存放子句集S,sen[i-1]表示子句Ci,i=1, …,m。如:sen[0]表示子句C1,sen[1]表示子句C2等。在下面的叙述中,我们不再区分sen[i-1]与Ci;Sen[i]中的第j个文字称作sen[i][j]。
这样,我们判断两个文字是否互补对,只需计算这两个数字是否互为非零相反数即可。
4、定义一个一维数组num[m],num[i]表示子句sen[i]中的有效文字个数。
5、对sen[i]中的文字进行按绝对值大小进行排序, i=1,…,m。
由定理4知,5步的处理是合法的。
6、定义一个一维数组route[m],并置其初值为0。route记录当前查找的前k元子路径,k表示route的有效长度。置k的初值为0。
7、定义一个一维数组c[m],并置其初值为0,用于记录子句中当前查找位置。
例如:若route[i]=sen[i][j],则c[i]=j。
8、定义一个k,初值为0,用于标记当前子句位置。
4 自动推理算法及其程序设计步骤
第0步:从S中选定sen[0]。
在S中找一个文字最少的子句sen[i](如果多于一个,选择下标i最小的),如果i≠0,则将子句sen[0]和sen[i]对调。
令k=0;c[0]=0;
第1步:选定sen[k+1]。
1、执行:route[k]=sen[k][c[k]];对任意m>i>k,route[i]=0。
2、在后(m-1-k)个子句中选择与子路径route有互补对的子句。
说明:在本文中子路径route是指{route[0],…, route[k]},当前路径是指{route[0],…, route[k],c[k+1]}。
(1)若这样的子句不存在:
a.若(m-1-k)>2则删除前k+1个子句,重置S:
①sen[i]=sen[i+k+1],num[i]=num[i+k+1],i=0,1, …,m-2-k
②sen[j]=0,i=k+1,…,m-1
③route=0;k=0;转第0步。
b.若(m-1-k)=2,如果sen[m-1]和sen[m-2]是互补对,则子句集S不可满足。程序结束;
c. 若(m-1-k)=2,如果sen[m-1]和sen[m-2]不是互补对,则子句集S可满足。程序结束;
否则子句集S可满足。程序结束。
d.若(m-1-k)≤1,则子句集S可满足。程序结束。
自动推理第四章的一个算法,谁给帮忙给个源程序?