离散数学 命题逻辑

求任意一个命题公式的真值表

#include 
#include 
#include 
#include 
#include 
#include 
using namespace std;
string R;int var[27]={0};int value[27]={0};int cnt=0;int two_p[27]={0};
queue<char> Q1;queue<char> Q2;queue<char> res;stack<char> S1; 
void back_res()
{
 while(!Q2.empty())
 {
  char ch=Q2.front();
  if(ch=='1'||ch=='0')
  {
   S1.push(ch);
   Q2.pop();
  }
  else if(ch=='&')
  {
   Q2.pop();char t=Q2.front();
   if(S1.top()=='1'&&t=='1')
   {
    S1.pop();S1.push('1');
   } 
   else
   {
    S1.pop();S1.push('0');
   }
   Q2.pop();
  }
  else if(ch=='|')
  {
   Q2.pop();char t=Q2.front();
   if(S1.top()=='0'&&t=='0')
   {
    S1.pop();S1.push('0');
   } 
   else
   {
    S1.pop();S1.push('1');
   }
   Q2.pop();
  }
  else if(ch=='>')
  {
   Q2.pop();char t=Q2.front();
   if(S1.top()=='1'&&t=='0')
   {
    S1.pop();S1.push('0');
   } 
   else
   {
    S1.pop();S1.push('1');
   }
   Q2.pop();
  }
  else if(ch=='=')
  {
   Q2.pop();char t=Q2.front();
   if(S1.top()=='1'&&t=='1')
   {
    S1.pop();S1.push('1');
   } 
   else if(S1.top()=='0'&&t=='0')
   {
    S1.pop();S1.push('1');
   }
   else
   {
    S1.pop();S1.push('0');
   }
   Q2.pop();
  }
 }
}
void erase_()
{
    while(!Q1.empty())
 {
     char ch=Q1.front();
     if(ch=='0'||ch=='1')
  {
   Q2.push(ch);
   Q1.pop();
  }
  else if(ch=='!')
        {
         Q1.pop();char t=Q1.front();
            if(t=='0')
            Q2.push('1');
            else
            Q2.push('0');
         Q1.pop();
  }
  else
  {
     Q2.push(Q1.front());
     Q1.pop();
  }
 }
   back_res();
}
void output_table()
{
 int i=0;
 while(i<R.size())
 {
        if('a'<=R[i]&&R[i]<='z')
  res.push(char(value[(int)R[i]-97+1]+'0'));
  else if(R[i]==')')
  {
    cout<<"括号不匹配!!!,查看是否丢失左括号"<<endl;
    exit(0); 
  } 
  else if(R[i]=='(')
  {
     bool flag=false;
     for(int j=i+1;j<R.size();j++)
     {
        if(R[j]==')')
        {
         flag=true;
         for(int l=i+1;l<j;l++)
         {
          if('a'<=R[l]&&R[l]<='z')
          Q1.push(char(value[(int)R[l]-97+1]+'0'));
          else
          Q1.push(R[l]);
    }
         erase_();
         res.push(S1.top());
         S1.pop();
         i=j;
         break;
     }
     }
     if(!flag)
     {
       cout<<"括号不匹配!!!,查看是否丢失右括号"<<endl;
       exit(0); 
     }
  }
  else
  res.push(R[i]); 
  i++;
 }
 while(!res.empty())
  {
     Q1.push(res.front());
     res.pop();
  }
 erase_();
 for(int i=1;i<=R.size()/2;i++)
 cout<<" ";
 cout<<S1.top()<<endl;
 S1.pop(); 
}
void cal()
{
   for(int i=0;i<R.size();i++)
      {
   if('a'<=R[i]&&R[i]<='z')
        {
         if('a'<=R[i+1]&&R[i+1]<='z')
         {
    cout<<"输入不规范!!! 变元 "<<R[i]<<" 和变元 "<<R[i+1]<<" 缺少逻辑符号"<<endl;
    exit(0);
      } 
      if(R[i+1]=='!'||R[i+1]=='(')
      {
        cout<<"输入不规范!!! 变元"<<R[i]<<"逻辑符号 "<<R[i+1]<<" 缺少逻辑符号"<<endl;
        exit(0);
   }
         var[int(R[i])-97+1]++;
   }
        else if(R[i]<'a'||R[i]>'z')
        {
         if(R[i]=='!'||R[i]=='>'||R[i]=='&'||R[i]=='|'||R[i]=='='||R[i]=='('||R[i]==')')
         continue;
         else
         {
           cout<<"输入中含有不规范字符"<<R[i]<<endl;
     exit(0); 
   }
   }
   }
   for(int i=1;i<=26;i++)
   if(var[i]>0)
   {
    cnt++;
    cout<<(char)(i+97-1)<<" ";
   }
   printf("\t");cout<<R<<endl;
}
void input()
{
 cin>>R;
}
void warning()
{
 cout<<"输入任意一个公式,程序将会输出此公式的真值表"<<endl;
 cout<<"注意:"<<endl;
 cout<<"1:程序中的变元只能输入小写字母!!!"<<endl;
 cout<<"2:程序中的运算符号表示:"<<endl;
 cout<<"   合取:&"<<endl;
 cout<<"   析取:|"<<endl;
 cout<<"   蕴含式:>"<<endl;
 cout<<"   等价式:="<<endl; 
 cout<<"   否定式:!"<<endl;
 cout<<"3:输入不能包含除上述外的字符,输入需符合逻辑规范!!!"<<endl; 
}
int main()
{
 warning();
 input();
 cal();int j=cnt;int num=pow(2,cnt);
 for(int i=1;i<=cnt;i++)
 cout<<"0"<<" ";
 printf("\t");
 output_table();
 for(int i=1;i<=num-1;)
 {
     if(two_p[j]==1)
  {
   two_p[j]=0;
   j--;
   continue;
  }
     else if(two_p[j]==0)
     {
      two_p[j]=1;int v=1;j=cnt;i++;
      for(int k=1;k<=26;k++)
      {
       if(var[k]>0)
                {
                  cout<<two_p[v]<<" ";
                  value[k]=two_p[v];
                  v++;
    }
   }
   printf("\t");
   output_table();
  }
 
 }
 return 0;
}

你可能感兴趣的:(离散数学,命题逻辑,离散数学)