真值表判断
- 格式:docx
- 大小:33.89 KB
- 文档页数:10
用真值表法判断命题公式真值表法是一种用于判断命题公式的方法,它通过列出所有可能的真值赋值并逐一计算公式的真值,最终确定命题公式的真值。
以下是关于真值表法的详细解释,包括其原理、步骤以及示例。
真值表法的原理是基于命题逻辑的基本概念,其中命题是指一个陈述句,它要么是真的,要么是假的。
命题公式由命题符号和逻辑联结词(如与、或、非)组成,它们用于组合和连接命题。
真值表表示了所有可能的命题符号的真值赋值及相应的公式的真值。
使用真值表法可以判断一个命题公式的真值取值,即真或假。
在这个过程中,根据命题公式中的命题符号的真值赋值情况,计算每个子公式的真值,并最终确定整个公式的真值。
步骤如下:1.计算公式中的命题符号的个数:记为N。
2.构建一个包含N列的真值表,每一列代表一个命题变量的真值。
3.确定真值表的行数:由于每个命题符号都有两个可能的真值(真或假),所以真值表的行数为2^N。
4.从第一行开始填充真值表,对每个命题变量进行真值赋值。
5.按照公式中的逻辑联结词逐一计算子公式的真值。
6.逐行填充真值表,计算整个命题公式的真值。
7.最后一列中的真值即为整个命题公式的真值。
以下是一个示例,以说明真值表法的具体步骤。
考虑以下命题公式:(p∨q)→r,其中p、q和r是命题变量。
1.计算命题符号的个数:N=32.构建一个包含3列的真值表,每一列分别代表p、q和r的真值。
3.由于有3个命题变量,所以真值表共有2^3=8行。
4.从第一行开始填充真值表:p,q,r---,---,---T,T,TT,T,FT,F,TT,F,FF,T,TF,T,FF,F,TF,F,F5.按照公式中的逻辑联结词计算子公式的真值,首先计算(p∨q)的真值:p,q,p∨q---,---,------T,T,TT,F,TF,T,TF,F,F6.然后计算整个命题公式的真值(r→(p∨q)):p,q,r,p∨q,r→(p∨q)---,---,---,------,----------T,T,T,T,TT,T,F,T,TT,F,T,T,TT,F,F,T,TF,T,T,T,TF,T,F,T,TF,F,T,F,FF,F,F,F,T7.最后一列中的真值即为整个命题公式的真值。
判断推理真假推理公式
推理是指根据已知的前提或假设得出结论的过程。
在逻辑学中,有一些推理公式可以帮助我们判断推理的真假。
其中,蕴涵(implication)是一个重要的推理形式。
蕴涵是指如果P成立,则
Q也成立,用符号表示为P→Q。
在这个公式中,P是前提,Q是结论。
如果P成立,则Q也必须成立。
这个公式的真假可以通过真值表来
判断。
真值表是一个列出了所有可能情况下P和Q取值的表格,通
过对比前提和结论的真假,我们可以判断蕴涵式的真假。
另一个重要的推理公式是假言推理(modus ponens)。
假言推
理是指如果P成立,并且P→Q成立,那么Q也成立。
这个公式可以
用来判断一个推理是否成立。
我们可以通过观察P和P→Q是否同时
成立来判断假言推理的真假。
此外,还有一些其他的推理形式,如假言三段论、假言假言推
理等,它们都有各自的判断方法和条件。
在判断推理的真假时,我
们需要仔细观察前提和结论之间的关系,以及它们在逻辑上的连贯
性和一致性。
同时,也需要注意逻辑推理中可能存在的偏差和谬误,如非典型例子、无中生有等,以免影响判断的准确性。
总的来说,判断推理的真假需要运用逻辑学中的推理公式和方法,仔细观察前提和结论之间的关系,并排除可能存在的偏差和谬误,以确保判断的准确性和严谨性。
3、利用真值表判断公式((⌝P∨Q)∧(Q→R))→⌝(P∧⌝R)是否为重言式。
解:
由真值表得:((⌝P∨Q)∧(Q→R))→⌝(P∧⌝R)在它的各种赋值下取值不全为真。
故((⌝P∨Q)∧(Q→R))→⌝(P∧⌝R)不是重言式。
6、构造下列推理的证明:
只要A曾到过受害者房间并且11点以前没离开,A就犯了谋杀罪。
A曾到过受害者房间,如果在11点以前离开,看门人会看见他。
看门人没看见他,所以A犯了谋杀罪。
解:令P:A曾到过受害者房间;Q:11点以前离开;
R :看门人看见了A ; S :A 犯了谋杀罪; 前提:P R Q S Q P ,,→→⌝∧ 结论:⌝R →S 证明:(1)P
前提引入 (2)P ∧⌝Q →S 前提引入 (3)Q ∨S (1)(2)析取三段论 (4)⌝Q 附加前提引入 (5)S
(3)(4)析取三段论 (6)⌝R →S
(5)附加
7、构造下列推理的证明:
如果小张和小明,去看电影,则小李也去看电影。
小赵不去看电影或小张去看电影,小王去看电影。
所以,当小赵去看电影时,小李也去。
解:令P :小张去看电影; Q :小王去看电影; R :小李去看电影;
S :小赵去看电影;
前提:P ∧Q →R ,⌝S ∧P ,Q 结论:S →R 证明:(1)Q 前提引入 (2)P ∧Q →R 前提引入
(3)P →R (1)(2)析取三段论
(4)⌝S ∧P
前提引入
(5)S R (3)(4)假言三段论。
逻辑命题的真值表在逻辑学的广袤天地中,真值表宛如一座精确的导航仪,为我们揭示逻辑命题之间的内在关系和真假取值。
对于那些初次接触这一概念的朋友来说,它可能稍显神秘,但实际上,真值表是一种极其有用且直观的工具。
那么,什么是逻辑命题呢?简单来说,逻辑命题就是能够判断真假的陈述句。
比如“今天是晴天”“1 + 1 =2”等等。
而真值表呢,则是用来展示在不同情况下这些命题的真假情况。
我们先来看看最基本的逻辑连接词:“与”(通常用“∧”表示)、“或”(通常用“∨”表示)、“非”(通常用“¬”表示)。
先说说“与”运算。
当两个命题都为真时,“与”运算的结果才为真;只要其中有一个命题为假,结果就是假。
举个例子,命题 P 是“今天下雨”,命题 Q 是“气温低于 20 度”。
如果今天既下雨了,气温又低于 20 度,那么 P ∧ Q 就是真的;要是今天没下雨,或者气温高于 20 度,又或者两者都不满足,那么 P ∧ Q 就是假的。
再看“或”运算。
只要两个命题中有一个为真,“或”运算的结果就为真;只有当两个命题都为假时,结果才是假。
比如命题 M 是“我吃了苹果”,命题 N 是“我吃了香蕉”。
只要我吃了苹果或者香蕉,或者两者都吃了,M ∨ N 就是真的;只有我既没吃苹果也没吃香蕉时,M ∨ N 才是假的。
“非”运算相对简单,它是对一个命题的否定。
如果命题 A 为真,那么¬A 就为假;反之,如果命题 A 为假,¬A 就为真。
比如说命题 A 是“月亮是圆的”,因为这是真的,所以¬A 即“月亮不是圆的”就是假的。
接下来,我们通过真值表来更清晰地展示这些逻辑运算。
对于“与”运算(P ∧ Q),我们列出 P 和 Q 所有可能的真假组合:当 P 为真,Q 为真时,P ∧ Q 为真;当 P 为真,Q 为假时,P ∧ Q 为假;当 P 为假,Q 为真时,P ∧ Q 为假;当 P 为假,Q 为假时,P ∧ Q 为假。
课外实验1 真值表判断实验指导书适用专业:计算机科学与技术专业、网络工程、软件工程实验类型:课后实验实验时数:4学时实验目的复合命题是由原子命题、逻辑联结词、括号组成的符号串,而原子命题是一个抽象的概念,若不指定原子命题的真值,则复合命题没有真值可言。
反之,若对所有的原子命题都指定一定的真值,则复合命题就变成了一个具有确切真值的命题。
将所有的这些原子命题的可能取值一一列出形成一个表格的形式,这个表格称为该复合命题的真值表。
利用真值表技术和命题等价变换方法,能够求得一复合命题对应的析取范式(或合取范式),还能够判断两个复合命题是否相等,是否为重言式、矛盾式、可能式。
内容要求设是原子命题P1、P2、P3、…、Pn是出现在复合命题G中的所有原子命题,指定P1、P2、P3、…、Pn一组真值,则这组真值称为G的一个赋值(可记为I)。
因此,设G是一个复合命题,I是G的一个赋值,显然,G在I下有真值。
由于每一个复合命题可能存在着不止一种赋值,这种赋值的个数与公式中的原子命题的个数有关。
对每一个原子命题都有“真”、“假”两种不同的赋值,若有两个原子命题,按组合的方法,应有四种不同的赋值。
一般来说,若有n个原子命题,则应有2n个不同的赋值。
为了能直观地表示一个复合命题所有可能的赋值与复合命题在此赋值下的结果,可定义:复合命题G在其所有可能的赋值下所取真值的表,称为G的真值表(Truth Table)。
本实验要求大家利用C++语言,实现任意输入复合命题的真值表计算。
一般我们将复合命题中的原子命题放在真值表的左边,将复合命题的结果放在真值表的右边。
有时为了清楚起见,也可将求复合命题的中间结果也依次放在真值表中;或者将求复合命题的中间结果放在复合命题的相应的每个联结词的下方。
有时也可将具有相同原子命题个数的复合命题之真值结果依次放在同一个真值表中。
显然,对任何一复合命题都有一真值表。
实验方式本实验开设方式为个人实验;实验思考1、利用真值表技术和命题等价转换方法,如何求得复合命题对应的析取范式(或合取范式),如何判断复合命题是否等价,是否为永真式、永假式、可满足式?参考实验报告。
真值表名词解释真值表是计算机科学中一种常用的表示方式,它可以把布尔值(true / false值)组织起来,用于表示一系列条件执行运算或函数的输出结果。
例如,真值表可以用于描述两个布尔值之间的关系,以及这些值如何影响数学或逻辑运算。
真值表把一个逻辑表达式的真假性提供为一个表格,用于显示不同的输入和输出之间的关系。
例如,比较表达式A > B的真假性可以用真值表来表示。
其中,A和B分别代表不同的数值,而true和false 分别表示表达式的最终结果,即A是否大于B。
括号里放置的字母代表某项布尔表达式的可能情况,即比较表达式A > B的可能值。
比较项A和B的真假性随着比较变量的实际值而变化,并且以相应的全真表格形式进行表达。
一个真值表通常由一行表头,一个或多个行组成,其中包括布尔表达式的参数名。
每个参数都有它自己的列,这对真假性的测试提供了完整的信息。
每一行都代表一个参数的值自身,例如,A = 1,B = 1; A = 0,B = 1等,而每行最后一列都是布尔表达式的最终结果。
同时,真值表也被用于表示由多个布尔运算组成的表达式的真假性。
它们可以用来判断复杂的表达式的真假性,也可以用来判断自定义函数的真假性。
在这种情况下,真值表的结构可能更加复杂,它可能会包括两行表头,一行数值输入和一行布尔表达式的结果。
为了更好地理解复杂表达式的真假性,可以通过真值表来绘制出真值图,从而帮助解决表达式输出结果的问题。
以上是对真值表名词的解释,它是一种用于表达逻辑表达式的真假性的常用表示方式,它可以用来表示简单布尔运算的真假性,也可以用来表示复杂的表达式的真假性,并且可以由它来绘制出真值图,从而帮助解决表达式输出结果的问题。
下面将对真值表的相关概念和应用进行更加深入的说明。
关于真值表,首先要了解它的概念,真值表是一种用来描述布尔逻辑表达式的真假性的表示方式,通过它可以表达简单以及复杂表达式的真假性,并且可以由它来绘制出真值图,从而帮助解决表达式输出结果的问题。
源代码:# include <stdio.h># include <ctype.h># include <string.h># include <stdlib.h># include <math.h># define MAXSIZE 100typedef char elemtype;typedef struct{/*定义栈结构*/elemtype data[MAXSIZE];/*定义栈的大小*/int top;/*定义栈的指针*/}sqstack;void init_sqsqstack(sqstack*S){/*初始化栈*/S->top = -1;/*栈底定义为-1,用来判断是否为空*/}int empty_sqstack(sqstack*S){/*判断栈是否为空*/if (S->top==-1)/*栈指针值为-1,则栈是为空并返回1*/return 1;elsereturn 0;/*栈指针值不为-1,则栈不为空,此时返回0*/ }void push_sqstack(sqstack*S,elemtype x){/*入栈,当栈满时提示*/if (S->top==MAXSIZE-1)/*栈指针值为最大值(MAXSIZE)-1,则栈已经满,此时提示无法执行入栈*/ {printf("出现错误!");return;}else/*否则可以执行入栈操作*/S->data[++(S->top)]=x;}void pop_sqstack(sqstack *S,elemtype *x){/*出栈,当栈满时提示*/if(S->top==-1)/*判断栈是否为空,为空则提示*/{ printf("出现错误!");return;}else{/*栈不为空,读取栈的内容,并使指针移向下一个*/*x = S->data[S->top];S->top--;}}void top_sqstack(sqstack*S,elemtype*x){/*读取栈中的内容,但不移动指针*/if(S->top==-1)/*判断栈是否为空,为空则提示*/{printf("出现错误!");return;}else/*栈不为空,读取栈的内容,但指针移不移动*/*x = S->data[S->top];}int pre(char op){/*定义不同优先级*/switch (op){case'>':case'=':return 1; break;case'|':return 2; break;/*‘>’‘=’“|”“&”“~”优先级依次升高*/case'&':return 3; break;case'~':return 4; break;case'(':case'#':default:return 0; break;/*其他符号只用返回‘0’即可。
有用时可以用来判断*/ }}void transform(char suffix[],char exp[]){/*将数字中缀表达式exp转换为后缀表达式suffix*/sqstack S;/*新定义一个栈*/char ch;int i=0,j=0;/*定义相关使用参量*/init_sqsqstack(&S);/*初始化这个栈*/push_sqstack(&S, '#');/*在栈低放入‘#’来判断栈是否没有其他东西*/while(exp[i]!='\0'){/*扫描exp 只要不是空就继续执行*/ch = exp[i];/*将字符放在ch中,以方便以后使用*/switch(ch){/*检验数组中的字符*/case'(':push_sqstack(&S,exp[i]);i++;break;/*当字符为‘(’时,直接将其压入栈中*/case')':while(S.data[S.top]!='('){/*当字符为‘)’时,将栈中所有字符全部出栈并放入suffix中,直到遇到'('*/pop_sqstack(&S,&ch);suffix[j++] = ch;}pop_sqstack(&S,&ch);/*将最后一个'('的空间释放*/i++;/*寻找下一个*/break;/*跳出这次匹配*/case'|':case'&':case'~':case'=':case'>':while(pre(S.data[S.top])>=pre(exp[i])){/*当字符为'|','&','~'时,判断其优先级。
当前运算符大于当栈中的优先级时执行以下*/pop_sqstack(&S,&ch);/*当条件成立时,接将其出栈与现有字符交换*/suffix[j++] = ch;}push_sqstack(&S,exp[i]);i++;/*寻找下一个*/break;/*跳出这次匹配*/default:while(isdigit(exp[i])){/*其他情况如果是数字的话直接放入suffix中*/suffix[j++] = exp[i];i++;/*寻找下一个*/}}}while(S.data[S.top]!='#'){/*最后将栈中剩余的放入suffix中*/pop_sqstack(&S,&ch);suffix[j++] = ch;}suffix[j]='\0';/*以字符结束符结束字符串suffix*/}int calculate_exp(char exp[]){/*计算一个后缀表达式的值*/sqstack S;/*新定义一个栈*/int i=0;char x,x1,x2;/*定义相关使用参量*/init_sqsqstack(&S);/*初始化这个栈*/while(exp[i]!='\0'){/*扫描exp 只要不是空就继续执行*/switch(exp[i]) {//对字符串从头扫描case'|'://当字符为'|'时,计算pop_sqstack(&S,&x2);pop_sqstack(&S,&x1);//取栈中的两个数据分别放在x1,x2中x = (x1-'0')||(x2-'0');// 将字符转化为整型数并进行相关计算push_sqstack(&S,(x+'0'));// 将计算结果转化为字符并压入字符串中i++;break;//跳出寻找下一次case'=':pop_sqstack(&S,&x2);pop_sqstack(&S,&x1);x = (x1==x2);push_sqstack(&S,(x+'0'));i++;break;case'>':pop_sqstack(&S,&x2);pop_sqstack(&S,&x1);x = !(x1-'0')||(x2-'0');push_sqstack(&S,(x+'0'));i++;break;case'&':pop_sqstack(&S,&x2);pop_sqstack(&S,&x1);x = (x1-'0')&&(x2-'0');push_sqstack(&S,(x+'0'));i++;break;case'~':pop_sqstack(&S,&x1);x = !(x1-'0');push_sqstack(&S,(x+'0'));i++;break;//基本同上default://对于是数字直接入栈while(exp[i]=='0'||exp[i]=='1'){push_sqstack(&S,exp[i]);i++;}}}if(!empty_sqstack(&S)){//判断栈是否为空,若为空则提示表达是错误,否则输出答案pop_sqstack(&S,&x);if(empty_sqstack(&S))return (int)(x-'0');elsereturn 5;}else return 1;}got(char s2[],char s1[]){/*提取出一个表达式中的字母,及其数目。
以便以后运算使用*/ int i = 0,k,j=0;while(s1[i]!='\0'){if((s1[i]>='A')&&(s1[i]<='Z'||s1[i]>='a')&&(s1[i]<='z')){for(k=0;k<j;k++){if (s1[i]==s2[k])break;}if (k==j)s2[j++] = s1[i];i++;}else if((s1[i]=='|')||(s1[i]=='&')||(s1[i]=='~')||(s1[i]=='=')||(s1[i]=='>')||(s1[i]=='(')||(s1[i]==')'))i++;elsereturn 0;}s2[j]='\0';return j;}void digit(int n,char s1[],char s2[] ){/*将一个字母表达式中的字母用对应于n的数字代替*/int i,j,num[30];for(i=0;i<(int)strlen(s1);i++){num[i] = (n/(int)pow(2,i)%2);}i=0;while(s2[i]!='\0'){for(j=0;j<(int)strlen(s1);j++){if (s2[i]==s1[j])s2[i] = num[j] + '0';}i++;}}void truetable(){/*求真值表函数*/char s1[30],s2[30],s3[30],s4[30];int n,i,j,k,m;//定义使用变量printf("您要计算真值表!\n");printf("***************** 输入要计算的表达式(A~Z,a~z) ****""************ \n");printf("(其中'&'代表与'|'代表或'~'代表非'>'代表单条件""'='代表双条件)\n");//界面部分gets(s4);printf(" \n您输入要计算的表达式为:%s \n",s4);n=got(s1, s4);if(!n){printf("输入有误!\n");return;}//容错部分m = (int)pow(2,n);//该参数printf("计算真值表如下:\n");for(j=0;j<(int)strlen(s1);j++){//将j依次输入并变成相应二进制数,将对应位替换计算式中字母printf("%c ",s1[j]);}printf(" %s\n",s4);for(j=0;j<m;j++){strcpy(s2,s4);int num[30];digit(j,s1,s2);transform(s3,s2);k=calculate_exp(s3);if(k==5){printf("输入有误!\n");return;}//容错部分else//打印真值表{for(i=0;i<(int)strlen(s1);i++){num[i] = (j/(int)pow(2,i)%2);printf("%d ",num[i]);}printf("%d\n",k);}}}void paradigm(char d){//求范式的函数char s1[30],s2[30],s3[30],s4[30];int n,j,i,k,m;printf("***************** 输入要计算的表达式(A~Z,a~z) ******""********** \n");printf("其中'&'代表与'|'代表或'~'代表非'>'代表单条件'='""代表双条件\n ");gets(s4);printf("\n您输入要计算的表达式为:%s \n答案如下:\n",s4);n=got( s1, s4);if(!n){printf("输入有误!\n");return;}m = (int)pow(2,n);for(j=0;j<m;j++){strcpy(s2,s4);digit(j,s1,s2);transform(s3,s2);k=calculate_exp(s3);int num[30];for(i=0;i<(int)strlen(s1);i++){num[i] = (j/(int)pow(2,i)%2);}switch(k){//扫描计算函数calculate_exp(s3)的值,并作相关运算case 5 : printf("输入有误!"); return;//容错部分case 1 ://当返回是1时计算主析取范式if(d=='2'){//结合用户选择(d),进行合取运算,并打印if (num[0]==1)printf("\n %c",s1[0]);elseprintf("\n ~%c",s1[0]);for(i=1;i<(int)strlen(s1);i++){if (num[i]==1)printf("&%c",s1[i]);elseprintf("&~%c",s1[i]);} break;}else break;case 0 ://当返回是0时计算主合取范式if(d=='3'){//基本同上if (num[0]==1)printf("\n %c",s1[0]);elseprintf("\n ~%c",s1[0]);for(i=1;i<(int)strlen(s1)-1;i++){if (num[i]==1)printf("|~%c",s1[i]);elseprintf("|%c",s1[i]);}break;}else break;default: printf("输入有误!");return;//容错部分}}}void main(){char n;printf("\t\t欢迎使用!\n" );while(1){printf("\n\t\t请选择功能:\n1,计算真值表\t\t2, 列出主析取范式\n3,""列出主合取范式\t\t0,退出\n请选择:" );n = getchar();getchar();switch(n){//对输入进行扫描case '0': exit(0);break;case '1': truetable();break;//真值表操作case '2':case '3': paradigm(n);break;//求范式操作default:printf("输入有误!");//容错部分}}}界面:。