实验一 真值计算及真值表
一、实验目的
(1)熟悉五个常用联结词合取、析取、条件和双条件的概念,掌握真值表技术。
(2)熟悉五个真值表,掌握真值表技术;
二、实验内容
定义1 设P表示一个命题,由命题联结词┐和命题P连接成┐P,称┐P为P的否定式复合命题, ┐P读“非P”。称┐为否定联结词。┐P是真,当且仅当P为假;┐P是假,当且仅当P为真。
定义2 设P和Q为两个命题,由命题联结词∧将P和Q连接成P∧Q,称P∧Q为命题P和Q的合取式复合命题,P∧Q读做“P与Q”,或“P且Q”。称∧为合取联结词。当且仅当P和Q的真值同为真,命题P∧Q的真值才为真;否则,P∧Q的真值为假。
定义3 设P和Q为两个命题,由命题联结词∨把P和Q连接成P∨Q,称P∨Q为命题P和Q的析取式复合命题,P∨Q读做“P或Q”。称∨为析取联结词。当且仅当P和Q的真值同为假,P∨Q的真值为假;否则,P∨Q的真值为真。
定义4 设P和Q为两个命题,由命题联结词→把P和Q连接成P→Q,称P→Q为命题P和Q的条件式复合命题,简称条件命题。P→Q读做“P条件Q”或者“若P则Q”。称→为条件联结词。当P的真值为真而Q的真值为假时,命题P→Q的真值为假;否则,P→Q的真值为真。
定义5 令P、Q是两个命题,由命题联结词把P和Q连接成P Q,称P Q为命题P和Q的双条件式复合命题,简称双条件命题,P Q读做“P当且仅当Q”,或“P等价Q”。称为双条件联结词。当P和Q的真值相同时,P Q的真值为真;否则,P Q的真值为假。
定义6设命题变元P1、P2、P3、…、Pn是出现在公式G中的所有命题变元,指定P1、P2、P3、…、Pn 的一组真值,则这组真值称为G的一个解释或指派,常记为I。
定义7 真值表:公式G在其所有可能的解释下所取真值的表。
本实验要求:
(1)从键盘输入两个命题P和Q的真值,求它们的合取、析取、条件和双条件的真值;
(2)从键盘输入一个命题公式列出其真值表。
(3)用C语言、C++或Python实现。
三、实验源程序
part1:
#include<iostream>
#include<stdio.h>
using namespace std;
int main(){
int a,b;
cin>>a>>b;
//cout<<"合取结果为:"<<(int)a&&b << "\n";
//cout<<"析取结果为:"<<(int)a||b << "\n";
printf("The result of ^: %d\n",a&&b);
printf("The result of v: %d\n",a||b);
if(a&&!b){
printf("The result of ->: %d\n",0);
}else{
printf("The result of ->: %d\n",1);
}
if(a && b || !a && !b){
printf("The result of <->: %d\n",1);
}else{
printf("The result of <->: %d\n",0);
}
cout<<endl;
return 0;
}
Part2:
#include<iostream>
using namespace std;
int main(){
char a,ch,b;
cout<<"What we have defined are as follows:\n";
cout<<"You can input two truth-values and a operator\n";
cout<<"You can use ^ v > -\n";
cout<<"The ^ is conjunction\n";
cout<<"The v is disjunction\n";
cout<<"The > is condition\n";
cout<<"The - is double conditions\n";
cin>>a>>ch>>b;
switch(ch){
case '^':
cout<<"\t"<<a<<"\t"<<b<<"\tresult\n";
cout<<"\t"<<0<<"\t"<<0<<"\t"<<0<<endl;
cout<<"\t"<<0<<"\t"<<1<<"\t"<<0<<endl;
cout<<"\t"<<1<<"\t"<<0<<"\t"<<0<<endl;
cout<<"\t"<<1<<"\t"<<1<<"\t"<<1<<endl;
break;
case 'v':
cout<<"\t"<<a<<"\t"<<b<<"\tresult\n";
cout<<"\t"<<0<<"\t"<<0<<"\t"<<0<<endl;
cout<<"\t"<<0<<"\t"<<1<<"\t"<<1<<endl;
cout<<"\t"<<1<<"\t"<<0<<"\t"<<1<<endl;
cout<<"\t"<<1<<"\t"<<1<<"\t"<<1<<endl;
break;
case '>':
cout<<"\t"<<a<<"\t"<<b<<"\tresult\n";
cout<<"\t"<<0<<"\t"<<0<<"\t"<<1<<endl;
cout<<"\t"<<0<<"\t"<<1<<"\t"<<1<<endl;
cout<<"\t"<<1<<"\t"<<0<<"\t"<<0<<endl;
cout<<"\t"<<1<<"\t"<<1<<"\t"<<1<<endl;
break;
case '-':
cout<<"\t"<<a<<"\t"<<b<<"\tresult\n";
cout<<"\t"<<0<<"\t"<<0<<"\t"<<1<<endl;
cout<<"\t"<<0<<"\t"<<1<<"\t"<<0<<endl;
cout<<"\t"<<1<<"\t"<<0<<"\t"<<0<<endl;
cout<<"\t"<<1<<"\t"<<1<<"\t"<<1<<endl;
break;
}
return 0;
}
四、实验的分析与思考
- cout<<或许没有重载bool值与其他的,总之用cout会报错
实验二 关系性质判断及闭包计算
一、实验目的
(1)熟悉关系的性质,掌握求判断关系性质的方法。
(2)熟悉Warshall算法,掌握求关系的自反闭包、对称闭包和传递闭包的方法。
二、实验内容
定义1 设R是集合X上的二元关系,对任意的x∈X,都满足<x,x>∈R,则R是自反的。
定义2 设R是集合X上的二元关系,对任意的x∈X,都满足<x,x>ÏR,则R是反自反的。
定义3 设R是集合X上的二元关系,对任意的x,y∈X,满足<x,y>∈RÞ<y,x>∈R,则R是对称的。
定义4 设R是集合X上的二元关系,对任意的x,y∈X,满足<x,y>∈R∧<y,x>∈RÞx=y,则R是反对称的。
定义5 设R是集合X上的二元关系,对任意的x,y,z∈X,满足<x,y>∈R∧<y,z>∈RÞ<x,z>∈R,则R是传递的。
定义6 设R是A上的二元关系,R的自反(对称、传递)闭包是关系R1,则
① R1是自反的(对称的、传递的)
② RR1
③ 对任何自反的(对称的、传递的)关系R2,若RR2,则R1R2。
R的自反、对称和传递闭包分别记为r®、s®和t®。
定理1 令RAA,则
① r®=R∪IA
② s®=R∪R-1
③ t®=R∪R2∪R3…
Warshall算法:设R是n个元素集合上的二元关系,M是R的关系矩阵;
(1) 置新矩阵A:=M
(2) 置i:=1;
(3) for j=1 to n do