真值表判断

真值表判断
真值表判断

源代码:

# include

# include

# include

# include

# include

# define MAXSIZE 100

typedef 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;

else

return 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');

else

return 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

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++;

else

return 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

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

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]);

else

printf("\n ~%c",s1[0]);

for(i=1;i<(int)strlen(s1);i++){

if (num[i]==1)

printf("&%c",s1[i]);

else

printf("&~%c",s1[i]);

} break;

}

else break;

case 0 :

//当返回是0时计算主合取范式

if(d=='3'){

//基本同上

if (num[0]==1)

printf("\n %c",s1[0]);

else

printf("\n ~%c",s1[0]);

for(i=1;i<(int)strlen(s1)-1;i++){

if (num[i]==1)

printf("|~%c",s1[i]);

else

printf("|%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("输入有误!");

//容错部分

}

}

}

界面:

逻辑函数真值表生成程序

逻辑函数真值表生成程序 (一)实验任务: 设计一个能生成具有13个输入逻辑变量的逻辑函数真值表生成程序。 功能要求: 规定函数文本的书写方式,将逻辑函数写入文本文件中(如 logic_funs.txt); 2,程序从包含有逻辑函数表达式的文本文件(如logic_funs.txt)中读入变量个数和函数 3,函数运算优先顺序的识别与函数运算转换 4,得到函数输出结果 5,将真值表存入文本文件(如truth_table.txt)中。 6,逻辑函数表达式的文本文件及真值表文本文件的文件名应能独立输入。 扩展设计: 将原要求实现的过程扩展为具有8个函数处理能力的程序。 (二)实验方法:

(三)功能实现: 1. 函数文本的书写方式:函数值+函数体,注意函数以分号结束,如: F=(A+B'+C*D*E*(F*G+H+I))*X+Y*W*Z*(A+B+C*H*F); 2.采用文件流形式从文本文件读入函数表达式,并将真值表写入文本文 件中,文件地址既可采用当前目录的默认地址,也可采用自定义的路 径。 3. 函数运算优先顺序的识别与函数运算转换通过两个顺序栈(sk1存储 运算符,sk2存储操作数)来实现。 算法描述: 从左到右扫表达式,如读入的是操作数,则压入操作数栈sk2;入读入的是操作符,则需按一下规则进一步判断: 1) 若读入的是左括号“(”,或读入的运算符优先级大于栈顶运算符优先 级,则将读出的符号进运算符栈,然后依次读下一个符号,注意括号并 未参与运算符优先级比较,故需特别判断; 2) 若读出的符号为表达式结束符“;”,且运算符栈顶也是表达式结束符 “;”,则表达式处理结束; 3) 非运算符“‘”直接对操作数栈顶元素运算,运算结果进操作数栈,非 运算符不进栈; 4) 若读出的符号为右括号“)”,且运算符栈顶是左括号“)”,则表示 括号内的表达式处理结束,将左括号“)出栈,然后依次读入下一个符 号; 5) 如读入的运算符优先级不大于栈顶运算符优先级,则从操作数栈依次推 出两个操作数,从运算符栈退出一个运算符,将这两个操作数按这种运 算符做相应运算,并将运算结果压入操作数栈。注意在这种情况下,当 前读出的操作符下次将重新考虑,即(不再读下一个符号); 例如:对函数表达式F=(X+Y+Z)*X'*Y; a.初始状态 b.读出(、X、+、Y topp-> OPS topv-> OVS OPS OPS

真值表化简法

在设计逻辑电路图时,由真值表直接得到的函数往往比较复杂。代数法和卡诺图法等方法对于变量数目较多的逻辑函数则效果不佳,本文介绍一种可以化简复杂逻辑函数的方法──表格法,该方法可以对变量数目较多的逻辑函数也可以进行化简。 2、原理 在介绍化减法之前,先说明三个概念: 蕴涵项──在函数的任何积之和式中,每个乘积项称为该函数的蕴涵项。对应于卡诺图中的任一标1单元(最小项)以及2m个相邻单元所形成的圈都是函数的蕴涵项。 素项──若函数的一个蕴涵项不是该函数中其它蕴涵项的一个子集,则此蕴涵项称为素蕴涵项,简称素项。 实质素项──若函数的一个素项所包含的某一最小项,不包括在该函数的其它任何素项中则此素项称为实质素蕴涵项,简称实质素项。 列表化简法的基本原理是利用逻辑函数的最小项,通过对相邻最小项的合并,消去多余变量因子,获得逻辑函数的最简式的。列表化简法的思路是先找出给定函数F的全部素项,然后找出其中的实质素项;若实质素项不能覆盖F的所有最小项,则进一步找出所需素项,以构成F的最简素项集。 下面用列表化简法将下列函数化简为最简与或表达式。 F(A,B,C,D)=Σ(0,3,4,5,6,7,8,10,11) 3、建立素项表 首先,找出给定函数的全部素项。 (1)先将每个最小项所对应的二进制数按其“1”的个数分组得表1; 表1 最小项

(2)将表1中的相邻两个组之间二进制数进行比较、合并得到一次化简结果,称为一次乘积项,其项号记为i(j-i),其中i为最小项中的小项号,j为最小项中的大项号,得表2; 表2 一次乘积项

(3)再将表2中的相邻两组内的二进制数进行比较、合并、便得到第二次化简结果,称为二次乘积项,其项号记为i(n,m),其中i为两个一次乘积项中的小项号,n为原最小项的项号差,m为一次乘积项的项号差,得表3; 表3 二次乘积项 不能与其它一次乘积项合并的一次乘积项是素项,分别以a,b,c,d,e,f记之,不能合并的二次乘积项也是素项,以g记之。

离散数学真值表

逻辑异或: A ∧ B 描述如下: 什么是逻辑异或? 即两个数(例如a和b),相同(两者都为真或两者都为假)时,逻辑异或后即为假(通常用0表示),不同(一方为真,一方为假)时,逻辑异或后即为真( 通常用1表示) a b 逻辑异或 0 0 0 0 1 1 1 0 1 1 1 0

邏輯合取 例如,採用兩個命題變數,A和B和邏輯運算符 "AND" (∧), 表示合取 "A 與 B" 或A∧B。在普通英語中,如果 A 和 B 都是真的,那麼合取 "A∧B" 是真的;在所有的對A∧B的真值的可能指派,合取都是假的。這種聯繫定義如下:

[編輯]邏輯析取 OR (∨) 關係定義如下: [編輯]邏輯與非 可以構造複合的表達式,使用圓括號來指示優先順序。 合取的否定? (A∧B) ≡A∧B, 和否定的析取? A∨? B描述如下: A B A∧B A∧B?A?B?A∨?B F F F T T T T F T F T T F T T F F T F T T

[編輯]邏輯或非 真值表可以用來證明邏輯等價。 析取的否定? (A∨B) ≡A∨B,和否定的合取? A∧? B描述如下: A B A∨B A∨B?A?B?A∧?B F F F T T T T F T T F T F F T F T F F T F T T T F F F F

P Q P∧Q P∨Q P∧Q P∨Q P→Q P←Q P?Q F F F F F T T T T F T F T T F T F F T F F T T F F T F T T T T F T T T T 註解: T = 真,F = 假

看懂真值表.

1.最小项的基本概念 由A、B、C三个逻辑变量构成的许多乘积项中有八个被称为A、B、C的最小项的乘积项,它们的特点是 1. 每项都只有三个因子 2. 每个变量都是它的一个因子 3. 每一变量或以原变量(A、B、C)的形式出现,或以反(非)变量(A、B、C)的 形式出现,各出现一次 一般情况下,对n个变量来说,最小项共有2n个,如n=3时,最小项有23=8个 2.最小项的性质 为了分析最小项的性质,以下列出3个变量的所有最小项的真值表。 由此可见,最小项具有下列性质: (1)对于任意一个最小项,只有一组变量取值使得它的值为1,而在变量取其他各组值时,这个最小项的值都是0。 (2)不同的最小项,使它的值为1的那一组变量取值也不同。 (3)对于变量的任一组取值,任意两个最小项的乘积为0。 (4)对于变量的任一组取值,全体最小项之和为1。 3.最小项的编号 最小项通常用m i表示,下标i即最小项编号,用十进制数表示。以ABC为例,因为它和011相对应,所以就称ABC是和变量取值011相对应的最小项,而011相当于十进制中的3,所以把ABC记为m3按此原则,3个变量的最小项

二、逻辑函数的最小项表达式 利用逻辑代数的基本公式,可以把任一个逻辑函数化成一种典型的表达式,这种典型的表达式是一组最小项之和,称为最小项表达式 。下面举例说明把逻辑表达式展开为最小项表达式的方法。例如,要将 化成最小项表达式,这时可利用的基本运算关系,将逻辑函数中的每一项都化成 包含所有变量A、B、C的项,然后再用最小项下标编号来代表最小项,即 又如,要将化成最小项表达式,可经下列几步: (1)多次利用摩根定律去掉非号,直至最后得到一个只在单个变量上有非号的表达式; (2)利用分配律除去括号,直至得到一个与或表达式;

真值表判断

源代码: # include # include # include # include # include # define MAXSIZE 100 typedef 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; else return 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;

逻辑式与真值表

课题:逻辑式与真值表 课时:两课时 教学目标:1、了解逻辑式的概念; 2、会填写逻辑式的真值表; 3、理解等值逻辑式的涵义; 4、能够判断逻辑式是否等值 教学重点:理解等值逻辑式的概念,并能判断逻辑式是否等值。 教学难点:填写逻辑式的真值表 教学过程: 一、创设情境,导入课题 A 、A ·(B+C )、[(A B)+C] + D 、1、0 有常量1、0以及逻辑变量经逻辑运算构成的式子叫做逻辑代数式,简称逻辑式。 逻辑运算的优先次序依次为“非运算”、“与运算”、“或运算”,如果有添加括号的逻辑式,首先要进行括号内的运算。 二、动脑思考,探索新知 列出逻辑变量的一切可能取值与相应的逻辑式的值的表,叫做逻辑式的真值表。 问题1:试写出AB B A +?的真值表。 A B AB B A +? 1 1 1 0 0 1 0 分析:可以先写出B A ?和AB ,再计算AB B A +? 问题2:试写出B A +与B A ?的真值表,并观察它们值的关系 A B A+B B A + A B B A ? 1 1 1 0 0 0 0 1 0 1 0 0 1 0 0 1 1 0 1 0 0 0 1 1 1 1

如果对于逻辑变量的任何一组取值,两个逻辑式的值都相等,这样的两个逻辑式叫做等值逻辑式,等值逻辑式可用“=”连接,并称为等式。需要注意,这种相等是状态的相同。 问题3:用真值表验证下列等式是否成立 A·(B+C)=A·B+A·C A B C B+C A·(B+C)A·B A·C A·B+A·C 1 1 1 1 1 1 1 1 1 1 0 1 1 1 0 1 1 0 1 1 1 0 1 1 1 0 0 0 0 0 0 0 0 1 1 1 0 0 0 0 0 1 0 1 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 可以看出对于逻辑变量的任何一组值,A·(B+C)与A·B+A·C的值都相同,所以A·(B+C)=A·B+A·C。 随堂练习 1.填写下列真值表,并判断有没有等值逻辑式 (1) A B A·B B A?B A+ (2) A B A+B B A? A+B

复合判断真值表

复合明体(判断)及其真值表 第一节联言判断 一、什么是联言判断 联言判断是断定若干事物情况共同存在的复合判断。例如: 泰山既雄伟,又壮丽。 联言判断由联言支和联言联结项构成。联言支可以有两个或三个以上,联言支通过联结项“并且”联结起来。一个二支联言判断的逻辑形式是: P并且q 在现代逻辑中,“并且”也可用“∧”(读作“合取”)表示。这样,联言判断的逻辑形式也可表示为: P∧q 在现代汉语中,联言判断用并列复句、递进复句、连贯复句、转折复句与某些单句表达。 二、联言判断的真假值 联言判断的真假决定于联言支的真假。一个联言判断,只有当它的联言支都真时,它才是真的,只要朋一个联言支假,它就是假的。 两个联言支中如果有一个假或者两个都假时,那么,这个联言判断就是假的。 联言判断的真假值与联言支的真假值的制约关系可以用下列真值表来表示: 现代逻辑认为,一个合取式(P∧q),只要支命题都真,即使支命题之间没有意义上的联系,也是真的。例如,“1+1=2,并且雪是白的”这个联言命题就是真的。然而,在实际思维和语言表达中,人们不满足于仅从真假值的角度对联言判断加以研究,而进一步从联言支之间不同意义上的联系作具体分析,以便准确使用这种判断。 三、使用联言判断要注意的几个问题 1、选择恰当的关联词语来表达联言判断 联言判断是对各种共同存在的事物情况的概括反映,而共同存在的事物情况之间的关系是有区别的。这种区别表现为并列关系、连贯关系(承接关系)、递进关系、转折关系。其语言形式则是并列复句、连贯复句、递进复句、转折复句。所以,在语言运用中,要根据联言支之间的实际关系选择恰当的关联词语来表达。 2、注意联言支的排列顺序 如“她结了婚,而且生了孩子”。

离散数学,逻辑学,命题公式求真值表

离散逻辑学实验 班级:10电信实验班学号:Q 姓名:王彬彬 一、实验目的 熟悉掌握命题逻辑中的联接词、真值表、主范式等,进一步能用它们来解决实际问题。 二、实验内容 1. 从键盘输入两个命题变元P和Q的真值,求它们的合取、析取、条件和双条件的真值。(A) 2. 求任意一个命题公式的真值表(B,并根据真值表求主范式(C)) 三、实验环境 C或C++语言编程环境实现。 四、实验原理和实现过程(算法描述) 1.实验原理 (1)合取:二元命题联结词。将两个命题P、Q联结起来,构成一个新的命题P∧Q, 读作P、Q的合取, 也可读作P与Q。这个新命题的真值与构成它的命题P、Q的真值间的关系为只有当两个命题变项P = T, Q = T时方可P∧Q =T, 而P、Q只要有一为F则P∧Q = F。这样看来,P∧Q可用来表示日常用语P与Q, 或P并且Q。 (2)析取:二元命题联结词。将两个命题P、Q联结起来,构成一个新的命题P∨Q, 读作P、Q的析取, 也可读作P或Q。这个新命题的真值与构成它的命题P、Q的真值间的关系为只有当两个命题变项P = F, Q = F时方可P∨Q =F, 而P、Q只要有一为T则P∨Q = T。这样看来,P∨Q可用来表示日常用语P或者Q。 (3)条件:二元命题联结词。将两个命题P、Q联结起来,构成一个新的命题P→Q, 读作P条件Q, 也可读作如果P,那么Q。这个新命题的真值与构成它的命题P、Q的真值间的关系为只有当两个命题变项P = T, Q = F时方可P→Q =F,

其余均为T。 (4)双条件:二元命题联结词。将两个命题P、Q联结起来,构成一个新的命题P←→Q, 读作P双条件于Q。这个新命题的真值与构成它的命题P、Q的真值间的关系为当两个命题变项P = T, Q =T时方可P←→Q =T, 其余均为F。 (5)真值表:表征逻辑事件输入和输出之间全部可能状态的表格。列出命题公式真假值的表。通常以1表示真,0 表示假。命题公式的取值由组成命题公式的命题变元的取值和命题联结词决定,命题联结词的真值表给出了真假值的算法。真值表是在逻辑中使用的一类数学表,用来确定一个表达式是否为真或有效。 (6)主范式: 主析取范式:在含有n个命题变元的简单合取式中,若每个命题变元与其否定不同时存在,而两者之一出现一次且仅出现一次,称该简单合取式为小项。由若干个不同的小项组成的析取式称为主析取范式;与A等价的主析取范式称为A的主析取范式。任意含n个命题变元的非永假命题公式A都存在与其等价的主析取范式,并且是惟一的。 主合取范式:在含有n个命题变元的简单析取式中,若每个命题变元与其否定不同时存在,而两者之一出现一次且仅出现一次,称该简单析取式为大项。由若干个不同的大项组成的合取式称为主合取范式;与A等价的主合取范式称为A的主合取范式。任意含n个命题变元的非永真命题公式A都存在与其等价的主合取范式,并且是惟一的。 五、代码设计结果:

2017年考研联考逻辑之从真值表看假言判断解析

2017年考研联考逻辑之从真值表看假言 判断解析 很多同学反映,对于真值表以及从中获取的信息不太会用,凯程考研逻辑教研室针对这种情况给大家做专题讲解,希望能够帮助大家梳理清楚这个知识点。 对于假言判断来说,除了能够正确地进行翻译外,还有一个很重要的知识点是大家必须掌握的,那就是假言判断的真值表。很多同学反映,对于真值表以及从中获取的信息不太会用,凯程考研逻辑教研室针对这种情况给大家做专题讲解,希望能够帮助大家梳理清楚这个知识点。 一、假言判断的真值表 p q p→q 1 1 1 1 0 0 0 1 1 0 0 1 上表即为假言判断的真值表,其中1表示为真,0表示为假。在该表中我们能够发现,p→q为假的情况只有一种,即p真且q假,由此我们可以知道,p→q和(p且—q)互为矛盾关系。 p→q为真的情况有三种,分别为:p真且q真;p假且q真;p假且q假。在为真的三种情况里,我们要注意,当p为假的时候,无论q是真还是假,p→q恒真;当q为真的时候,无论p是真还是假,p→q也是恒真。这样一来,我们就知道,当p假或q真的时候,p→q 恒真。 这两个知识点大家掌握住的话,很多看似很难的题目就可以快速找到解题思路和方法。 二、真题中真值表的应用 (2014年1月第28题)陈先生在鼓励他孩子时说道:“不要害怕暂时的困难和挫折,不经历风雨怎么见彩虹?”他孩子不服气的说:“您说的不对。我经历了那么多风雨,怎么就没见到彩虹呢?” 陈先生孩子的回答最适宜用来反驳以下哪项? A.如果想见到彩虹,就必须经历风雨。 B.只要经历了风雨,就可以见到彩虹。 C.只有经历风雨,才能见到彩虹。 D.即使经历了风雨,也可能见不到彩虹。 E.即使见到了彩虹,也不是因为经历了风雨。 【正确答案】B。 【凯程解析】陈先生孩子的话可翻译为:风雨且—彩虹,问这句话可以反驳以下哪项,即这句话可以使以下哪项为假。这个题目考察的其实是陈先生孩子的话的矛盾,根据真值表

第五章 真值表的判定作用

?第五章真值表的判定作用 第一节重言式、矛盾式、可满足式 一、真值联结词 ?定义:真值联结词是指仅仅表示复合命题与支命题之间真假关系的联结词。 ?真值联结词主要有五个: ??(否定)、∧(合取)、 ?∨(析取)、→(蕴涵)、 ?←→(等值) 二、真值形式 ?定义:真值形式是指由真值联结词和命题变项所构成的形式结构。?五种基本的真值形式 ?否定式:?p ?合取式:p∧q ?析取式:p∨q ?蕴涵式:p→q ?等值式:p←→q 三、五种基本真值形式的真值表 ?T 表示“真”、F 表示“假” ?1、?p 2、p∧q 3、p∨q 4、p→q 5、p←→q

四、重言式、矛盾式、可满足式 ?1、重言式(又叫永真式)是指在一个命题形式中不论其中的变项取什么值,该命题形式的值总是真的。 ?如:p∨?p ?2、矛盾式(又叫永假式)是指在一个命题形式中不论其中的变项取什么值,该命题形式的值总是假的。 ?如:p∧?p ?3、可满足式是指在一个命题形式中不论其中的变项取什么值,该命题形式的值至少在一种情况下是真的。 ?如:p ∧q 第二节真值表的判定作用 ?一、真值表可以判定任一命题形式是否是重言式。 ?例1. 判定(p→q∧?q)→?p 是否为重言式。 公式的构成过程:由简到繁地列举出该公式的各个组成部分,最后为该公式本身。 根据五个基本真值形式的真值表,一步步地计算出每个组成部分的真值,最后得出该公式的真值。如果这个公式在各种情况下都是真的,就判定它是重言式,否则就判定它不是重言式。 (1) (2) (3) (4) (5) [例2] 判定下列公式是否是重言式:p→p,p∧p,p∧?p。 用真值表法判定如下:

相关文档
最新文档