构造任意合式公式的真值表
- 格式:doc
- 大小:48.00 KB
- 文档页数:17
第二节 命题公式及其真值表在上节中,用,,p q r L 表示确定的简单命题。
简单命题又称为命题常项或命题常元。
命题常项有确定的真值。
在数理逻辑中,不仅要研究具体的逻辑关系,还要研究抽象的逻辑关系,因而不仅要有命题常项,还要有命题变项。
称真值可以变化的简单陈述句为命题变项或命题变元,仍然用,,p q r L 表示命题的变项。
命题常项、命题变项及联结词可按下述定义合式的公式。
定义2.1 (1)单个的命题变项(或常项)是合式公式;(2)若A 是合式公式,则(¬A )也是合式公式;(3)若A ,B 是合式公式,则(A ∧B ),(A ∨B ),(A →B ),(A ↔B )也是合式公式;(4)有限次地应用(1)~(3)形成的符号串都是合式公式。
这样定义的合式公式也称为命题公式,简称公式。
单独使用(¬A ),(A ∧B ),(A ∨B ),(A →B ),(A ↔B )时,外层括号可以省去,即可写成¬A ,A ∧B ,A ∨B ,A →B ,A ↔B 。
在定义 2.1.中出现的A ,B L 是用来表示任意的合式公式的。
在以下的论述中出现的A ,B ,C 等也同样是用来表示任意公式的。
定义2.2 设1p ,2p L ,n p 是出现在公式A 中的全部的命题变项,给1p ,2p L ,np 各指定一个真值,称为A 的一个赋值或解释。
若指定的一组真值使A 的真值为1,则称这组真值为A 的成真赋值(或成真解释)。
若指定的一组真值使A 的真值为0,则称这组真值为A 的成假赋值(或成假解释)。
本书中对含n 个命题变项的公式的赋值形式做如下规定:(1)设A 中含的命题变项为1p ,2p L ,n p ,赋值12n a a a L (i a 为0或1)是指11p a =,22p a =,L ,n n p a =。
(2)若出现在A 中的命题变项为p ,q ,r ,L ,赋值12n a a a L 是指1p a =,2q a =,L ,即按字典顺序赋值。
用真值表法判断命题公式命题公式是数理逻辑中的一个重要概念。
在推理和证明中,判断一个命题公式的真假性是非常重要的。
其中,真值表法是一种常用的方法。
本文将介绍真值表法的基本原理和应用。
一、命题公式的基本概念命题是一个陈述句,它要么是真的,要么是假的。
例如,“今天下雨了”、“1+1=2”、“苹果是红色的”等都是命题。
在数理逻辑中,命题通常用字母p、q、r等来表示。
命题公式是由命题符号和逻辑符号组成的符号串。
命题符号表示命题,逻辑符号表示命题之间的关系。
逻辑符号包括非()、合取(∧)、析取(∨)、条件(→)、双条件()等。
例如,p∧q表示p和q都为真时,整个命题为真。
二、真值表法的基本原理真值表法是用来判断命题公式真假性的一种方法。
它的基本原理是列出所有可能的命题符号取值组合,并按照逻辑符号的运算规则计算出整个命题的真值。
真值表的每一行对应一个命题符号取值组合,最后一列为整个命题的真值。
例如,对于命题公式p∨q,可以列出如下的真值表:p q p∨q----------------T T TT F TF T TF F F其中,T表示真,F表示假。
在该真值表中,第一列和第二列分别代表p和q的取值,第三列代表整个命题的真值。
在第一行中,p 和q都为真,所以整个命题为真。
三、真值表法的应用真值表法可以用来判断任意命题公式的真假性。
下面以两个例子来说明其应用。
例一:判断(p→q)∧(q→p)是否为重言式。
首先,列出该命题公式的真值表:p q p q p→q q→p (p→q)∧(q→p)--------------------------------------------------------T T F F T T TT F F T F F FF T T F T T TF F T T T T T在该真值表中,最后一列的值都为真。
因此,该命题公式是重言式。
例二:判断(p∨q)→(p∧q)是否为永假式。
首先,列出该命题公式的真值表:p q p∨q p∧q (p∨q)→(p∧q)------------------------------------T T T T TT F T F FF T T F FF F F F T在该真值表中,最后一列的值都不为假。
#include "stdio.h"#include "stdlib.h"#include "string.h"#include "math.h"#define N 50void pd(int b[N],int f);int H1 (char T1[N], char T2[N], int T3[N], int y);int H2 (char T1[N], char T2[N], int T3[N], int y);int main(){int i1,i2,d=1,T3[N],kh=0,jg,j=0,y;int w=0,hequ[N],h=0,x=0,xiqu[N];char T1[N],T2[N],T10[N],s;hequ[0]=-1;xiqu[0]=-1;printf("#########################################\n"); printf("## 用!表示否定 ##\n");printf("## 用&表示合取 ##\n");printf("## 用|表示析取 ##\n");printf("## 用^表示条件 ##\n");printf("## 用~表示双条件 ##\n");printf("#########################################\n\n"); printf("请输入一个合法的命题公式:\n");gets(T1);strcpy(T10,T1);for(i1=0;i1<strlen(T1);i1++){if(T1[i1]==')' || T1[i1]=='(')kh++;if(T1[i1]>='a' && T1[i1]<='z' || T1[i1]>='A' && T1[i1]<='Z') {for(i2=0;i2<j;i2++)if(T2[i2]==T1[i1])d=0;if(d==1){T2[j]=T1[i1];j++;}d=1;}}1printf("\n输出真值表如下:\n \n");for(i1=0;i1<y;i1++)printf(" %c ",T2[i1]);printf(" ");puts(T1);printf("\n");for(i1=0;i1<j;i1++)T3[i1]=0;for(i2=0;i2<j;i2++)printf(" %d ",T3[i2]);jg=H1(T1,T2,T3,y);if(jg==0)hequ[h++]=w;elsexiqu[x++]=w;printf(" %d\n",jg);strcpy(T1,T10);for(i1=0;i1<(int)pow(2,j)-1;i1++) {++w;pd(T3,j-1);jg=H1(T1,T2,T3,y);if(jg==0)hequ[h++]=w;elsexiqu[x++]=w;strcpy(T1,T10);for(i2=0;i2<j;i2++)printf(" %d ",T3[i2]);printf(" %d\n",jg);}if(hequ[0]==-1)printf("\n该命题公式不存在主合取范式。
11.1 命题及其符号化[教学重点] 命题的概念和六个联结词的定义[教学目的]1:使学生了解逻辑的框架,命题逻辑的基本要素是命题。
2:通过示例理解命题的概念。
3:通过示例理解合取、析取、异或、蕴涵、等价的含义,了解逻辑语言的精确性,为学习逻辑学打好基础。
4:学会命题符号化的方法。
[教学准备][教学方法]讲述法[课时安排]二课时。
[教学过程]讲述:逻辑是解决推理方法的学科,中心是推理,基本要素是命题,称为命题逻辑。
数理逻辑则是用数学方法研究推理;首先要理解命题是什么,然后了解怎样用数学方法描述命题,甚至逻辑推理。
后者式命题符号化的问题。
板书:第一章命题基本概念1.1 命题及其符号化讲述:首先讨论命题。
板书:一命题A) 概念:在二值逻辑中,命题是或真或假,而不会同时又真又假的陈述句。
判断要点:a 陈述句;b 或真或假,唯一真值;讲述:例:(1)地球是圆的;真的陈述句,是命题(2)2+3=5;真的陈述句,是命题(3)你知道命题逻辑吗?非陈述句,故非命题(4)3-x=5;陈述句,但真假随x的变化而变化,非命题(5)请安静!非陈述句,故非命题(6)火星表面的温度是800 C;现时不知真假的陈述句,但只能要么真要么假,故是命题(7)明天是晴天;尽管要到第二天才能得知其真假,但的确是要么真要么假,故是命题2(8) 我正在说谎;无法得知其真假,这是悖论注意到(4)不是命题,后续章节中会提到,这被称为谓词,命题函数或命题变项。
讲述:类似一般的事物,也有不同的命题,分成不同的类型。
板书:B) 分类:a 简单命题,通常用p,q,r,…,等表示命题变项,命题常项用1(T),0(F)表示;b 复合命题,由简单命题和联结词构成;讲述:简单命题可以简单地用单个字母表示,但复合命题还包含了联结词,多个命题变项由联结词联结起来成为复合命题。
所以还需要考虑联结词的问题。
板书:二逻辑联结词讲述:首先最为简单的一种情况,就是日常语言中所说的“不”,这是对原有意思的的否定,所以称为否定式板书:1)否定式和否定联结词:命题p⌝p;符号⌝即为否定联结词。
离散数学右箭头真值表
一、合式公式
原子命题:不可再分的命题,即不包含任何逻辑联结词的命题命题变元:公式中没有确定真值的变量,其真值只能在 0,1 两者中选择
合式公式(递归定义法):
①真值 1 和 0 是合式公式;
②原子命题公式是一个合式公式;
③如果 A 是合式的公式,那么¬A是合式公式;
④如果 A 和 B 均是合式的公式,那么A∧B,A∨B,A→B,A↔B 都是合式公式;
⑤当且仅当有限次地应用①至④条规则由逻辑联结词、圆括号所组成的有意义的符号串是合式的公式。
我们把合式的公式简称为命题公式。
一般一个命题公式的真值是不确定的,只有用确定的命题去取代命题公式中的命题变元,或对其中的命题变元进行真值指派时,命题公式才成为具有确定真值的命题。
二、真值表
设 A 为一命题公式,对其中出现的命题变元做所有可能的每一组真值指派S,连同公式 A 相应S(A) 的取值汇列成表,称为 A 的真值表。
一个真值表由两部分构成:
①表的左半部分列出公式的每一种解释;
②表的右半部分给出相应每种解释公式得到的真值。
为构造的真值表方便和一致,有如下约定:
(1)命题变元按字典序排列。
(2)对公式的每种解释,以二进制数从小到大或者从大到小顺序排列。
(3)若公式复杂,可先列出各子公式的真值(若有括号从里层向外展开),最后列出所给公式的真值。
构造任意合式公式的真值表
#include "stdio.h"
#include"thesis.h"
int main()
{
Thesis a[30];
char x='1';
int i=0,N;
cout<<"请输入命题变元(不超过30个)(输入'0'结束输入):"<<endl;
while(int(x)!=48)
{
cin>>x;
if(i>19)
{cout<<"Error:变元个数太多!"<<endl;break;}
if(x!='0')
{
a[i].inname(x);
i++;
}
}
N=i;
int M;
M=N;
string A;
cout<<"请输入命题公式( 否定:!,合取:&,析取:| )"<<endl;
cin>>A;
cout<<A<<"的真值表为:"<<endl;
for(int j=0;j<M;j++)
cout<<char(a[j].getvalue())<<" ";
cout<<"真值"<<endl;
assignment(A,N,M,&a[0]);
system("pause");
return 0;
}
#include"thesis.h"
#ifndef THESIS_H
#define THESIS_H
#include<string>
#include<stdlib.h>
#include<iostream>
using namespace std;
class Thesis //命题类
{
int value;char name; //value:命题的真值
(0/1) name:命题名
public:
Thesis(){value=2;name='A';};
friend Thesis operator !(Thesis &q)
{q.invalue(1-q.getvalue()); return q;} //重载逻辑运算符
friend Thesis operator &(Thesis &p,Thesis &q)
{p.invalue((p.getvalue()+q.getvalue())/2);
return p;}
friend Thesis operator |(Thesis &p,Thesis &q)
{if(p.getvalue()+q.getvalue()>0)
p.invalue(1);
else p.invalue(0);
return p;}
friend Thesis operator >(Thesis &p,Thesis &q)
{if(p.getvalue()==1&&q.getvalue()==0)
p.invalue(0);
else p.invalue(1);
return p;}
friend Thesis operator <(Thesis &p,Thesis &q) {if(p.getvalue()==q.getvalue())
p.invalue(1);
else p.invalue(0);
return p;}
void invalue(int x){value=x;} //输入value
void inname(char x){name=x;} //输入name
int getvalue(){return value;} //获取
真值
int getname(){return name;} //获取命题
名
};
void assignment(string A,int N,int M,Thesis a[]); //声明函数
int bds(string A,int N,Thesis a[]);
int run(string A,int &i,int L,int N,Thesis a[]);
void assignment(string A,int N,int M,Thesis a[])//命题赋值并计算真值
{
for(int j=0;j<2;j++)
{
a[N-1].invalue(j);
if(N>1)
{
assignment(A,N-1,M,&a[0]);
}
else
{
for(int i=0;i<M;i++)
{
cout<<a[i].getvalue()<<" ";
}
cout<<bds(A,M,&a[0])<<endl;
}
}
}
int bds(string A,int N,Thesis a[]) //
识别输入的表达式并计算真值
{
Thesis answer,Temp;
char d[5]={'!','|','&','>','<'}; //定义运算符号集合
int L;
int i=0;
L=strlen(&A[0]); //表达式长度
while(i<L)
{
if(A[i]=='(')
{
int k=1;
for(int j=i+2;j<L;j++)
{
if(k!=0)
{
if(A[j]=='(')
k++;
if(A[j]==')')
k--;
}
if(k==0)
{
int l=j-i-1;
char *p=new char[l+1];
string B;
for(int m=0;m<l;m++)
p[m]=A[i+1+m];
p[l]='\0';
B=p;
delete p;
Temp.invalue(bds(B,N,&a[0]));
if(i==0)
answer.invalue(Temp.getvalue());
i=j+1;
break;
}
}
}
else
{
if(A[i]=='!') //否定的计算
{
Temp.invalue(run(A,i,L,N,&a[0]));
answer=!Temp;
i++;
continue;
}
else if(A[i]=='|')
{
Temp.invalue(run(A,i,L,N,&a[0]));
answer=answer|Temp;
i++;
continue;
}
else if(A[i]=='&')
{
Temp.invalue(run(A,i,L,N,&a[0]));
answer=answer&Temp;
i++;
continue;
}
else if(A[i]=='<')
{
Temp.invalue(run(A,i,L,N,&a[0]));
answer=answer<Temp;
i++;
continue;
}
else if(A[i]=='>')
{
Temp.invalue(run(A,i,L,N,&a[0]));
answer=answer>Temp;
i++;
continue;
}
else
{
for(int j=0;j<N;j++)
{if(A[i]==char(a[j].getname()))
{
Temp.invalue(a[j].getvalue());
if(i==0)
answer.invalue(Temp.getvalue());
i++;
break;
}
}
}
}
}
return answer.getvalue();
}
int run(string A,int &i,int L,int N,Thesis a[]) {
Thesis Temp;
if(A[i+1]=='(')
{
int k=1;
for(int j=i+2;j<L;j++)
{
if(k!=0)
{
if(A[j]=='(')
k++;
if(A[j]==')')
k--;
}
if(k==0)。