真值表
实验目的
熟悉五个真值表,掌握真值表技术。
实验内容
定义1 设命题变元P1、P2、P3、…、Pn是出现在公式G中的所有命题变元,指定P1、P2、P3、…、Pn 的一组真值,则这组真值称为G的一个解释或指派,常记为I。
定义2 真值表:公式G在其所有可能的解释下所取真值的表。
本实验要求从键盘输入一个命题公式列出其真值表。用C语言或MATLAB实现。
实验步骤
- 采用C++编写代码,使用VC++6.0创建C++工程。
- 定义全局变量a、b,通过改变a、b的值来确定命题变元的所有指派的组合。
- 定义递归函数化简命题公式至只剩下两个命题变元和一个联结词或只有一个命题变元,判断其真值并返回。
- 主函数:从键盘输入命题公式,不断改变a、b的值为T或F来确定所有的真值指派并在每种情况下分别调用递归函数求解命题公式的真值,打印真值表。
实验源码
#include<iostream>
#include<string>
using namespace std;
char a,b;
char split(char* s);
int main()
{
char s[10];
cout<<"使用说明:"<<endl;
cout<<"1.仅支持含有两个变元的复合命题(分别用a、b表示)"<<endl;
cout<<"2.合取&、析取|、单条件*、双条件+、不支持否定"<<endl;
cout<<"输入复合命题时将联结词两端的子公式用()括起来,如:a&(b|(a*(b+a))"<<endl;
cout<<endl;
cout<<"请输入命题公式:";
cin>>s;
cout<<"真值表:"<<endl;
cout<<"a\tb\t"<<s<<endl;
a='T';b='T';
cout<<"T\tT\t"<<split(s)<<endl;
a='T';b='F';
cout<<"T\tF\t"<<split(s)<<endl;
a='F';b='T';
cout<<"F\tT\t"<<split(s)<<endl;
a='F';b='F';
cout<<"F\tF\t"<<split(s)<<endl;
return 0;
}
char split(char*s)
{
if(s[1]==0)
switch(s[0])
{
case 'a':return a;
case 'b':return b;
}
int i=0;
char l,r;
if(s[0]!='(')
{
switch(s[0])
{
case 'a':l=a;
break;
case 'b':l=b;
break;
}
i++;
}
else
{
i++;
char s1[10];
for(int j=0;s[i]!=')';j++,i++)
s1[j]=s[i];
l=split(s1);
cout<<l;
}
char t[10];
int j,k;
for(j=0,k=i+1;s[k]!=0;k++)
if(s[k]!='('&&s[k]!=')')
t[j++]=s[k];
t[j]=0;
r=split(t);
switch(s[i])
{
case '&':{
if(l=='T'&&r=='T')
return 'T';
else
return 'F';
}
case '|':{
if(l=='F'&&r=='F')
return 'F';
else
return 'T';
}
case '*':{
if(l=='T'&&r=='F')
return 'F';
else
return 'T';
}
case '+':{
if(l==r)
return 'T';
else
return 'F';
}
}
}
实验结果示例