#include<cctype>
#include<cmath>
char compare[8][8]={{" |&~()#"},{"|><<<>>"},{"&>><<>>"},{"~>><<>>"},{"(<<<<= "},{")>>>>>"},{"#<<<<="}}
char precede(char x,char y)
char calculator(char biao[])
char precede(char x,char y)
char operate_1(char x)
char operate_2(char x,char y,char thera)
void replace(char x,char c[],char y)
void panduan(char c[])
bool is_hefa(char c[])
int main()
{
char c[80]={'\0'},ch
int flag
do
{
flag=0
do{
flag=0
cout<<"亮态Please input the expression to judge:\n"
cin>>c
if(!is_hefa(c))
{
flag=1
cout<<"The expression is not valid, please input again \n"
}
}while(flag)
panduan(c)
cout<<"do you want to continue(y/n)?\n"
cin>>ch
}while(ch=='y'||ch=='Y')
return 0
}
char calculator(char biao[])
{
char result,thera,a,b,c
char *optr=new char[80]
char *opnd=new char[80]
char *temp=new char[80]
int r=0,d=0
for (int i=0biao[i]!='\0'i++)
temp[i]=biao[i]
temp[i]='#'
temp[i+1]='\0'
optr[r++]='#'
i=0
c=temp[i++]
while(c!='#'||optr[r-1]!='#')
{
if(c=='0'||c=='1'段键带) { opnd[d++]=cc=temp[i++]}
else
switch(precede(optr[r-1],c))
{
case '<':
optr[r++]=c
c=temp[i++]
break
case '=':
r--
c=temp[i++]
break
case '>':
thera=optr[--r]
if(thera=='~')
{ a=opnd[--d]
result=operate_1(a)
}
else
{ a=opnd[--d]
b=opnd[--d]
result=operate_2(a,b,thera)
}
opnd[d++]=result
}
}
result=opnd[0]
delete [] temp
delete [] optr
delete [] opnd
return result
}
char precede(char x,char y)
{
int i=0,j=0
for (i=0i<8i++)
if(compare[i][0]==x)
break
for (j=0j<8j++)
if(compare[0][j]==y)
break
return compare[i][j]
}
char operate_1(char x)
{
return (x>'0'?'0':'1')
}
char operate_2(char x,char y,char thera)
{
if(thera=='&')
{
if(x=='0'||y=='0')
return '0'
else
return '1'
}
else {
if(x=='1'握芦||y=='1')
return '1'
else
return '0'
}
}
void replace(char x,char c[],char y)
{
for(int i=0c[i]!='\0'i++)
if(c[i]==x)
c[i]=y
}
void panduan(char c[])
{
char temp[80]={'\0'}
char alpha[27]={'\0'}
int record[26]={0},n=0,k,r,m,j
for(int i=0c[i]!='\0'i++)
{
if(isalpha(c[i])&&record[c[i]-'A']==0)
{
alpha[n++]=c[i]
record[c[i]-'A']=1
}
}
char *rec=new char[n+1]
char flag='0'
int record_change=0,bi=0
int limit=(int)pow(2,n)
for( i=0i<limiti++)
{
for(k=0c[k]!='\0'k++)
temp[k]=c[k]
temp[k]='\0'
for(k=0k<nk++)
rec[k]='0'
j=i
m=n
while(j!=0)
{
r=j%2
j=j/2
rec[--m]=char(r+'0')
}
for(m=0m<nm++)
{
replace(alpha[m],temp,rec[m])
}
if(calculator(temp)!=flag)
{
if(i==0)
bi=1
record_change++
flag=(flag>'0'?'0':'1')
}
}
if(record_change==0)
{
cout<<"False forever\n"<<endl
}
else
if(record_change==1&&bi==1)
{
cout<<"True forever\n"<<endl
}
else
{
cout<<"Satisfactible "<<c<<endl
for(k=0c[k]!='\0'k++)
temp[k]=c[k]
temp[k]='\0'
cout<<"Please input in the value of the variable one by one\n"
for(m=0m<nm++)
{
cin>>rec[m]
replace(alpha[m],temp,rec[m])
}
cout<<"the result is\n"<<calculator(temp)<<endl
}
delete [] rec
}
bool is_hefa(char c[])
{
char *p=c,temp[80]={'\0'}
int i=0,n=0,m=0,k=0
while(p[i])
{
if (!(isalpha(p[i])||p[i]=='('||p[i]==')'||p[i]=='|'||p[i]=='&'||p[i]=='~'||p[i]==' '))
return false
if(p[i]!=' ')
temp[n++]=p[i]
i++
}
for (i=0i<ni++)
c[i]=temp[i]
c[i]='\0'
for (i=0i<ni++)
{
if(c[i]=='(')
k++
if(c[i]==')')
k--
}
if (k!=0)
return false
return true
}
要看这个程序做到什么程度。如果要简单地让计算机来判定一个命题是否是重言式,C++自身就提供了且,或,非的运算符。对任一个n元命题,借助于替代规则,只需考虑那些只出现命题变元的式子即可。
先森知梁将命题翻译成C++形式,然后定义n个bool型变量,n重循环来判定就可以。
但那样的程序,何苦去写?偶也正好在学数理逻辑,我认为应该此运要实现一个任意输入一个命题形式,程序便可以自动打印出真值表,并且能做出是否是重言式,矛猛坦盾式的判断。也就是说对命题的翻译工作也交由程序来做,让它来分析命题的结构。这个我也在想如何实现,可能要费上一点功夫。想到了再来。
用归谬赋值法做。(只有蕴涵式,就是充分条件、必要条件、充要条件这样的式子才能用这个方法)。第一步:假设这个运算为假,就在最后一步运算下,就是那个箭头下面写F(代表真值为假)。第二步:这个运算为假,根据充分条件假言直言推理的真值表山告可知,只有当前面为真、后面为假时,此运算逗氏明的真值才为假,因此,在表示“或”的符号下写T(代表真值为真),在式子后面的p下面写F(代表真值为假)。第三步:q可能真、可能假,如果Q真,式子成立,没有出现赋值矛盾,因此该式不是核宽重言式。(如果出现赋值矛盾就是重言式,反之则不是)亲,你的这个式子不是很典型.......欢迎分享,转载请注明来源:内存溢出
评论列表(0条)