一、程序通过编译,并实现两个命题的各种逻辑运算
二、任意输入字符串P和Q逻辑表达式的合法性检查
三、利用真值表方法验证他们的等价性
一、算法分析
① 求任意一个命题公式的真值表,,根据真值表验证他们的等价性
C语言算法:
首先是输入一个合理的式子,然后从式子中查找出变量的个数,开辟一个二进制函数,用来生成真值表,然后用函数运算,输出结果,并根据结果归类给范式,再根据范式验证等价性。
函数部分,主要是3个函数,一个为真值表递加函数,通过二进制的加法原理递进产生,一个为分级运算函数,这个函数是通过判断括号,选出最内级括号的内容执行运算函数,这样一级一级向外运算,最后得出最终结果,剩下一个为主运算函数,按照运算符号的优先级按顺序进行运算,如先将所有非运算运算完,再执行与运算。如此运算。
②
/**主运算函数**/
intMAP(char sz[N],char ccu[N],int icu[N],int h0)
{
int i, h = 0, j = 0, j1 = 0, j2 = 0, j3 = 0,j4 = 0, j5 = 0, i1, i2, p1 = -1, p2 = -1, s;
char dt[N];
s = strlen(sz);
if(s == 1)
if(sz[0] == -2) //判断是否是最后一项
return0;
else
return1; //1就是sz[0]的值、
else{
for(i = 0; i < s-j; i++) //先处理非
if(sz[i]== '!'){
for(i1 = 0; i1 < h0; i1++)
if(sz[i+1]== ccu[i1])//将变量赋值并给P1
p1 = icu[i1];
if(sz[i+1] == -2)//如果是前运算结果的0,则P1等于0
p1= 0;
if(p1 == -1)//如果是数字,直接给P1
p1= sz[i+1];
dt[j+2] = !p1;//非运算
sz[i] = j+2;
j++;
p1 = 0;
for(i1 = i+1; i1 < s-j; i1++)
sz[i1]= sz[i1+1];//将后续式子前移一项
}
p1= -1;
j1= j;
for(i = 0; i < s-j1-2*j2; i++) // 处理与
if(sz[i]== '&'){
for(i1 = 0; i1 < h0; i1++){
if(sz[i-1]== ccu[i1])//将变量赋值并给P1
p1 = icu[i1];
if(sz[i+1]== ccu[i1])//将变量赋值并给P2
p2 = icu[i1];
}
for(i2 = 2; i2 < j+2; i2++) {
if(sz[i-1] == i2) //如果为前计算结果,将结果赋值并给P1
p1 = dt[i2];
if(sz[i+1] == i2) //如果为前计算结果,将结果赋值并给P2
p2 = dt[i2];
}
if(sz[i-1] == -2)//如果是前运算结果的0,则P1等于0
p1 = 0;
if(sz[i+1] == -2)//如果是前运算结果的0,则P2等于0
p2 = 0;
if(p1 == -1) //如果是数字,直接给P1
p1 = (int)(sz[i-1]);
if(p2 ==-1)//如果是数字,直接给P2
p2 = (int)(sz[i+1]);
dt[j+2] = p1 && p2;//与运算
sz[i-1] = j+2;
j++;
j2++;
p1 = -1;
p2 = -1;
for(i1 = i; i1 < s-j1-2*j2; i1++)//将后续式子前移两项
sz[i1] = sz[i1+2];
i = i-1;
}
for(i = 0; i < s-j1-2*j2-2*j3; i++) // 处理或。
if(sz[i] == '|'){
for(i1 = 0; i1 < h0; i1++){
if(sz[i-1] == ccu[i1])//将变量赋值并给P1
p1 = icu[i1];
if(sz[i+1] == ccu[i1])//将变量赋值并给P2
p2 = icu[i1];
}
for(i2=2;i2<j+2;i2++) {
if(sz[i-1] == i2) //如果为前计算结果,将结果赋值并给P1
p1 = dt[i2];
if(sz[i+1] == i2)//如果为前计算结果,将结果赋值并给P2
p2 = dt[i2];
}
if(sz[i-1] == -2)//如果是前运算结果的0,则P1等于0
p1 = 0;
if(sz[i+1] == -2)//如果是前运算结果的0,则P2等于0
p2 = 0;
if(p1 == -1)//如果是数字,直接给P1
p1 = sz[i-1];
if(p2 == -1)//如果是数字,直接给P2
p2 = sz[i+1];
dt[j+2] = p1 || p2;//或运算
sz[i-1] = j+2;
j++;
j3++;
p1 = -1;
p2 = -1;
for(i1 = i; i1 < s-j1-2*j2-2*j3;i1++)//将后续式子前移两项
sz[i1]=sz[i1+2];
i--;
}
for(i = 0; i < s-j1-2*j2-2*j3-2*j4;i++) // 处理蕴含。
if(sz[i] == '^'){
for(i1 = 0; i1 < h0; i1++){
if(sz[i-1] == ccu[i1])//将变量赋值并给P1
p1 = icu[i1];
if(sz[i+1] == ccu[i1])//将变量赋值并给P2
p2 = icu[i1];
}
for(i2 = 2; i2 < j+2; i2++) {
if(sz[i-1] == i2) //如果为前计算结果,将结果赋值并给P1
p1 = dt[i2];