这道题目初看很难懂,题意的关键是:WFF这种串五种自变量,分别为:p,q,r,s,t;并且为逻辑运算符(也即只能取0或1)有五中运算符,分别为:K,A,N,C,E,运算符的性质用表给出了,现在在WFF串的基础上再定义一个tautology,要求对于WFF中自变量的任意组合,都有表达式的值为1(true);否则不是输出not.那么关键点就是如何运算了,其实就是从右到左遇到运算符就运算,并将结果保留下来,以备下一次运算,换句话说就是运算优先级相等的一组运算符,它们的结合方向为从右到左,且不带括号。那么就可以用模拟得方法进行解题了。用一个数组存放WFF,然后用模拟的方法进行运算判断最终的结果为true或false,从而得出tautology或not,注意要枚举所有可能的组合的处理(利用了五个变量的特征进行枚举共有2^5中可能)和如何解决运算的,下面是代码:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define Max 100
bool trag;
char s[Max+1];
bool Is_right(char *p,int n){
int i,j,index;
for(i=n-2;i>=0;i--){
switch(p[i])
{
case 'N':
switch(p[i+1])
{
case '1':
p[i]='0';
index=i+1;
for(j=i+2;j<n;j++)
p[index++]=p[j];
break;
case '0':
p[i]='1';
index=i+1;
for(j=i+2;j<n;j++)
p[index++]=p[j];
break;
}
break;
case 'K':
if(p[i+1]=='1' && p[i+2]=='1'){
p[i]='1';
index=i+1;
for(j=i+3;j<n;j++)
p[index++]=p[j];
}
else{
p[i]='0';
index=i+1;
for(j=i+3;j<n;j++)
p[index++]=p[j];
}
break;
case 'A':
if(p[i+1]=='0' && p[i+2]=='0'){
p[i]='0';
index=i+1;
for(j=i+3;j<n;j++)
p[index++]=p[j];
}
else{
p[i]='1';
index=i+1;
for(j=i+3;j<n;j++)
p[index++]=p[j];
}
break;
case 'C':
if(p[i+1]=='1' && p[i+2]=='0'){
p[i]='0';
index=i+1;
for(j=i+3;j<n;j++)
p[index++]=p[j];
}
else{
p[i]='1';
index=i+1;
for(j=i+3;j<n;j++)
p[index++]=p[j];
}
break;
case 'E':
if(p[i+1]==p[i+2]){
p[i]='1';
index=i+1;
for(j=i+3;j<n;j++)
p[index++]=p[j];
}
else{
p[i]='0';
index=i+1;
for(j=i+3;j<n;j++)
p[index++]=p[j];
}
break;
}
}
if(p[0]=='0')
return false;
else
return true;
}
int main()
{
while(scanf("%s",s)!=EOF){
if(strcmp(s,"0")==0)
break;
int i,j,k,a,b,c,n=strlen(s);
trag=true;
for(i=0;i<2;i++){
if(!trag)
break;
for(j=0;j<2;j++){
if(!trag)
break;
for(k=0;k<2;k++){
if(!trag)
break;
for(a=0;a<2;a++){
if(!trag)
break;
for(b=0;b<2;b++){
char temp[Max+1];
for(c=0;c<=n;c++){
temp[c]=s[c];
if(temp[c]=='p')
temp[c]=i+'0';
else if(temp[c]=='q')
temp[c]=j+'0';
else if(temp[c]=='r')
temp[c]=k+'0';
else if(temp[c]=='s')
temp[c]=a+'0';
else if(temp[c]=='t')
temp[c]=b+'0';
}
if(!Is_right(temp,n)){
trag=false;
break;
}
}
}
}
}
}
if(!trag)
printf("not\n");
else
printf("tautology\n");
}
return 0;
}