类似于表达式求值,但是更加简单,仅仅是进行逻辑运算而已,其中非的优先级最高,其他的运算优先级都一样。同时要有一点是要进行枚举,一共p,q,r,s,t 5个
变量,分别取0,1则有2^5种情况,分别运算 ,若全为真,则记为永真式。
#include<iostream>
#include<string>
#include<stack>
using namespace std;
bool Judge(int p,int q,int r,int s,int t,string st)
{
stack<int> s_num;
int buff_1,buff_2;
string::size_type n = st.size();
for(n=n-1;n!=-1;n--)
{
if(st[n]<='t'&&st[n]>='p')
{
switch(st[n])
{
case 't':s_num.push(t);continue;
case 's':s_num.push(s);continue;
case 'r':s_num.push(r);continue;
case 'q':s_num.push(q);continue;
case 'p':s_num.push(p);continue;
}
}
else
{
if(st[n]=='N')
{
buff_1 = s_num.top();s_num.pop();
s_num.push(!buff_1);
}
else if(st[n]=='A')
{
buff_1 = s_num.top();s_num.pop();
buff_2 = s_num.top();s_num.pop();
s_num.push(buff_2||buff_1);
}
else if(st[n]=='K')
{
buff_1 = s_num.top();s_num.pop();
buff_2 = s_num.top();s_num.pop();
s_num.push(buff_2&&buff_1);
}
else if(st[n]=='E')
{
buff_1 = s_num.top();s_num.pop();
buff_2 = s_num.top();s_num.pop();
s_num.push(buff_2==buff_1);
}
else
{
buff_1 = s_num.top();s_num.pop();
buff_2 = s_num.top();s_num.pop();
s_num.push((!buff_1)||buff_2);
}
}
}
//cout<<s_num.top()<<endl;
if(!s_num.top())
return false;
return true;
}
int main()
{
string st;
while(cin>>st)
{
string::size_type i = 0;
if(st[i]=='0')
break;
int p(0),q(0),r(0),s(0),t(0),flag(0);
for(p=0;p!=2;p++)
{
for(q=0;q!=2;q++)
{
for(r=0;r!=2;r++)
{
for(s=0;s!=2;s++)
{
for(t=0;t!=2;t++)
{
if(!Judge(p,q,r,s,t,st))
{
flag=1;
}
}
if(flag==1)
break;
}
if(flag==1)
break;
}
if(flag==1)
break;
}
if(flag==1)
break;
}
if(flag==1)
cout<<"not"<<endl;
else
cout<<"tautology"<<endl;
}
return 0;
}