求给定命题公式的真值表并根据真值表求公式的主范式
离散数学14.主合取范式
例2 求((PQ)R)P的主合取范式. 解: 原式 ((P∨Q)∨R)∨P (P∨Q)∧(R∨P ) (合取范式) ((P∨Q)∨(R∧R ))∧((R∨P )∨(Q∧Q)) (P∨Q∨R)∧(P∨Q∨R)∧(P∨Q∨R)∧ (P∨Q∨R) (P∨Q∨R)∧(P∨Q∨R)∧(P∨Q∨R) (主合取范式)
⑶用“∧”联结上述大项,即可.
例1 求 PQ和PQ的主合取范式
P Q PQ PQ
FF T
T
FT T
F
TF F
F
TT T
T
PQ M2 P∨Q PQ M1∧M2
(P∨Q )∧(P∨Q)
方法2:用公式的等价变换 ⑴先写出给定公式的合取范式
A1∧A2∧...∧An . ⑵除去合取范式中的所有为永真的合取项. ⑶合并相同的析取项和相同的变元. (4)为使每个Ai变成大项,对缺少变元的析取式Ai补全变
主合取范式
主合取范式
1.定义:给定的命题公式,如果有一个等价公式, 它仅由大项的合取所组成,则该等价式称作原式的主 合取范式.
2.主合取范式的求法 方法1:列真值表 ⑴列出给定公式的真值表. ⑵找出真值表中每个“F”对应的大项.
如何根据一组指派写对应的为“F”的大项:如果变 元P被指派为F,P在大项中以P形式出现;如变元P被指 派为T,P在大项中以P形式出现(确保该大项为F).
利用真值表求主合取范式
利用真值表求主合取范式
1、把变量的各种可能取值与想对应的函数值,用表格的形式一一列举出来,这种表格就叫做真值表。
2、设一个变量均有0、1两种可能取值,n个变量共有2n种可能,将它们按顺序(一般按二进制数递增规律)排列起来,同时在相应位置上写上逻辑函数的值,便可得到该逻辑函数的真值表。
3、例如:逻辑函数的Y=AB+BC+CA的真值表如下:真值表以表格的形式表示逻辑函数,其优点是直观明了。
4、输入变量取值一旦确定,即可以从表中查出相应的函数值。
5、所以,在许多数字集成电路手册中,常常以不同形式的真值表,给出器件的逻辑功能。
6、另外,在把一个实际逻辑问题,抽象成为数学表达形式时,使用真值表是最方便的。
7、所以,在数字电路逻辑设计过程中,第一步就是要列出真值表;在分析数字电路逻辑功能时,最后也要列出真值表。
8、但是,真值表也有一些缺点:首先,难以对其使用逻辑代数的公式和定理进行运算和变换;其次,当变量比较多时,列真值表会十分繁琐。
利用真值表法求取主析取范式以及主合取范式的实现
#include <iostream>#include <cmath>#include <cassert>#include <cctype>using namespace std;char str[100]; //输入的命题公式int tv[20] = {0}; //真值指派的数组int length; //命题公式长度char expression[100]; //将命题公式中的命题变元变为真值后的数组int icp(const char c) //联结词的栈外优先级{int result = -1;switch(c){case '#': result = 0; break;case '(': result = 10; break;case '!': result = 9; break;case '&': result = 6; break;case '|': result = 4; break;case '>': result = 2; break;case ')': result = 1;}return result;}int isp(const char c) //联结词的栈内优先级{int result = -1;switch(c){case '#': result = 0; break;case '(': result = 1; break;case '!': result = 8; break;case '&': result = 7; break;case '|': result = 5; break;case '>': result = 3; break;case ')': result = 10;}return result;}void Plus(int a[],int q) //二进制加法指派真值{a[q]=a[q]+1;for (int i = q; a[i] == 2; i--){a[i]=0;a[i-1]=a[i-1]+1;}}template<class T>class Stack{public:virtual bool IsEmpty() const = 0;virtual bool IsFull() const = 0;virtual bool Top(T& x) const = 0;virtual bool Push(T x) = 0;virtual bool Pop() = 0;virtual void Clear() = 0;};template<class T>class SeqStack: public Stack<T> //顺序栈类{public:SeqStack(int mSize = 30);~SeqStack() { delete []s; }bool IsEmpty() const { return top == -1; }bool IsFull() const { return top == maxTop; } bool Top(T& x) const;bool Push(T x);bool Pop();void Clear() { top = -1; }private:int top;int maxTop;T* s;};template<class T>SeqStack<T>::SeqStack(int mSize){maxTop = mSize - 1;s = new T[mSize];top = -1;}template<class T>bool SeqStack<T>::Top(T& x) const{if (IsEmpty()){cout << "Empty" << endl;return false;}x = s[top];return true;}template<class T>bool SeqStack<T>::Push(T x){if (IsFull()){cout << "Overflow" << endl;return false;}s[++top]=x;return true;}template<class T>bool SeqStack<T>::Pop(){if(IsEmpty()){cout << "Underflow" << endl;}top--;return true;}class Calculator{public:Calculator(int maxSize):s(maxSize){}void Change();int Run();void Solve();void Clear() { s.Clear(); }private:SeqStack<bool> s; //运算栈void PushOperand(bool);bool GetOperands(bool &, bool &);void DoOperator(char);};void Calculator::PushOperand(bool op){s.Push(op);}bool Calculator::GetOperands(bool & op1, bool & op2) //获取栈顶两个元素{if (!s.Top(op1)){cerr << "Missing operand!" << endl;return false;}s.Pop();if (!s.Top(op2)){cerr << "Missing operand!" << endl;return false;}s.Pop();return true;}void Calculator::DoOperator(char oper) //联结词运算{bool left, right;bool result = GetOperands(left, right);if (result)switch(oper){case '!': s.Push(!left && right); break; //not运算case '&': s.Push(left && right); break; //and运算case '|': s.Push(left || right); break; //or运算case '>': s.Push(!right || left); break; //条件运算}elseClear();}void Calculator::Change() //将输入的字符串转化为可计算的表达式{int k = 0, t = 0;int flag = 1; //标记,防止相同的命题变元赋入不同的值int count = 0;for (int i = 0; i < pow(2,count); i++){k=1;for (int m = 0; m < length; m++){if (isalpha(str[m])) //将原来的命题变元修改为真值{if (flag == 1){if(tv[k] == 0)expression[m] = '0';elseexpression[m] = '1';k++;}elseexpression[m] = '0';flag = 1;for (t = m; t >= 0; t--)if ((str[m+1] == str[t]) && isalpha(str[m+1]) && isalpha(str[t]))flag = 0;}else{expression[m] = str[m]; //逻辑联结词不变for (t = m; t >= 0; t--)if ((str[m+1] == str[t]) && isalpha(str[m+1]) && isalpha(str[t]))flag = 0;}}for (int t = 0; t < length; t++)for (int j = t; j < length; j++)if (str[t] == str[j])expression[j] = expression[t]; //相同的命题变元复制赋值}}int Calculator::Run(){SeqStack<char> s1; //联结词栈char ch, y;char p[100];int i = 0;s1.Push('#');for (int temp=0; temp < length ; temp++){ch = expression[temp];if (isdigit(ch)){p[i++] = ch;}else if(ch == ')')for(s1.Top(y), s1.Pop(); y != '('; s1.Top(y), s1.Pop())p[i++] = y;else{if(ch == '!') p[i++] = '1'; //非运算,在!前加1,将!视作双目操作符for(s1.Top(y), s1.Pop(); icp(ch) <= isp(y); s1.Top(y), s1.Pop())p[i++] = y;s1.Push(y);s1.Push(ch);}}while(!s1.IsEmpty()){s1.Top(y);s1.Pop();if(y != '#')p[i++] = y;}p[i++] = '#';/* ------↑中缀表达式转化为后缀表达式-----------↓计算后缀表达式结果------------- */bool newop;for (i = 0; p[i] !='#'; i++){switch(p[i]){case '!':case '&':case '|':case '>': DoOperator(p[i]); break;default:cin.putback(p[i]);cin >> newop;PushOperand(newop);break;}}if (s.Top(newop)){cout << (int)newop << endl;return (int)newop; //输出并返回最终结果}}void Calculator::Solve(){cout << "***************************************" << endl;//标语cout << "** 欢迎进入逻辑运算软件**" << endl;cout << "** (可运算真值表,主范式,支持括号) **" << endl;cout << "** **" << endl;cout << "** 用!表示not 用&表示and **" << endl;cout << "** 用|表示or 用>表示蕴含**" << endl;cout << "** **" << endl;cout << "***************************************" << endl;cout << "请输入合法的命题公式(以#结尾): ";int flag = 1; //标记,防止重复添加命题变元int count = 0; //命题变元的数目cin >> str; //输入命题公式length = strlen(str) - 1;char index[10]; //命题变元数组for (int i = 0; i < length; i++) //逐次添加命题变元{if (isalpha(str[i]) && (flag == 1))index[count++] = str[i];flag=1;for (int k = 0; k < count; k++)if (index[k] == str[i+1])flag=0;}if (!count){cout << "无命题变元,重新输入!" << endl;system("pause");system("cls");Solve();}cout << "真值表:" << endl;for (int w = 0; w < count; w++)cout << index[w] << ' ';for (w = 0; w < length; w++)cout << str[w];cout << endl;int *truth = new int[pow(2,count)];int xx = 0, dx = 0; //小项,大项for (int r = 0; r < pow(2,count); r++) //输出真值表{for (int j = 1; j <= count; j++)cout << tv[j] << ' ';Change();truth[r] = Run();if (truth[r]) //记录小项和大项的个数xx++;elsedx++;Plus(tv,count);}if(xx > 1) //输出主析取范式{int flag_xx = 0;cout << "主析取范式为";for(r = 0; r < pow(2,count); r++){if (truth[r]){if (flag_xx) cout << " \\/ ";cout << "m" << r;flag_xx = 1;}}cout << endl;}elsecout << "没有主析取范式!" << endl;if(dx > 1) //输出主合取范式{int flag_dx = 0;cout << "主合取范式为";for(r = 0; r < pow(2,count); r++){if (!truth[r]){if (flag_dx) cout << " /\\ ";cout << "M" << r;flag_dx = 1;}}cout << endl;}elsecout << "没有主合取范式!" << endl;cout << "是否继续运算?(Y/N)" << endl;char goon;cin >> goon;if (goon=='y' || goon=='Y'){system("cls");Solve(); //递归调用Solve,重新计算}elseexit(0);}int main(){Calculator Cal(100);Cal.Solve();return 0;}。
命题公式真值表
说明:
(1)命题变元是没有真假值的,只有当命题变元用 确定的命题代入时,才得到一个命题,命题的真值 依赖于代换变元的那些命题的真值;
1-3 命题公式与翻译
(2) 不是所有由命题变元 ,常元 ,联结词和括号组成的字符串 都能成为命题公式.例如, P , P (Q ) 等不是命题公式.
定义 1-3.1 命题演算的合式公式,规定为: (1)单个命题变元本身是一个合式公式; (2)如果 A 是合式公式,那么 A 是合式公式; (3)如果 A 和 B 是合式公式,那么
1-3 命题公式与翻译
2、命题的翻译
练习 将下列命题符号化: (1)她既聪明又用功. (2)他虽聪明但不用功. (3)虽然这次语文考试的题目很难,但是王丽还是取得了好成绩. (4)张三或李四都可以做这件事. (5)一公安人员审查一起案件,事实如下,请将案件事实符 号化: 张三或李四盗窃了机房的一台电脑,若是张三所为,则作案 时间不能发生在午夜前;若李四的证词正确,则午夜时机房 的灯未灭; 若李四证词不正确,则作案时间发在午夜前; 午夜时机房的灯全灭了.
分配律
P (Q R) ( P Q) ( P R)
吸收律
P ( P Q) P , P ( P Q) P
1-4 真值表与等价公式
4.基本等价公式
德·摩根律 同一律 零律 否定律 (互补律) 条件式转化律 双条件转化律
( P Q) P Q , ( P Q) P Q
1-3 命题公式与翻译
1、命题公式(合式公式)
定义 1 由命题变元、常元、联结词、括号以规定的格式联结 起来的字符串称为命题公式,也称合式公式.命题公式中的命 题变元称为命题公式的分量.
例如,若 P 和 Q 是命题变元, 则下面式子均是命题公式
离散数学(一)知识梳理
离散数学(一)知识梳理•逻辑和证明部分o命题逻辑题型▪命题符号化问题将自然语言转为符号化逻辑命题▪用命题变量来表示原子命题▪用命题联结词来表示连词▪命题公式的类型判断判断命题公式是否是永真式、矛盾式、可能式▪利用真值表判断▪利用已知的公式进行推理判断▪利用主析取和合取范式判断▪定理:A为含有n个命题变元的命题公式,若A的主析取范式含有2^n个极小项,则A为重言式,若极小项在0到2^n之间,则为可满足式,若含有0个极小项,则A为矛盾式;若A的主合取范式含有2^n个极大项,则A为矛盾式,若极小项在0到2^n之间,则为可满足式,若含有0个极小项,则A为重言式▪翻译:一个命题公式化成主范式后,若所有项都分布在主析取范式中(主合取范式为1)则为重言式;若所有项都分布在主合取范式中(主析取范式为0)则为矛盾式;若均有分布,则为可满足式。
【思想来源:真值表法求主范式】▪一个质析取式是重言式的充要条件是其同时含有某个命题变元及其否定式;一个质合取式是矛盾式的充要条件是其同时含有某个命题变元及其否定式▪一个析取范式是矛盾式当且仅当它的每项都是矛盾式;一个合取范式是重言式当且仅当它的每项都是重言式▪求(主)析取或合取范式▪等值演算法▪ 1. 利用条件恒等式消除条件(蕴含和双条件)联结词,化简得到一个范式▪ 2. 在缺项的质项中不改变真值地添加所缺项,化简得到一个主范式▪ 3. 找出包含所有命题变元排列中剩余项,凑出另一个主范式(思想上类似于真值表法)▪真值表法▪ 1. 画出命题公式真值表▪ 2. 根据真值表结果求出主范式▪主析取范式:真值为1的所有项,每一项按对应01构成极小项▪主合取范式:真值为0的所有项,每一项按对应01构成极大项▪形式证明与命题推理利用推理规则构造一个命题公式的序列,证明结论▪形式证明:命题逻辑的论证是一个命题公式的序列,其中每个公式或者是前提,或者是由它之前的公式作为前提推得的结论,序列的最后一个是待证的结论,这样的论证也称为形式证明。
用真值表法判断命题公式
用真值表法判断命题公式命题公式是数理逻辑中的一个重要概念。
在推理和证明中,判断一个命题公式的真假性是非常重要的。
其中,真值表法是一种常用的方法。
本文将介绍真值表法的基本原理和应用。
一、命题公式的基本概念命题是一个陈述句,它要么是真的,要么是假的。
例如,“今天下雨了”、“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在该真值表中,最后一列的值都不为假。
离散数学实验——求真值表
一实验目的 (1)二实验内容 (1)三实验环境 (1)四实验原理和实现过程(算法描述) (1)五实验数据及结果分析; (3)六源程序清单; (7)七其他收获和体会。
(16)一实验目的熟悉掌握命题逻辑中的联接词、真值表、主范式等,进一步能用它们来解决实际问题。
二实验内容1. 从键盘输入两个命题变元P和Q的真值,求它们的合取、析取、条件和双条件的真值。
(A)2. 求任意一个命题公式的真值表(B,并根据真值表求主范式(C))三实验环境C或C++语言编程环境实现。
四实验原理和实现过程(算法描述)A:首先提示用户输入真值指派,然后判断用户输入的是否是0或者1,如果不是则利用while语句提示错误,然后提示重新输入直至输入正确,再根据用户输入的真值给代表合取,析取,蕴含,双条件的变量赋值,再以两行表格形式输出所得结果。
最后提示按#键退出,否则继续循环求真值。
B:主要思路:首先提示用户输入表达式,然后编写并调用一个函数将表达式转换为逆波兰式,在转换的同时,插入部分语句将表达式中的变量名存储到数组bianl[N]中,然后输出存好的各变量名及用户输入的表达式(建立表头),将每次的真值指派存在数组zhi[]中,编写函数zzhi()每次调用zzhi()时都使数组zhi[]中的真值加1,(利用递推实现加一时可能的进位,)然后编写并调用一函数qiuzhi ()计算每次真值指派下的逆波兰表达式的值,再输出各真值指派和求出的表达式的真值,然后调用函数zzhi()将真值指派的数组加1,最后外围利用while语句循环输出每个不同的真值指派和该指派下表达式的值。
将表达式转换成逆波兰式并将变量提取的算法:首先需要分配2个栈,一个作为临时存储运算符的栈fu[],一个作为输入逆波兰式的栈nibol[],从中缀式的左端开始取字符,逐序进行如下步骤:(1)若取出的字符是字母,则该字母直接送入nibol[]栈。
同时为了找出所有变量,将该变量名与数组bianl[]中已有的元素比较,如果bianl[]中还没有该字母,则该字母是新出现的变量,将其录入数组bianl[]中。
利用真值表求主范式的方法
利用真值表求主范式的方法
利用真值表求主范式的方法是一种计算布尔函数的有效方法。
真值表是一个表格,其中列出了布尔函数的所有可能输入和对应输出值。
从真值表中,我们可以确定函数的主范式,即包含所有输入和输出组合的最小项或最大项。
这些主范式可以帮助我们简化函数并找出其逻辑特性。
以下是利用真值表求主范式的具体步骤:
1. 给定一个布尔函数,列出其真值表,其中包括所有可能的输入和相应的输出值。
2. 找出真值表中所有输出为1的每个组合,并将它们称为最小项。
例如,如果布尔函数有4个输入变量,则真值表将包含16个可能的组合。
如果输出为1的组合有3个,则有3个最小项。
3. 将这些最小项组合成一个包含所有最小项的主范式。
这可以通过使用布尔代数规则来完成,例如使用与操作符和或操作符。
4. 如果存在多个主范式,则可以使用其中任何一个来简化布尔函数。
但是,一般情况下,我们会选择包含最少项的主范式,因为这意味着最简单的逻辑表达式。
5. 如果需要,可以使用主范式来创建逻辑电路或编写计算机程序,以实现相应的布尔函数。
通过这些步骤,我们可以快速、准确地确定布尔函数的主范式,从而简化其逻辑表达式并实现相应的功能。
- 1 -。
求给定命题公式的真值表并根据真值表求公式的主范式
求给定命题公式的真值表并根据真值表求公式的主范式(求给定命题公式的真值表并根据真值表求公式的主范式)专业网络工程班级 1202班学号 12407442姓名张敏慧2013.12.14目录一.实验目的 .......................................................3二.实验内容 (3)求任意一个命题公式的真值表 ..................................................................... ..... 3 三.实验环境 (3)四. 实验原理和实现过程(算法描述) (3)1.实验原理 ..................................................................... ...................................... 3 2.实验流程图 ..................................................................... .................................. 5 五.实验代码 (6)六. 实验结果 (14)七. 实验总结 (19)- 1 -一.实验目的本实验课程是网络工程专业学生的一门专业基础课程,通过实验,帮助学生更好地掌握计算机科学技术常用的离散数学中的概念、性质和运算;通过实验提高学生编写实验报告、总结实验结果的能力;使学生具备程序设计的思想,能够独立完成简单的算法设计和分析。
熟悉掌握命题逻辑中的真值表、主范式等,进一步能用它们来解决实际问题。
二.实验内容求任意一个命题公式的真值表,并根据真值表求主范式详细说明:求任意一个命题公式的真值表本实验要求大家利用C/C,,语言,实现任意输入公式的真值表计算。
一般我们将公式中的命题变元放在真值表的左边,将公式的结果放在真值表的右边。
离散数学13.主析取范式
(P∧Q∧R)∨(P∧Q∧R)
补充说明
学情分析
学生已经掌握了析取(合取)范式的方法,掌握是小项、大项的意义,思考如何寻找范式的“标准”形式。
教学评价
师生互动,启发式教学引导学生思考并进而解决问题;深入分析,用例题加深学生对知识点的理解。
课程资源
参考书目,网上教学视频,网络微课。
教学过程:
由于一个命题公式的析(合)取范式不是唯一,因而它们不能作为命题公式的规范形式(标准形式),为了使任意命题公式化为唯一的标准形式,下面引入主范式的概念.
1.定义:对于给定的命题公式,如果有一个等价公式,它仅有小项的析取所组成。则该等价式称作原式的主析取范式。
2.求主析取范式
方法1:真值表法
(1)列出给定公式的真值表。
(2)定理1-7.3在真值表中,一个公式的真值为T的指派所对用的小项的析取,即为此公式的主析取范式.
找出真值表中每个“T”对应的小项。(如何根据一组指派写对应的为“T”的项:如果变元P被指派为T,P在小项中以P形式出现;如变元P被指派为F,P在小项中以P形式出现(因要保证该小项为T)).
(3)用“∨”联结上述小项,即可.
例1求PQ和PQ的主析取范式.
PQm0∨m1∨m3(P∧Q)∨(P∧Q)∨(P∧Q)
PQm0∨m3(P∧Q)∨(P∧Q)
方法2:用等价变换求主析取范式.
⑴先写出给定公式的析取范式
A1∨A2∨...∨An.
⑵除去析取范式中所有永假的析取项,合并出现的相同变元和合取项.
方法1用真值表法
令A(P,Q,R)(P(Q∧R))∧(P(Q∧R))
其真值表如下图:
A(P,Q,R)m0∨m7(P∧Q∧R)∨(P∧Q∧R)
利用真值表求主合取范式
利用真值表求主合取范式在逻辑学中,主合取范式是一个命题逻辑式的合式范式,它由多个合取式组成,每个合取式中包含了命题变量或它们的否定形式。
利用真值表求一个命题逻辑式的主合取范式可以通过以下步骤完成:1. 构造命题变量在真值表中的全部可能取值组合。
2. 对于每一组取值,计算命题逻辑式的真值。
3. 将所有真值为真的组合找出来,把它们表示成合取式的形式。
4. 把所有的合取式用“或”连接起来,就得到了主合取范式。
例如,假设要求命题逻辑式P∨(Q∧R)的主合取范式,可以按照以下步骤进行:1. 构造真值表,列出P、Q、R的所有可能取值组合:| P | Q | R | P∨(Q∧R) ||---|---|---|---------|| T | T | T | T || T | T | F | T || T | F | T | T || T | F | F | T || F | T | T | T || F | T | F | F || F | F | T | F || F | F | F | F |2. 对于每一组取值,计算命题逻辑式的真值:| P | Q | R | P∨(Q∧R) ||---|---|---|---------|| T | T | T | T || T | T | F | T || T | F | T | T || T | F | F | T || F | T | T | T || F | T | F | F || F | F | T | F || F | F | F | F |3. 找出所有真值为真的组合:P∨(Q∧R) =(T∧T∧T)∨(T∧F∧F)∨(T∧F∧T)∨(T∧F∧F)∨(F∧T∧T) =T∨F∨T∨F∨F4. 把所有的合取式用“或”连接起来,就得到了主合取范式:P∨(Q∧R)的主合取范式为(P∧Q∧R)∨(P∧Q∧R)∨(P∧Q∧R)∨(P∧Q∧R)∨(P∧Q∧R)。
命题公式真值表
1-4 真值表与等价公式
1.真值表
定义1-4.1 在命题公式中,对于分量指派真值的各种可能 组合,就确定了这个命题公式的各种真值情况,把它汇列成 表,就是命题公式的真值表.
例 2 构造下列命题公式的真值表: (1) P Q ; (3) ( P Q) P ; (5) ( P Q) (P Q) . (2) P Q ; (4) ( P Q) (P Q) ;
3.等价公式
定 义 1-4.2 给 定 两 个 命 题 公 式 A 和 B , 设
A 、 B 中的原子变元 , 如果给 P 1,P 2 ,… , P n 为出现于 A 与 B 的真值都相同, P 1,P 2 ,…, P n 任一组真值指派 ,
则称 A 和 B 是等价的(或逻辑相等),记作 A B .
1-4 真值表与等价公式
例 3 证明: P Q ( P Q) (Q P)
4.基本等价公式
对合律
(双否定)
P P
交换律
结合律
P Q Q P, P Q Q P
P (Q R) ( P Q) R , P (Q R) ( P Q) R P (Q R) ( P Q) ( P R) ,
1-3 命题公式与翻译
2、命题的翻译
练习 将下列命题符号化: (1)她既聪明又用功. (2)他虽聪明但不用功. (3)虽然这次语文考试的题目很难,但是王丽还是取得了好成绩. (4)张三或李四都可以做这件事. (5)一公安人员审查一起案件,事实如下,请将案件事实符 号化: 张三或李四盗窃了机房的一台电脑,若是张三所为,则作案 时间不能发生在午夜前;若李四的证词正确,则午夜时机房 的灯未灭; 若李四证词不正确,则作案时间发在午夜前; 午夜时机房的灯全灭了.
计算机自动求解命题公式的主范式
3 计算机自动求解命题公式的主范式一.需求分析(1)用户输入一任意命题公式,计算机程序自动输出其主析取范式和主合取范式。
(2)求任意一个命题公式的真值表,并根据真值表求主范式。
(3)关于命题公式的形式和运算符(即联结词)的运算首先根据离散数学的相关知识,命题公式由命题变元和运算符(即联结词)组成,命题变元用大写字母英文表示(本次试验没有定义命题常元T和F,即T、F都表示命题变元),每个命题变元都有两种真值指派0和1,对应于一种真值指派,命题公式有一个真值,由所有可能的指派和命题公式相应的真值按照一定的规范构成的表格称为真值表。
目前离散数学里用到的包括扩充联结词总共有九种,即析取(或)、合取(与)、非、蕴含、等值、与非、或非、异或、蕴含否定,常用的为前五种,其中除了非运算为一元运算以外,其它四种为二元运算。
所以本次实验设计时只定义了前五种运算符,同时用“/”表示非,用“*”表示合取,用“+”表示析取,用“>”表示蕴含,用“:”表示等值,且这五种运算符的优先级依次降低,如果需用括号改变运算优先级,则用小括号()改变。
以下为上述五种运算符运算时的一般真值表,用P和Q表示命题变元:1.非,用“/”表示2. 合取(与),用“*”表示3.析取(或),用“+”表示4.蕴含,用“>”表示5.等值,用“:”表示下面是求取后缀表达式的规则:1.从中缀表达式左边起逐个字符判断,如果是命题变元,则直接输出;如果是运算符,则将其与当前有效栈顶字符(即非空,可能为运算符或左半括号;如果栈为空,则直接入栈)的优先级比较,如果大于栈顶字符优先级,则直接入栈,如果小于或等于栈顶字符优先级,则弹出栈中字符并输出,直到大于栈顶字符优先级;2.如果遇到左半括号,则直接入栈,也就是栈外左半括号的优先级最高,入栈以后,其优先级变为最低,也就是不管下一个字符是什么,该左半括号都不出栈,当且仅当遇到与其对应的右半括号时(遇到右半括号前,所有的字符按1中的规则或左半括号的入栈规则入栈或出栈),将栈中该左半括号以上的字符按照出栈规则弹出并输出,最后该左半括号出栈并和右半括号一起被丢掉(右半括号永不入栈),余下的字符不出栈;3.按照上述规则判断命题公式中的所有字符后,如果栈中还有有效字符,则依次弹出并输出。
(完整版)利用真值表法求取主析取范式以及主合取范式的实现-副本
{
if (i1>0)
printf("\\/");
printf("m(%d)",xiqu[i1]);
}
}
printf("\n");
getch();
}
void pd(int b[N],int f)
{
int i;
i=f;
if(b[f]==0)
b[f]=1;
else
{
b[f]=0;
pd(b,--i);
}
}
int H1 (char T1[N],char T2[N],int T3[N],int y)
{
int i,j,h,s,kh=0,wz[N],a;
char xs1[N],ckh[N];
s=strlen(T1);
for(i=0;i<s;i++)
if(T1[i]=='(' || T1[i]==')')
{
wz[kh]=i;
ckh[kh]=T1[i];
kh++;
}
if(kh==0)
return H2(T1,T2,T3,y);
else
{
for(i=0;i<kh;i++)
if(ckh[i]==')')
break;
for(j=wz[i-1]+1,h=0;j<wz[i];j++,h++)
xs1[h]=T1[j];
hequ[0]=-1;
xiqu[0]=-1;
命题公式主范式的求法及应用
(2)若 中出现的命题变项(按字母顺序)为 …, 的赋值 是指 ,最后的字母赋值 .其中 为 或 , .不难看出,含 个命题变项的公式共有 个不同的赋值.例如,在 中, 为成真赋值, 为成假赋值.
根据公式在各种赋值下的取值情况,可按下述定义将命题公式进行分类.
定义1.1.2设 … 是出现在公式 中的全部命题变项,给 各指定一个真值,称为对 的赋值或解释.若指定的一组值使 为 ,则称这组值为 的成真赋值,若指定的一组值使 为 ,则称这组值为 的成假赋值.将命题公式在所有赋值下取值情况列成表,称为 的真值表.
在本文中,对含 命题变项的公式 的赋值采用下述方式:
定义1.1.9所有简单合取式(简单析取式)都是极小项(极大项)的析取范式(合取范式)称为主析取范式(主合取范式).
注:主析取范式可能为空,空的主析取范式规定为0;主合取范式可能为空,空的主合取范式规定为1.主析范式恰由使公式成真所对的极小项组成;主合取范式恰由使公式成假所对的极大项组成.
1.2命题公式主范式重要的相关定理
3.5利用主范式可以写出一个命题公式的真值 10
3.6利用主范式可以判断推理过程的准确性 10
3.7可以应用主范式分析和解决实际问题 11
4.附录 14
5.参考文献 15
6.致谢 16
逻辑学是研究思维和论证的科学,也就是研究关于人类推理的学问.在20世纪的下半个世纪,伴随着计算机科学技术的迅猛发展,新的逻辑学分支——数理逻辑也发展起来.数理逻辑也称为符号逻辑,是一门运用数学的方法来研究推理的形式结构和推理规律的边缘性学科.其内容相当广泛,包括逻辑演算(命题演算与谓词演算)、公理集合论、证明论、递归函数论等,其中逻辑演算是其它各部分的基础.它在逻辑电路、自动控制、人工智能、程序设计、数据库理论以及计算机科学的其它领域有着广泛的应用.
命题逻辑的真值表和范式
命题逻辑的真值表和范式命题逻辑是研究命题(陈述句)之间的逻辑关系的一种逻辑学分支。
在命题逻辑中,我们使用真值表和范式来表示和分析命题的逻辑结构。
本文将介绍真值表和范式在命题逻辑中的重要性和应用。
一、真值表真值表是用来表示和计算命题的真假值情况的一种工具。
它列举了命题中每个命题变量的可能取值情况,并根据命题之间的逻辑运算规则计算出整个命题的真假值。
真值表通常由命题变量和逻辑运算符组成。
例如,对于两个命题变量P和Q,我们可以构建如下的真值表:P | Q | P∧Q | P∨Q | P→Q | P↔Q----------------------T | T | T | T | T | T----------------------T | F | F | T | F | F----------------------F | T | F | T | T | F----------------------F | F | F | F | T | T在真值表中,"T"代表命题的真值为真,"F"代表命题的真值为假。
通过观察真值表,并根据命题之间的逻辑运算规则,我们可以推断出命题之间的逻辑关系。
例如,P∧Q表示P与Q的合取,只有当P和Q 都为真时,合取才为真。
类似地,P∨Q表示P与Q的析取,只要P和Q中至少有一个为真,析取就为真。
真值表为我们提供了一种清晰的逻辑分析工具,能够帮助我们理解和推理命题之间的逻辑关系。
二、范式范式是用来简化和表示复杂命题的一种方法。
它将命题表示为若干个简单命题之间的逻辑连接,并以逻辑运算符为界限构成。
在命题逻辑中,最常见的范式有析取范式(DNF)和合取范式(CNF)。
析取范式将命题表示为若干个合取式之间的析取,而合取范式将命题表示为若干个析取式之间的合取。
例如,对于命题P、Q和R,我们可以将它们表示为析取范式和合取范式。
析取范式(DNF):(P∧Q∧¬R)∨(¬P∧Q∧R)∨(¬P∧¬Q∧R)合取范式(CNF):(P∨¬Q∨¬R)∧(¬P∨Q∨¬R)∧(¬P∨Q∨R)范式的使用可以帮助我们简化和理解复杂的逻辑表达式。
给出命题公式P→Q的真值表。
1、给出命题公式P→Q的真值表。
答:2、写出命题公式P→Q∨R的主合取范式。
3、证明下列结论的有效性。
(1) A→B,┐(B∨C)⇒┐A(2)(∀x)(C(x) →W(x) ∧R(x)) ∧(∃x)(C(x) ∧Q(x))⇒(∃x)(Q(x) ∧R(x))4、证明┐(B↑C)⇔┐B↓┐C。
5、证明对任意集合A、B、C,有(A-B)-C=(A-C)-(B-C)。
6、设偏序集为<ρ{0,1,2},⊆>,试求出其盖COV(ρ{0,1,2})并画出偏序关系的哈斯图。
7、写出ρ(ρ(φ))的幂集。
8、将下列命题用命题公式符号化。
(1)我们不能既划船又跑步。
(2)或者你没有给我写信,或者信在途中丢失了。
9、用谓词公式符合化下列命题并推证其结论的有效性。
所有有理数是实数,有些有理数是整数,因此有些实数是整数。
10、设集合A={a,b,c},求R={<a,b>}的r(R)、s(R )与t(R)。
11、设集合A={a,b,c},R和S为A上的二元关系:R={<a,b>,<a,c>},S={<b,b>,<b,c>},求出:R︒S及S︒R。
(其中:︒表示两个关系的复合)12、设|A|=m,|B|=n,则A⨯B、A⨯B的幂集各有多少个元素、从A到B的关系各有多少个?13、证明集合[0,1]与集合(0,1)是等势的。
14、设A有n个不同的元素,R是A上的一个关系,则必存在i,2j使R i=R j,其中0≤i<j≤2n。
15、设集合A为可数集,证明:集合A⨯A也必为可数集。
16、不构造双射映射证明集合[0,1]与集合(4,∞)是等势的。
命题公式真值表
(4) (P Q) (P Q);
(5) (P Q) (P Q).
A
6
1-4 真值表与等价公式
解 (1) P Q 的真值表为:
P
Q
T
T
T
F
F
T
F
F
P Q
T F T T
(2) P Q 的真值表为:
P
Q
PQ
T
T
T
T
F
F
F
T
T
F
F
T
A
7
1-4 真值表与等价公式
(3) (P Q) P 的真值表为:
(1)单个命题变元本身是一个合式公式;
(2)如果 A 是合式公式,那么 A是合式公式;
(3)如果 A 和 B 是合式公式,那么
A B , A B , A B, A B 是合式公式;
(4)当且仅当能够有限次地应用(1)、(2)、(3)
所得到的包含命题变元,联结词和括号的字符串
是合式公式.
A
3
1-3 命题公式与翻译
A 中的 X 用Y 置换,所得公式 B 与公式 A 等价,即 A B .
例 4 证明: Q (P (P Q)) Q P
例 5 证明下列等价式
(1) (P Q) (P Q) P ;
(2) P (Q R) Q (P R) .
练习 证明 P (Q R) (P Q) R
A
14
1-4 真值表与等价公式
例 6 化简下列命题公式: (1) P (P (Q P)) (2) (P Q) (Q P)
说明:
(1)命题变元是没有真假值的,只有当命题变元用 确定的命题代入时,才得到一个命题,命题的真值 依赖于代换变元的那些命题的真值;
命题公式及真值表
离散结构命题公式及真值表教学目标基本要求(1)会判断命题公式及其层次;(2)真值表;(3)公式类型;重点难点真值表的应用。
命题中的符号命题中的符号:(1) 命题常元:真值唯一确定。
例如:T、F(2) 命题变元:真值可变化。
例如:P、Q、R(3) 联接词:优先级按¬, ∧, ∨, →, ↔递减(4) 辅助符号如括号()。
命题中的符号任意组成的符号串是否都有意义?例:(∧p ¬q) pq →(思考:按什么规律组成的符号串才有意义?合式公式合式公式:合法的命题公式。
(简称公式)(1)命题常元或变元是合式公式(2)若A, B是合式公式,(¬A),(A∧B),(A∨B),(A→B),(A↔B)也是合式公式(3)只有有限次地应用(1)、(2)形成的符号串才是合式公式注意这个定义是递归的。
(1)是递归的基础,由(1)开始,使用规则(2),可以得到任意的合式公式。
公式简写的约定1) 最外层括号可以省略;2) 省略括号后, 运算顺序与联结词的优先级一致,则可以省略;3) 相同联结词按从左到右的顺序计算,则可以省略。
公式的层次定义:(1)若公式A 是单个的命题变项,则称A 为0层公式。
(3)若公式的层次为k ,则称A 是k 层公式。
(2)若有下面情况之一的,称A 为n+1层公式:A 是¬B ,B ∧C ,B ∨C ,B→C ,B↔C ,其中B 、C 分别是i 层、j 层公式,且n=max(i,j); 例:((¬p ∧q)∨(p ∧ ¬q))→r1层 2层 3层 4层公式的解释命题公式代表一个命题,但只有当公式中的每一个命题变元都用一个确定的命题代入时,命题公式才有确定值,成为命题。
解释(I):给公式A( P1,P2,…,Pn )中的命题变元P1,P2,…,Pn指定一组真值称为对A的一个解释(赋值)。
成真赋值: 使公式为真的赋值。
成假赋值: 使公式为假的赋值。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
求给定命题公式的真值表并根据真值表求公式的主范式(求给定命题公式的真值表并根据真值表求公式的主范式)专业网络工程班级 1202班学号 12407442姓名张敏慧2013.12.14目录一.实验目的 .......................................................3二.实验内容 (3)求任意一个命题公式的真值表 ..................................................................... ..... 3 三.实验环境 (3)四. 实验原理和实现过程(算法描述) (3)1.实验原理 ..................................................................... ...................................... 3 2.实验流程图 ..................................................................... .................................. 5 五.实验代码 (6)六. 实验结果 (14)七. 实验总结 (19)- 1 -一.实验目的本实验课程是网络工程专业学生的一门专业基础课程,通过实验,帮助学生更好地掌握计算机科学技术常用的离散数学中的概念、性质和运算;通过实验提高学生编写实验报告、总结实验结果的能力;使学生具备程序设计的思想,能够独立完成简单的算法设计和分析。
熟悉掌握命题逻辑中的真值表、主范式等,进一步能用它们来解决实际问题。
二.实验内容求任意一个命题公式的真值表,并根据真值表求主范式详细说明:求任意一个命题公式的真值表本实验要求大家利用C/C,,语言,实现任意输入公式的真值表计算。
一般我们将公式中的命题变元放在真值表的左边,将公式的结果放在真值表的右边。
命题变元可用数值变量表示,合适公式的表示及求真值表转化为逻辑运算结果;可用一维数表示合式公式中所出现的n个命题变元,同时它也是一个二进制加法器的模拟器,每当在这个模拟器中产生一个二进制数时,就相当于给各个命题变元产生了一组真值指派。
算法逻辑如下:(1)将二进制加法模拟器赋初值0(2)计算模拟器中所对应的一组真值指派下合式公式的真值。
(3)输出真值表中对应于模拟器所给出的一组真值指派及这组真值指派所对应的一行真值。
n(4)产生下一个二进制数值,若该数值等于2-1,则结束,否则转(2)。
三.实验环境;使用visual C++6.0为编程软件,采用C语言为编程语言实现。
四. 实验原理和实现过程(算法描述);1.实验原理(1)真值表:表征逻辑事件输入和输出之间全部可能状态的表格。
列出命题公- 2 -式真假值的表。
通常以1表示真,0 表示假。
命题公式的取值由组成命题公式的命题变元的取值和命题联结词决定,命题联结词的真值表给出了真假值的算法。
真值表是在逻辑中使用的一类数学表,用来确定一个表达式是否为真或有效。
(2)主范式:主析取范式:在含有n个命题变元的简单合取式中,若每个命题变元与其否定不同时存在,而两者之一出现一次且仅出现一次,称该简单合取式为小项。
由若干个不同的小项组成的析取式称为主析取范式;与A等价的主析取范式称为A的主析取范式。
任意含n个命题变元的非永假命题公式A都存在与其等价的主析取范式,并且是惟一的。
主合取范式:在含有n个命题变元的简单析取式中,若每个命题变元与其否定不同时存在,而两者之一出现一次且仅出现一次,称该简单析取式为大项。
由若干个不同的大项组成的合取式称为主合取范式;与A等价的主合取范式称为A的主合取范式。
任意含n个命题变元的非永真命题公式A都存在与其等价的主合取范式,并且是惟一的。
(2)首先是输入一个合理的式子,然后从式子中查找出变量的个数,开辟一个二进制函数,用来生成真值表,然后用函数运算,输出结果,并根据结果归类给范式,最后输出范式。
函数部分,主要是3个函数,一个为真值表递加函数,通过二进制的加法原理递进产生,一个为分级运算函数,这个函数是通过判断括号,选出最内级括号的内容执行运算函数,这样一级一级向外运算,最后得出最终结果,剩下一个为主运算函数,按照运算符号的优先级按顺序进行运算,如先将所有非运算运算完,再执行与运算。
如此运算。
- 3 -2.实验流程图如下:开始输入式子计算变量个数生成真值表输出真值表变量赋值运算式子输出结果归类主范式N循环是否结束 Y输出主范式结束主函数- 4 -开始检查括号N 是否是最内级括号Y 分级运算函数运算内容N 是否是最后结果Y返回结果结束开始非运算与运算或运算主运算函数蕴含运算等值运算返回结果结束- 5 -五.实验代码#include "stdio.h"#include "stdlib.h"#include "string.h"#include "conio.h"#include "math.h"#define N 50void panduan(int b[N],int f);//赋值函数int tkh (char sz[N], char ccu[N], int icu[N], int h0);//分级运算函数int fkh (char sz[N], char ccu[N], int icu[N], int h0);//主运算函数main(){int i1,i2,d=1,icu[N],kh=0,jg,j=0,h0;//icu[N]用于存放变量值,kh括号计数,jg存放结果int bj=0,hq[N],h=0,x=0,xq[N];//hq[N]存放合取结果xq[N]存放析取结果char sz[N],ccu[N],sz0[N],s;//sz[N]存放式子,ccu[N]存放变量,sz0[N]也是用于存放式子hq[0]=-1;xq[0]=-1;printf("***************************************\n");//标语printf("** **\n");printf("** 欢迎进入逻辑运算软件 **\n");printf("** (可运算真值表,主范式,支持括号) **\n");printf("** **\n");printf("** 用!表示非 **\n");printf("** 用&表示与 **\n");printf("** 用|表示或 **\n");printf("** 用^表示蕴含 **\n");printf("** 用~表示等值 **\n");printf("** **\n");printf("***************************************\n\n");printf("请输入一个合法的命题公式:\n");//输入式子gets(sz);//读取式子strcpy(sz0,sz);//复制式子for(i1=0;i1<strlen(sz);i1++){if(sz[i1]==')' || sz[i1]=='(')//存储括号数量kh++;if(sz[i1]>='a' && sz[i1]<='z' || sz[i1]>='A' && sz[i1]<='Z') {for(i2=0;i2<j;i2++) //判断并储存变量。
if(ccu[i2]==sz[i1])//去除重复变量- 6 -d=0;if(d==1){ccu[j]=sz[i1];j++;}d=1;}}printf("\nd该式子中的变量个数为:%d\n",j);//输出变量个数h0=j;printf("\n输出真值表如下:\n \n"); //输出真值表表头for(i1=0;i1<h0;i1++)printf(" %c ",ccu[i1]);printf(" ");puts(sz);printf("\n");for(i1=0;i1<j;i1++) ///////先将所有的变量赋值为零。
icu[i1]=0;for(i2=0;i2<j;i2++)//输出真值表前项printf(" %d ",icu[i2]);jg=tkh(sz,ccu,icu,h0); //用函数求结果if(jg==0)//结果为0,合取加1hq[h++]=bj;else //否则,析取加1xq[x++]=bj;printf(" %d\n",jg);//输出运算结果strcpy(sz,sz0);for(i1=0;i1<(int)pow(2,j)-1;i1++){++bj;panduan(icu,j-1); //赋值变量jg=tkh(sz,ccu,icu,h0);if(jg==0)//结果为0,合取加1hq[h++]=bj;else //否则,析取加1xq[x++]=bj;strcpy(sz,sz0); //恢复被修改的数组。
for(i2=0;i2<j;i2++)printf(" %d ",icu[i2]);//输出真值表前项printf(" %d\n",jg);//输出运算结果}if(hq[0]==-1)//不存在合取范式时printf("\n该命题公式不存在主合取范式。
\n"); - 7 -else{printf("\n该命题公式的主合取范式:\n\t");for(i1=0;i1<h;i1++){if (i1>0)//判断并添加符号printf("\\/");printf("M(%d)",hq[i1]); //输出主合取范式}}if(xq[0]==-1)//不存在析取范式时printf("\n该命题公式不存在主析取范式。
\n"); else{printf("\n\n该命题公式的主析取范式:\n\t"); for(i1=0;i1<x;i1++){if (i1>0)//判断并添加符号printf("/\\");printf("m(%d)",xq[i1]);//输出主析取范式}}printf("\n");printf("\n欢迎下次再次使用~\n ");//结束getch();}void panduan(int b[N],int f) // 二进制赋值。