计算机自动求解命题公式的主范式

合集下载

命题公式主范式的自动生成与形式输出

命题公式主范式的自动生成与形式输出

收稿日期:2006 04 19.作者简介:张会凌(1954 ),男,甘肃成县人,甘肃联合大学数学与信息学院副教授,主要从事微分几何与计算机方面的研究.文章编号:1672 691X(2006)05 0049 04命题公式主范式的自动生成与形式输出张会凌(甘肃联合大学数学与信息学院,甘肃兰州730000)摘 要:在文[1]和文[2]的基础上,给出了命题逻辑中任一命题公式的主析取范式和主合取范式的自动生成算法,并实现了多个命题公式主范式的同时形式化输出.关键词:命题公式;主析取范式;主合取范式;自动生成;形式输出中图分类号:T P301.1 文献标识码:A求一个给定的命题公式的主析取范式((Spe cial)Disjunctive No rmal Form,简记为DNF)与主合取范式((Special )Conjunctive Nor mal For m,简记为CNF)是命题逻辑中一类很重要的工作.因为命题公式的主范式(主合取与主析取范式的总称)是DDP 分解和进一步进行机器处理的基础.通常求主范式的方法有二.一是将已知命题公式等值变换为所要求的主范式;二是列出真值表后,根据真值表写出相应的极大项和极小项,最后写出主合取范式与主析取范式.当给定的命题公式所含命题变元较多或公式的构成比较复杂时,用这两种方法求其主范式总是有很大的工作量且容易出错.由于我们已经在[1]和[2]中成功地解决了任一含n 个变元的命题公式F 的基本真值矩阵A n 和B n 的生成算法,以及F 的真值表的计算和输出问题,故可在此基础上参考用手工写出主范式的方法,给出在计算机上计算和输出主范式的算法.在这里,关键是如何根据给定的命题公式按照要求形式地输出正确的主范式.本文仍用N-S 图给出针对所要解决的问题的核心算法,而将源程序略去.1 主合取范式的自动计算与输出命题公式F(P 0,P 1, ,P n -1)的主合取范式CNF 是若干关于命题变元P 0,P 1, ,P n -1的极大项 P 0 P 1 P n -1的合取,其中 P i 为P i 或 P i (i =0,1, ,n -1),CNF 必与F 等价.当不考虑极大项的排列顺序时,F 的CNF 是惟一的.此处为极大项的排列规定一个顺序.对于每个极大项 P 0 P 1 P n -1,使其对应一个二进制数 0 1 n -1,其中1=0,若 P 1为P i ;1,若 P 1为 P i .并且规定,对应的二进制数小的极大项排在前面.二进制数0 1 n -1可看成对应极大项的编码.这种规定保证了CNF 表示的惟一性,以及在形式上的统一.在将F 的真值表!横排∀后,从左到右依次求得极大项后再将其合取,结果即与这里的规定完全一致.为了在某种特定的编程语言(如C 语言)环境下形象地输出主范式,约定当两个命题变元或两个子公式之间用逻辑联结符#联结时,!#∀可以省去.而当它们用逻辑联结符 联结时,则用两个半角字符!\∀和!/∀的组合! ∀表示.逻辑非的符号! ∀用!!∀代替(下同).下面给出计算和输出主合取范式的算法模块.假定需要求N 个命题公式F 0,F 1, ,F N -1的主合取范式,而基本真值矩阵B n =(b ij )和这N 个命题公式F 的真值表构成的矩阵F V (见[2])已经求出,这里矩阵F V 的第k 行是公式F k 的真值.为了把永真式(即重言式)的主合取范式按1输出,把永假式(即矛盾式)的主析取范式按0输出,先以流程图1给出一个识别模块M 1.这样,在这N 个命题公式中,某个F k 是永真式当且仅当其对应的g k =1,是永假式当且仅当第20卷第5期甘肃联合大学学报(自然科学版)V o l.20No.5 2006年9月Jo urnal of G ansu L ianhe U niv ersity (N atural Sciences)Sept.2006图1 关于永真式和永假式的识别模块Fig ure1 An ident ifying module fortauto log y and co nt radiction其对应的s k =0.于是在计算出真值表并运行了上面的识别模块之后,同时计算和输出多个命题公式的主合取范式的算法模块如图2所示.图2 计算和输出多个命题公式的主合取范式的算法模块Fig ure2 Algo rithm mo dule calculating and outputting CN F o f sev eral pr opositional fo rmulea算法中把永真式的主合取范式按1输出.必须强调的是,此模块对命题公式的主合取范式的输出是形式上的,是对手工列真值表,然后根据真值表写出主合取范式的过程的模拟.主析取范式DNF 的输出也是形式上的.2 主析取范式的自动计算和输出命题公式F(P 0,P 1, ,P n -1)的主析取范式DNF 是若干关于命题变元P 0,P 1, ,P n -1的极小项 P 0# P 1# # P n -1的析取,其中 P i 为P i 或 P i (i =0,1, ,n -1),DNF 必与F 等价.同样,当不考虑极小项的排列顺序时,F 的DNF 是惟一确定的.为了保证DNF 在内容和形式上都惟一,类似地为极小项的排列规定一个顺序.对于每个极小项 P 0# P 1# # P n -1,使其对应一个二进制数 0 1 n -1,其中i =0,若 P 1为 P i ;1,若 P i 为P i .规定对应的二进制数小的极小项排在前面.二进制数 0 1 n -1可看成对应极小项的编码.假定命题公式的基本真值矩阵B n 和N 个命题公式F 的真值表构成的矩阵F V 已经求出,则计算和输出N 个命题公式的主析取范式的算法如图3所示.算法中把永假式的主析取范式按0输出.在主析取范式中,极小项用圆括号括起来,各个极小项之间是用析取符号! ∀联结的.标志变量r 的作用是为了避免在最后一个极小项的右括号!)∀之后再打印一个多余的! ∀.例 给出两个命题公式F 0= (P 0 P 1 P 2 P 3)和F 1=(P 0#P 1)∃(P 2∃ P 3),求它们的主合取范式与主析取范式.将所给的两个命题公式输入,依据上面的算法编程运行,则系统有如下的输出结果.公式F 0和F 1的真值表是(如[2]所示,输出的真值表是一般的教科书上的真值表的!转置∀):P[0] 0000000011111111P[1]0000111100001111P[2]0011001100110011P[3]0101010101010101F 0010000000000000050甘肃联合大学学报(自然科学版) 第20卷F10110011001101111图3 计算和输出多个命题公式的主析取落式的算法模块F igure3 A lg or ithm module calculating and outputt ing DN F o f sev eral pr oposit ional fo rmulae公式F0的主合取范式是:(P0\/P1\/P2\/P3)(P0\/P1\/!P2\/ P3)(P0\/P1\/!P2\/!P3)(P0\/!P1\/P2 \/P3)(P0\/!P1\/P2\/!P3)(P0\/!P1\/!P2\/P3)(P0\/!P1\/! P2\/!P3)(!P0\/P1\/P2\/P3)(!P0\/P1 \/P2\/!P3)(!P0\/P1\/!P2\/P3)(!P0\/P1\/!P2\/!P3)(!P0\/!P1 \/P2\/P3)(!P0\/!P1\/P2\/!P3)(!P0 \/!P1\/!P2\/P3)(!P0\/!P1\/!P2\/! P3)公式F1的主合取范式是:(P0\/P1\/P2\/P3)(P0\/P1\/!P2\/! P3)(P0\/!P1\/P2\/P3)(P0\/!P1\/!P2\/!P3)(!P0\/P1\/P2\/P3)(!P0\/P1\/!P2\/!P3)公式F0的主析取范式是:(!P0!P1!P2P3)公式F1的主析取范式是:(!P0!P1!P2P3)\/(!P0!P1P2! P3)\/(!P0P1!P2P3)\/(!P0P1P2! P3)\/(P0!P1!P2P3)\/(P0!P1P2!P3)\/(P0P1!P2!P3) \/(P0P1!P2P3)\/(P0P1P2!P3)\/ (P0P1P2P3)尽管所给的例子中只有4个命题变元,用手工计算列出的真值表也有16行.直接计算主合取范式和主析取范式进行核对,可知程序输出的结51第5期 张会凌:命题公式主范式的自动生成与形式输出果是完全正确的.当命题变元数n%5时,自动计算和输出主范式的优点显得尤为突出.本文所给的算法已在C语言和VC环境下完全实现.参考文献:[1]张会凌.命题逻辑判定系统中基本真值矩阵的生成算法[J].甘肃联合大学学报(自然科学版),2005,19(1):16 19.[2]张会凌.命题公式真值表的生成与公式类型的机械判定[J].甘肃联合大学学报(自然科学版),2006,20(1):25 34.Automatic Generation and Formal Output of Special Normal Forms ofPropositional FormulaeZH A N G H ui ling(School of M at hematics and Info rmatio n,Gansu L ianhe U niversity,Lanzho u730000,China)Abstract:Based on paper[1]and[2],this paper g iv es tw o g enerating alg orithms to calculate and out put the special co njunctiv e no rmal for ms and special disjunctiv e fo rms of g iven pro positio nal for mulas automatically and form ally.Key words:pro positional form ula;special conjunctive nor mal form;special disjunctive normal fo rm;au to matic g eneration;form al output(上接第3页)[6]教育部办公厅.高等学校学报管理办法[S].中国高等学报自然科学学报研究会.会讯,1998(总30):封二.[7]孙德存.地方高校的本地化定位[J].吉昌学院学报,2004(4):72 74.[8]窦炎国,周继红.努力为地方经济、社会服务[J].苏州科技学院学报(社科版),2004,21(3):135 138.Exploratory Advancing and Pioneering Innovating&&&J ournal of G ansu L ianhe Univer sity(Ed ition of N atural S cience)Has Finished Its Publication for21YearsZH AN G Fu long(Department of Journal of Gansu L ianhe U niver sity,L anzho u730070,China)Abstract:T he autho r review s the development course of J our nal of G ansu L ianhe Univ ersity(Edition o f N atur al S cience),analyzes and sums up the practical ex perience o f running the jo urnal and their a chievement.H e also po ints out the future orientation.Key words:jour nal(edition o f natural science);teaching;scientific research;tr aining of talent;ex plora tion;review52 甘肃联合大学学报(自然科学版) 第20卷。

命题公式主范式的求法及运用

命题公式主范式的求法及运用
PINGDINGSHAN UNIVERSITY
毕业论文(设计)
题 目: 命题公式主范式的求法及应用
院 ( 系 ): 专业年级: 姓 名: 学 号: 指导教师:
数学与信息科学学院 数学与应用数学 05 级 马蓓蓓 051030233 屈聪 硕士
2009 月 3 日
对全部高中资料试卷电气设备,在安装过程中以及安装结束后进行高中资料试卷调整试验;通电检查所有设备高中资料电试力卷保相护互装作置用调与试相技互术关,通系电1,力过根保管据护线生高0不产中仅工资2艺料22高试2可中卷以资配解料置决试技吊卷术顶要是层求指配,机置对组不电在规气进范设行高备继中进电资行保料空护试载高卷与中问带资题负料2荷试2,下卷而高总且中体可资配保料置障试时2卷,32调需3各控要类试在管验最路;大习对限题设度到备内位进来。行确在调保管整机路使组敷其高设在中过正资程常料1工试中况卷,下安要与全加过,强度并看工且25作尽52下可22都能护可地1关以缩于正小管常故路工障高作高中;中资对资料于料试继试卷电卷连保破接护坏管进范口行围处整,理核或高对者中定对资值某料,些试审异卷核常弯与高扁校中度对资固图料定纸试盒,卷位编工置写况.复进保杂行护设自层备动防与处腐装理跨置,接高尤地中其线资要弯料避曲试免半卷错径调误标试高方中等案资,,料要编试求5写、卷技重电保术要气护交设设装底备备置。4高调、动管中试电作线资高气,敷料中课并设3试资件且、技卷料中拒管术试试调绝路中验卷试动敷包方技作设含案术,技线以来术槽及避、系免管统不架启必等动要多方高项案中方;资式对料,整试为套卷解启突决动然高过停中程机语中。文高因电中此气资,课料电件试力中卷高管电中壁气资薄设料、备试接进卷口行保不调护严试装等工置问作调题并试,且技合进术理行,利过要用关求管运电线行力敷高保设中护技资装术料置。试做线卷到缆技准敷术确设指灵原导活则。。:对对在于于分调差线试动盒过保处程护,中装当高置不中高同资中电料资压试料回卷试路技卷交术调叉问试时题技,,术应作是采为指用调发金试电属人机隔员一板,变进需压行要器隔在组开事在处前发理掌生;握内同图部一纸故线资障槽料时内、,设需强备要电制进回造行路厂外须家部同出电时具源切高高断中中习资资题料料电试试源卷卷,试切线验除缆报从敷告而设与采完相用毕关高,技中要术资进资料行料试检,卷查并主和且要检了保测解护处现装理场置。设。备高中资料试卷布置情况与有关高中资料试卷电气系统接线等情况,然后根据规范与规程规定,制定设备调试高中资料试卷方案。

离散数学上机实验指导

离散数学上机实验指导

离散数学上机实验指导徐凤生如果你需要索取源程序,请发邮件至xfs@。

实验11实验内容(1)求任意一个命题公式的真值表。

(2)利用真值表求任意一个命题公式的主范式。

(3)利用真值表进行逻辑推理。

注:(2)和(3)可在(1)的基础上完成。

2实验目的真值表是命题逻辑中的一个十分重要的概念,利用它几乎可以解决命题逻辑中的所有问题。

例如,利用命题公式的真值表,可以判断命题公式的类型、求命题公式的主范式、判断两命题公式是否等价,还可以进行推理等。

本实验通过编写一个程序,让计算机给出命题公式的真值表,并在此基础上进行命题公式类型的判定、求命题公式的主范式等。

目的是让学生更加深刻地理解真值表的概念,并掌握真值表的求解方法及其在解决命题逻辑中其他问题中的应用。

3算法的主要思想利用计算机求命题公式真值表的关键是:①给出命题变元的每一组赋值;②计算命题公式在每一组赋值下的真值。

真值表中命题变元的取值具有如下规律:每列中0和1是交替出现的,且0和1连续出现的个数相同。

n个命题变元的每组赋值的生成算法可基于这种思想。

含有n个命题变元的命题公式的真值的计算采用的方法为“算符优先法”。

为了程序实现的方便,约定命题变元只用一个字母表示,非、合取、析取、条件和双条件联结词分别用!、&、|、-、+来表示。

算符之间的优先关系如表1-32所示:为实现算符优先算法,另一个称作OPND,用以寄存操作数或运算结果。

算法的基本思想是:(1)首先设置操作数栈为空栈,符号“@”为运算符的栈底元素;(2)调用函数Divi(exp,myopnd)得到命题公式包含的命题变元序列myopnd(按字典序排列,同一个命题变元只出现一次);(3)依次读入命题公式中的每个字符,若是命题变元则其对应的赋值进OPND栈,若是运算符,则和OPTR栈的栈顶运算符比较后作相应操作,直至整个命题公式求值完毕。

实验21实验内容(1)求任意两个集合的交集、并集、差集。

(2)求任意一个集合的幂集。

主范式的求法及应用

主范式的求法及应用
本人毕业论文与资料若有不实,愿意承担一切相关的法律责任。
论文作者签名:
年 月 日
摘 要
主式即主合取式与主析取式,它是数理逻辑中重要的基石也是推动计算机科学发展的动力,其方法与应用颇有价值.本文通过介绍主式的相关定理、定义并作出相应解释,以及由式的不唯一性引出主式的唯一性,得到求主式的三种方法:真值表法、真值指派法、等值演算法,并给出主式的四种应用:判断几个命题公式是否等价、命题公式的类型、求公式的成真成假赋、解决实际问题.
性质2.3[3]任意两个极大(小)项的析(合)取式永为1(0),即 时, .
性质2.4[3]每个极大(小)项当其真值指派与编码相同时,其真值为0(1),其余 种指派情况下均为1(0).
定义2.4[2]由不同极大(小)项组出的合取(析取)式称为主合(析)取式.
3
由于主式是由极大项或极小项构成,从极大项和极小项的定义,可知:
分类号O158单位代码11395
密 级 学 号1204210135
学生毕业论文
题 目
主式的求法及应用
作 者
王定超
院 (系)
数学与统计学院
专 业
数学与应用数学
指导教师
祁兰
答辩日期
2016年5月21日
榆 林 学 院
毕业论文诚信责任书
本人重声明:所呈交的毕业论文,是本人在导师的指导下独立进行研究所取得的成果。毕业论文中凡引用他人已经发表或未发表的成果、数据、观点等,均已明确注明出处。尽我所知,除文中已经注明引用的容外,本论文不包含任何其他个人或集体已经公开发表或撰写过的研究成果.对本文的研究做出重要贡献的个人和集体,均已在文中以明确方式标明.
因此,主合取式和主析取式有着“互补”关系[4].设命题公式 中含有 个命题变元,且 的主析取式中含有 个小项 ,则 的主析取式中必含有其余的 个小项,不妨含为 ,即 于是

含3个命题变项的命题公式的主合取范式

含3个命题变项的命题公式的主合取范式

含3个命题变项的命题公式的主合取范式是指将命题公式中的所有合取项都列出,并且将其中的命题变项取值情况都考虑进去,然后对这些合取项进行合取运算得到的一个式子。

那么,如何找到一个命题公式的主合取范式呢?我们需要找出命题公式中的所有合取项。

一个命题公式可以分解为多个合取项,每个合取项中包含若干个命题变项以及它们的否定。

对于含有3个命题变项的命题公式来说,我们需要列出所有可能的合取项。

这样的合取项总数是有限的,因为每个命题变项可以取真或假两种情况,所以总共有2^3=8种可能的合取项。

我们需要根据这8种合取项的取值情况进行合取运算。

合取运算的结果是真当且仅当所有合取项中的命题变项都取真。

我们可以根据这8种合取项的取值情况,得到合取运算的结果。

这个结果就是命题公式的主合取范式。

举个例子来说,如果我们有一个命题公式为(A∨¬B∨C)∧(¬A∨B∨¬C),其中A、B、C分别为三个命题变项。

那么我们首先列出所有可能的合取项:A为真,B为真,C为真,合取项为真;A为真,B为真,C为假,合取项为真;A为真,B为假,C为真,合取项为真;A为真,B为假,C为假,合取项为假;A为假,B为真,C为真,合取项为假;A为假,B为真,C为假,合取项为真;A为假,B为假,C为真,合取项为假;A为假,B为假,C为假,合取项为假。

我们进行合取运算,将所有合取项为真的情况进行合取运算,得到的结果就是命题公式的主合取范式。

含有3个命题变项的命题公式的主合取范式可以通过列出所有合取项的取值情况,并进行合取运算得到。

这样的方法可以很好地帮助我们理解命题公式的结构和逻辑含义。

个人观点上,我认为找到一个命题公式的主合取范式对于理解命题逻辑和解决相关问题是非常有帮助的。

通过找到主合取范式,我们可以清晰地看到命题公式中各个命题变项的逻辑关系,从而更好地理解整个命题公式的含义和结构。

对于含有多个命题变项的命题公式来说,找到其主合取范式是非常重要的。

命题逻辑中的析取范式与合取范式

命题逻辑中的析取范式与合取范式

命题逻辑中的析取范式与合取范式命题逻辑是形式逻辑的一个分支,主要研究命题之间的逻辑关系。

其中,析取范式(Disjunctive Normal Form,DNF)和合取范式(Conjunctive Normal Form,CNF)是常见的逻辑表达形式。

本文将详细介绍析取范式和合取范式的定义、性质以及在命题逻辑中的应用。

一、析取范式(DNF)1.1 定义在命题逻辑中,析取范式是一种命题逻辑公式的标准形式,即由多个子句的析取组成的命题逻辑公式。

子句是由多个命题变量的析取构成,形如 (p1 ∨ p2 ∨ ... ∨ pn),其中 p1、p2、...、pn 是命题变量或者它们的否定。

1.2 性质(1) 析取范式可以通过使用分配律和德摩根定律推导得到。

(2) 析取范式可以表达任意逻辑公式,即任意逻辑公式都可以转化为析取范式的形式。

1.3 应用(1) 析取范式在工程和计算机科学中有着广泛应用。

例如,在电路设计中,可以使用析取范式来描述不同的输入输出关系。

(2) 析取范式还可以在知识表示和推理的领域中应用,用于描述和推理复杂的逻辑关系。

二、合取范式(CNF)2.1 定义在命题逻辑中,合取范式是一种命题逻辑公式的标准形式,即由多个子句的合取组成的命题逻辑公式。

子句是由多个命题变量的合取构成,形如 (p1 ∧ p2 ∧ ... ∧ pn),其中 p1、p2、...、pn 是命题变量或者它们的否定。

2.2 性质(1) 合取范式可以通过使用分配律和德摩根定律推导得到。

(2) 合取范式可以表达任意逻辑公式,即任意逻辑公式都可以转化为合取范式的形式。

2.3 应用(1) 合取范式在逻辑推理和知识表示中具有重要作用。

例如,在人工智能的专家系统中,可以使用合取范式来表示专家知识,并进行推理和决策。

(2) 合取范式也可以应用于自动化推理、模型检查和程序验证等领域,用于描述和分析复杂系统的逻辑关系。

三、析取范式与合取范式的关系3.1 转化关系在命题逻辑中,任意逻辑公式都可以转化为析取范式和合取范式。

命题公式主范式的自动生成与形式输出

命题公式主范式的自动生成与形式输出
基础.
f , 若 P1 P ; 0 为
【, 若 卢 为 一P. 1 。
并且规定 , 应的二进制 数小 的极 大项 排在前面 . 对
通 常求 主范 式 的方 法 有 二. 是将 已知命 题 一
二进 制数 1a …a一 可 看成 对 应 极 大 项 的 编码 . 2 。 0
维普资讯
第 2 第 5期 O卷
20 0 6年 9月
甘 肃 n lo n u La h iest ( tr l ce cs o r a fGa s in eUnv ri Nau a in e ) y S
个 极大项 卢 V卢。 。 V… V卢 一 , 。使其 对应一个 二进
制 数 1a …a一 , 中 2 1 1其 0
F r 简记 为 C ) om, NF 是命 题 逻 辑 中一 类 很 重要 的 工 作. 因为命 题公 式 的主范式 ( 主合取 与 主析取 范
式 的 总称) DD 是 P分解 和进一 步进行 机器 处理 的
V0 _ O No 5 l2 .
Se t 2 06 p. 0
文章 编号 :1 7 —9 X【0 6 0 —0 90 6 26 1 20 )504 —4
命 题 公 式 主 范 式 的 自动 生 成 与 形 式 输 出
张 会 凌
( 肃 联 合 大 学 数 学 与信 息学 院 , 肃 兰 州 70 0 ) 甘 甘 30 0 摘 要 : 文 1 3和文 1 3的基 础 上 , 出 了命 题 逻辑 中 任 一 命 题 公 式 的 主 析 取 范式 和 主 合 取 范式 的 自动 生 在 - 1 - 2 给
量且 容易 出错 .
上 的统 一. 将 F 的真 值 表 “ 在 横排 ” , 左 到 右 后 从 依次 求得极 大项后 再 将其 合 取 , 果 即与 这里 的 结

计算机自动求解命题公式的主范式

计算机自动求解命题公式的主范式

3 计算机自动求解命题公式的主范式一.需求分析(1)用户输入一任意命题公式,计算机程序自动输出其主析取范式和主合取范式。

(2)求任意一个命题公式的真值表,并根据真值表求主范式。

(3)关于命题公式的形式和运算符(即联结词)的运算首先根据离散数学的相关知识,命题公式由命题变元和运算符(即联结词)组成,命题变元用大写字母英文表示(本次试验没有定义命题常元T和F,即T、F都表示命题变元),每个命题变元都有两种真值指派0和1,对应于一种真值指派,命题公式有一个真值,由所有可能的指派和命题公式相应的真值按照一定的规范构成的表格称为真值表。

目前离散数学里用到的包括扩充联结词总共有九种,即析取(或)、合取(与)、非、蕴含、等值、与非、或非、异或、蕴含否定,常用的为前五种,其中除了非运算为一元运算以外,其它四种为二元运算。

所以本次实验设计时只定义了前五种运算符,同时用“/”表示非,用“*”表示合取,用“+”表示析取,用“>”表示蕴含,用“:”表示等值,且这五种运算符的优先级依次降低,如果需用括号改变运算优先级,则用小括号()改变。

以下为上述五种运算符运算时的一般真值表,用P和Q表示命题变元:1.非,用“/”表示2. 合取(与),用“*”表示3.析取(或),用“+”表示4.蕴含,用“>”表示5.等值,用“:”表示下面是求取后缀表达式的规则:1.从中缀表达式左边起逐个字符判断,如果是命题变元,则直接输出;如果是运算符,则将其与当前有效栈顶字符(即非空,可能为运算符或左半括号;如果栈为空,则直接入栈)的优先级比较,如果大于栈顶字符优先级,则直接入栈,如果小于或等于栈顶字符优先级,则弹出栈中字符并输出,直到大于栈顶字符优先级;2.如果遇到左半括号,则直接入栈,也就是栈外左半括号的优先级最高,入栈以后,其优先级变为最低,也就是不管下一个字符是什么,该左半括号都不出栈,当且仅当遇到与其对应的右半括号时(遇到右半括号前,所有的字符按1中的规则或左半括号的入栈规则入栈或出栈),将栈中该左半括号以上的字符按照出栈规则弹出并输出,最后该左半括号出栈并和右半括号一起被丢掉(右半括号永不入栈),余下的字符不出栈;3.按照上述规则判断命题公式中的所有字符后,如果栈中还有有效字符,则依次弹出并输出。

命题公式主范式的求法及应用

命题公式主范式的求法及应用
(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世纪的下半个世纪,伴随着计算机科学技术的迅猛发展,新的逻辑学分支——数理逻辑也发展起来.数理逻辑也称为符号逻辑,是一门运用数学的方法来研究推理的形式结构和推理规律的边缘性学科.其内容相当广泛,包括逻辑演算(命题演算与谓词演算)、公理集合论、证明论、递归函数论等,其中逻辑演算是其它各部分的基础.它在逻辑电路、自动控制、人工智能、程序设计、数据库理论以及计算机科学的其它领域有着广泛的应用.

主范式的计算方法及其在命题公式中的作用

主范式的计算方法及其在命题公式中的作用
离散量并且与计算机本身的结构和用计算机可处理问题的离散性相一致故离散数学课程一直以来作为计算机科学与技术专业的一门重要专业基础课同时对于培养学生的抽象思维能力和逻辑推理能力也有着 学 报
Ju a fYih nC n g o rl o e u o e e n
e s n r cia a sa . v n t a c ae s e i o ma r . ie a d p a t l w y I e c lu t p ca n r l f ms c e o l l o Me n h l t e i o t n oe f p ca oma r r y t m‘ aw i e, h mp r trl so e i n r lf msa e s se a s l o aial ic se . t l d s u s d e y
辑 中对于理解和分析命题公式诸 多方 面的作 用。 关键词 :主析取 范式 ;主合取 范式 ;极 小项 ;极 大项 ;命题公式
中 图 分 类 号 :O 5 文 献 标 志 码 :A 文 章 编 号 :17 30 (0 1 4— 0 9— 2 18 6 1— 8 X 2 1 )0 0 3 0
和 。 )
定义 I2 6 在 n个变元 的基本积 中 ,若每一个变 元 . -]
与其否定不 同时存 在 ,而两 者之 一必 出现 一次 且仅 出现 一
次 ,则这种基本积 叫极 小项 ;在 n个 变元 的基 本 和 中,若
每一个 变元与其否 定不 同时存 在 ,而 两者 之一 必 出现一次
Ab t a t r dt n lc l u a in me h d fs e i o ma omsa e c mpe n mah mai a g c sr c :T a i o a a c l t to so p c a n r l f r r o lX i t e t l Z l.By u i g c a a tr ai n fte i o l c o sn h r ce i t so 1 z o l

离散数学求命题公式的主析取范式和主合取范式

离散数学求命题公式的主析取范式和主合取范式

离散数学求命题公式的主析取范式和主合取范式Description输⼊命题公式的合式公式,求出公式的真值表,并输出该公式的主合取范式和主析取范式。

Input命题公式的合式公式Output公式的主析取范式和主合取范式,输出形式为:“ mi ∨ mj ; Mi ∧ Mj” ,极⼩项和∨符号之间有⼀个空格,极⼤项和∧符号之间有⼀个空格;主析取范式和主合取范式之间⽤“ ; ”隔开,“ ; ”前后各有⼀个空格。

永真式的主合取范式为 1 ,永假式的主析取范式为 0 。

输⼊公式的符号说明:! ⾮,相当于书⾯符号中的 “ ¬ ”& 与,相当于书⾯符号中的 “ ∧ ”| 或,相当于书⾯符号中的 “ ∨ ”蕴含联结词,相当于书⾯符号中的 “ → ”等价联结词,相当于书⾯符号中的 “ ↔ ”( 前括号) 后括号Code#include <cstdio>#include <cstring>#include <cmath>#define N 1000#define MAX 10000000char s[N];bool table[30];int explain[30];int value[MAX];int sum = 0;int priority(char c){switch (c){case '#': return -1;case '!': return 5;case '&': return 4;case '|': return 3;case '-': return 2;case '+': return 1;case '(': return 0;default: return 0;}}void postfix(){char post[N] = { '\0' };int pp = -1;char stack[N] = { '#' };int ps = 0;int len = strlen(s);for (int i = 0; i < len; i++){if (s[i] >= 'a' && s[i] <= 'z'){post[++pp] = s[i];continue;}if (s[i] == '!' || s[i] == '&' || s[i] == '|' || s[i] == '-' || s[i] == '+'){while (priority(s[i]) <= priority(stack[ps]))post[++pp] = stack[ps--];stack[++ps] = s[i];continue;}if (s[i] == '('){stack[++ps] = s[i];continue;}if (s[i] == ')'){while (stack[ps] != '(') post[++pp] = stack[ps--];ps--;continue;}}while (ps) post[++pp] = stack[ps--];strcpy(s, post);int l = strlen(s);}void settable(){memset(table, 0, sizeof(table));int len = strlen(s);for (int i = 0; i < len; i++){if (s[i] >= 'a' && s[i] < 'z')table[s[i] - 'a'] = true;}for (int i = 0; i < 26; i++)if (table[i]) sum++;sum = pow(2, sum);}int btoi(){int sum = 0, weight = 1;for (int i = 25; i >= 0; i--)if (table[i]){if (explain[i]) sum += weight;weight *= 2;}return sum;}int calc(int a, int b, char c){switch (c){case '&': return a * b;case '|': if (a + b) return 1; else return 0;case '-': if (a == 1 && b == 0) return 0; else return 1; case '+': return !((a + b) & 1);}}int work(){int stack[N], ps = -1;int len = strlen(s);for (int i = 0; i < len; i++){if (s[i] >= 'a' && s[i] <= 'z'){stack[++ps] = explain[s[i] - 'a'];continue;}if (s[i] == '!'){stack[ps] = (stack[ps] + 1) & 1;continue;}int ans = calc(stack[ps - 1], stack[ps], s[i]);stack[--ps] = ans;}return stack[0];}void assign(){int x = btoi();int ans = work();value[x] = ans;}void generate(char c){while (c <= 'z' && table[c - 'a'] == false) c++;if (c > 'z'){assign();return;}explain[c - 'a'] = 0;generate(c + 1);explain[c - 'a'] = 1;generate(c + 1);}void output1(){int i = 0;while (i < sum && !value[i]) i++;if (i >= sum){printf("0 ; ");return;}printf("m%d", i);for (i++; i < sum; i++)if (value[i]) printf(" ∨ m%d", i);printf(" ; ");}void output2(){int i = 0;while (i < sum && value[i]) i++;if (i >= sum){printf("1\n");return;}printf("M%d", i);for (i++; i < sum; i++)if (!value[i]) printf(" ∧ M%d", i);printf("\n");}int main(){scanf("%s", s);postfix();settable();memset(value, 0, sizeof(value));memset(explain, 0, sizeof(explain)); generate('a');output1();output2();return 0;}。

如何求得公式的求主析取和主合取范式

如何求得公式的求主析取和主合取范式

14
主析取范式:一个由不同的极小项之和构成的公式, 叫主析取范式,如果它与给定的命题公式A等价,则称 它是A的主析取范式。
定理(主析取范式存在定理) 任何不为矛盾式的命题公式一定存在着与其等价的 主析取范式。
2016/10/21
15
证 设A为一个不是矛盾式的公式,先求出A的析取范式A,然后再 进行如下的构造性算法:
2016/10/21
二进制数 十进制数 记号mi 0 0 0 0 m0 0 0 1 1 m1 0 1 0 2 m2 0 1 1 3 m3 1 0 0 4 m4 1 0 1 5 m5 1 1 0 6 m6 1 1 1 7 m7
12
一般地,n个变元的极小项是: m0 P1P2P3…Pn m1 P1P2P3…Pn ……… m2n-1 P1P2P3…Pn
2016/10/21
2
定理(范式存在定理) 任何命题公式都存在与之等价的析取范式和合取范式 求范式的构造性算法,其步骤如下:
① 对任何公式A,首先消去、等其它联结词,只保 留联结词、、。常用到公式 P Q P Q , PQ (PQ)(QP), (PQ)(PQ) (合取范式) (PQ)(PQ) (析取范式)。
①展开 如果A的某基本积B中不含命题变元Pi或其否定Pi,则 将B展开如下: B BT B(PiPi) (BPi)(BPi) ②消去 将重复出现的命题变元(变元否定)、矛盾式、重复出现 的极小项都消去。 (用 PPP, PPF,mimimi)。 ③排序 将极小项按由小到大(或由大到小)顺序排列。 为表达简洁,用∑表极小项的析取。 如 m1m3m5,记成 ∑(1,3,5)
2016/10/21
6
主析取范式和主合取范式
范式为命题公式提供了一种统一的表达形式,给公 式的判定问题提供了一种比较简便的方法。但 ①析取范式和合取范式都不唯一,仍然给研究问题带 来不便; ②对偶然式,公式成真(假)的指派还不是一目了然。

c语言离散数学 命题公式逻辑联结词及真值表应用

c语言离散数学 命题公式逻辑联结词及真值表应用

C语言与离散数学在计算机科学中起着至关重要的作用,而命题、公式、逻辑联结词及真值表是离散数学中的重要概念,在C语言中也有着广泛的应用。

本文将介绍C语言与离散数学中命题、公式、逻辑联结词及真值表的相关概念,并讨论它们在程序设计与计算机科学中的应用。

一、命题在离散数学中,命题是指可以明确判断真假的陈述。

在C语言中,命题通常被用于控制程序的流程,例如条件语句中的判断条件。

命题通常具有以下特点:1. 命题具有唯一的确定性,即任何一个命题要么为真,要么为假;2. 命题可以由自然语言或符号表示;3. 命题可以进行逻辑运算,如与、或、非等。

二、公式公式是离散数学中的重要概念,它由命题和逻辑联结词组成。

在C语言中,公式通常被用于逻辑表达式的表示,例如在循环或条件语句中的判断条件。

公式具有以下特点:1. 公式由命题和逻辑联结词组成;2. 公式可以通过推理和演绎来进行逻辑推理;3. 公式可以用真值表来进行验证。

三、逻辑联结词在离散数学中,逻辑联结词是用来连接命题,构成公式的重要符号。

在C语言中,逻辑联结词通常被用于逻辑表达式中,用来表示逻辑运算的关系。

常见的逻辑联结词有:1. 与():表示逻辑与运算,只有所有命题都为真时,整个公式才为真;2. 或(||):表示逻辑或运算,只要有一个命题为真,整个公式就为真;3. 非(!):表示逻辑非运算,将真变为假,假变为真。

四、真值表真值表是用来验证公式真假的一种方法,在离散数学中具有重要意义。

在C语言中,真值表通常被用于逻辑表达式的验证。

真值表具有以下特点:1. 真值表由多个命题和对应的公式真假组成;2. 真值表可以通过逻辑联结词来进行推理和验证;3. 真值表可以用来确定公式的真假和逻辑关系。

总结:C语言与离散数学中的命题、公式、逻辑联结词及真值表都是非常重要的概念,在程序设计与计算机科学中有着广泛的应用。

掌握这些概念不仅可以帮助我们更好地理解程序的运行原理,也可以提高我们的逻辑推理能力。

1-4 主范式

1-4 主范式
离散数学西安电子科技大学软件学院第一篇数理逻辑11命题第1课时第1章命题逻辑13逻辑等价式与永真蕴含式12命题公式14主范式15命题逻辑的推理与证明方法第2课时第3课时第4课时第5课时16命题逻辑的应用第6课时西安电子科技大学软件学院主析取范式141极小项含n个命题变元的极小项是所有这n个变元或其否定形式恰出现一次所构成的合取式这样的极小项共有2n个
§1.4.2 主合取范式
方法一、真值表法
西安电子科技大学 软件学院
【例题】求命题公式A=¬P ∧ (Q → R)的主合取范式。
§1.4.2 主合取范式
方法二、等价推演法
西安电子科技大学 软件学院
【例题】求命题公式A=¬P∧(Q→R)的主合取范式。
A⇔ ⇔ ⇔
¬P∧(¬ Q ∨R) (¬P∨(Q∧¬Q)∨(R∧¬R) )∧((P∧¬P)∨¬Q∨R) (¬P∨Q∨R)∧(¬P∨Q∨¬R)∧(¬P∨¬Q∨R) ∧(¬P∨¬Q∨¬R )∧(P∨¬Q∨R)∧(¬P∨¬Q∨ R)
极小项
西安电子科技大学 软件学院
例如,以下是含有三个命题变元P,Q,R的极小项:
P1 ∧ ¬P2 ∧ P3
该极小项的编号为: 1 记为: 0 1
m5
含n个命题变元的极小项共有2n个, 编号为0~2n-1。
§1.4.1 主析取范式
000 001 010 011 100 101 110 111 m0 = m1 = m2 = m3 = m4 = m5 = m6 = m7 =
§1.4.2 主合取范式
极大项
西安电子科技大学 软件学院
例如,以下是含有三个命题变元P,Q,R的极大项:
P ∨ ¬Q ∨ R
该极大项的编号为: 0 记为: 1 0
M2

命题逻辑中主范式的求法

命题逻辑中主范式的求法

命题逻辑中主范式的求法以《命题逻辑中主范式的求法》为标题,写一篇3000字的中文文章命题逻辑是哲学上重要的一种逻辑学派,它主要以命题(Statement)作为分析对象,而命题逻辑中主要范式(standard form)是生成命题逻辑知识体系的重要基础。

因此,研究命题逻辑的主范式的求法就显得格外重要。

命题逻辑中的主范式是由三部分构成的,即前提(premise)、结论(conclusion)以及中介语(intermediate),它们之间的联系是“前提、中介语为假设,结论为结果”的逻辑关系。

求法的方法主要有两种:一种是把命题逻辑的题目拆解成前提、结论以及中介语三部分,然后从中分析推理出其他部分,拼接成主范式;另一种是从前提中抽象出抽象类比概念,然后把结论句拆解为前、后两部分,并从抽象类比概念中推出结论的必要条件,这样也可以组合成主范式。

求法的步骤主要如下:首先,要明确思路,分析题目中体现出的前提、结论以及中介语,弄清楚它们之间的逻辑关系;其次,根据前提,分析出相应的抽象类比概念,尽可能地采用抽象类比概念,这样便于引入更多的推理;再次,要把结论句拆解成前、后两部分,以此来把结论句与抽象概念联系起来;最后,根据抽象概念,推出结论的必要条件,组合前提和结论,构成命题逻辑的主范式。

在求法中,由于题目的不同,可能包含的推理也不尽相同,因此,需要发挥自己的创造性,及时正确地把握题目,以便于正确地求出主范式。

此外,求法时要注意用语的准确性,这样能够使命题逻辑中的主范式更加清晰,使推理更加合理,更能体现逻辑性。

命题逻辑求法是一门艰巨而又有趣的学问,涉及到知识广泛。

在求法中,要综合运用哲学、逻辑学等多种知识,谨慎求取命题逻辑中的主范式,以此来达到提高自己的思维能力的目的。

综上所述,进行求法的过程,要注意抓住题目本身的矛盾点,精准把握题目的内涵,正确准确地把握题目,逐步推理出主范式。

一方面,要熟悉各种概念以及主范式的构成等;另一方面,要加强针对性的训练,以开发出对主范式的求法的技巧。

离散数学主析取范式主合取范式

离散数学主析取范式主合取范式

离散数学主析取范式主合取范式主析取范式和主合取范式是离散数学中逻辑表达式的两种常见形式。

它们在逻辑推理、计算机科学和人工智能等领域具有重要的应用价值。

本文将介绍主析取范式和主合取范式的概念、特性以及如何通过布尔运算将任意逻辑表达式转化为主析取范式或主合取范式。

一、主析取范式(DNF)主析取范式是一个逻辑表达式的标准形式,它由多个子句的析取组成。

每个子句由多个文字的合取构成。

主析取范式的最简形式是由至少一个子句组成的合取。

例如,逻辑表达式(A ∧ B) ∨ (C ∧ D ∧ E)就是一个主析取范式。

其中,(A ∧ B) 和 (C ∧ D ∧ E) 是两个子句,分别由 A、B 和 C、D、E 构成。

主析取范式的特性:1. 每个子句中的文字可以是变量或其否定形式。

2. 主析取范式中的每个文字都是变量的析取或否定析取。

3. 主析取范式可以使用布尔运算来简化和优化。

如何得到主析取范式?可以通过真值表法或布尔代数的演算法来将任意逻辑表达式转化为主析取范式。

方法如下:2. 找到真值表中使得逻辑表达式为真的行。

3. 对每一行,在真值为真的列上取出对应的文字,并将它们合取起来构成一个子句。

4. 将所有子句析取起来得到主析取范式。

二、主合取范式(CNF)主合取范式是一个逻辑表达式的标准形式,它由多个子句的合取组成。

每个子句由多个文字的析取构成。

主合取范式的最简形式是由至少一个子句组成的析取。

例如,逻辑表达式(A ∨ B) ∧ (C ∨ D ∨ E)就是一个主合取范式。

其中,(A ∨ B) 和 (C ∨ D ∨ E) 是两个子句,分别由 A、B 和 C、D、E 构成。

主合取范式的特性:1. 每个子句中的文字可以是变量或其否定形式。

2. 主合取范式中的每个文字都是变量的合取或否定合取。

3. 主合取范式可以使用布尔运算来简化和优化。

如何得到主合取范式?可以通过真值表法或布尔代数的演算法来将任意逻辑表达式转化为主合取范式。

离散数学求主范式

离散数学求主范式

离散数学求主范式
离散数学求主范式,是用离散数学来解决可表示为一组方程式的问题的一种方法。


范式是指一个系统中最关键的概念,在求解问题的过程中,常常需要求解各种范式的参数,主范式则是一种包含一组参数的范式,在求解问题的过程中,它可以作为一个框架,来解
释和描述问题,同时又能保持其参数不变。

首先,在处理离散问题时,首先要构造适当的解析表达式,其中解析表达式包括各种
数学符号和函数,它把原问题分解成小问题。

接下来,确定主范式的参数。

由于主范式包含一组参数,因此在求解主范式之前,首
先要确定参数的具体值。

然后,通过求导的方法,求出主范式的递推式,确定属于主范式的公式,即每次变化
的公式,以及计算各种参数的方法,根据这种方法,可以得到所需要的主范式和相应的参数。

最后,要根据实际问题设置好初始值,并用计算机对主范式进行求解。

根据设定的初
始值和步骤,系统将会自动地求解出所有相关的参数以及结果。

通过离散数学求主范式,可以使问题的解非常清晰明了,可以使用计算机快速有效地
解决问题,并可以有效地控制每个步骤的参数,使得结果更准确。

含3个命题变项的命题公式的主合取范式

含3个命题变项的命题公式的主合取范式

含3个命题变项的命题公式的主合取范式含有三个命题变项的命题公式的主合取范式是一个由三个命题变项构成的复合命题,其中每个命题变项都可以取两个真值(真或假)。

主合取范式是将这些命题变项进行逻辑连接,并且其中每个命题变项都是合取范式的一个子项。

在计算机科学、数学和逻辑学等领域中,主合取范式有着重要的应用和研究价值。

本文将首先介绍命题公式以及主合取范式的基本概念和定义。

我们将通过具体的例子来解释和说明含有三个命题变项的命题公式的主合取范式的构造方法和计算过程。

我们将从个人观点出发,讨论主合取范式在现实生活和学术研究中的应用和意义。

一、命题公式和主合取范式的基本概念命题公式是由命题变项、逻辑运算符和括号组成的符号串,它可以由若干个命题变项通过逻辑运算符进行合取、析取、非运算等逻辑连接而成。

在命题逻辑中,命题公式是表示命题间关系的一种方式。

命题公式"p ∧ q" 表示命题 "p" 和命题 "q" 的合取,即只有当两个命题都为真时,命题公式才为真。

主合取范式是一种特殊的合取范式,它是由若干个合取子式通过析取运算而组合而成。

主合取范式表示了命题公式的完备合取形式,即通过将各个子式进行析取,将命题公式的所有真值情况都考虑到。

在含有三个命题变项的命题公式中,主合取范式将包含所有可能的真值情况,并以析取的方式进行组合。

二、含有三个命题变项的命题公式的主合取范式的构造方法我们以一个具体的例子来说明含有三个命题变项的命题公式的主合取范式的构造方法。

考虑命题公式"p ∧ q ∨ r",其中 "p"、"q" 和 "r" 是三个命题变项。

我们可以将"p ∧ q" 和 "r" 进行析取,得到两个合取子式。

将这两个合取子式进行析取,得到最终的主合取范式。

公式法的公式

公式法的公式

公式法的公式
公式法是一种推理和判断的方法,它既能够将规范的命题变成可解的表达,也可以用来求出客观定理的结论。

它是一种基于数学逻辑和数据分析方法,以及人类智慧与经验的结合,可以有效把复杂现象解释成简单证明的形式,帮助我们更好地理解概念,从而为全新的发现和创新打下更好的基础。

公式法有三个主要步骤:
1.定表达:首先,需要明确表达问题,并把它表达成明确的可解的公式。

例如,在问题“如何求解三角形的面积”中,表达可以被写成S=1/2*a*b,该公式表示三角形的面积=1/2x底边x高。

2.导公式:其次,需要使用数学公式、图形运算以及计算机程序来推导出可以用于求解问题的公式表达,并对数学公式做出解释,以便理解它的运作原理。

3.命题推理:最后,基于推导出的公式表达,根据给定条件进行推理,最终得出客观定理的结论。

公式法作为一种科学方法,已被广泛应用于各行各业领域,其中包括物理学、数学、经济学、金融学、工程学等等。

除了用于复杂问题的推理与分析外,公式法也可以用来模拟实际现象,为做出正确决策提供基础。

而且,近年来,公式法在机器学习研究中也得到了广泛的应用,如改进的回归模型、卷积神经网络以及深度学习等。

这些技术能够根据大量数据,自动构建有效的公式模型,让模型更好地模拟现实环境
的运行状况,从而用精确的方式实现预测和控制。

总而言之,公式法是一种极为有效的科学技术,它可以帮助我们更好地理解和处理复杂现象,为新知识的发现和创新创造了更多的可能。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

3 计算机自动求解命题公式的主范式一.需求分析(1)用户输入一任意命题公式,计算机程序自动输出其主析取范式和主合取范式。

(2)求任意一个命题公式的真值表,并根据真值表求主范式。

(3)关于命题公式的形式和运算符(即联结词)的运算首先根据离散数学的相关知识,命题公式由命题变元和运算符(即联结词)组成,命题变元用大写字母英文表示(本次试验没有定义命题常元T和F,即T、F都表示命题变元),每个命题变元都有两种真值指派0和1,对应于一种真值指派,命题公式有一个真值,由所有可能的指派和命题公式相应的真值按照一定的规范构成的表格称为真值表。

目前离散数学里用到的包括扩充联结词总共有九种,即析取(或)、合取(与)、非、蕴含、等值、与非、或非、异或、蕴含否定,常用的为前五种,其中除了非运算为一元运算以外,其它四种为二元运算。

所以本次实验设计时只定义了前五种运算符,同时用“/”表示非,用“*”表示合取,用“+”表示析取,用“>”表示蕴含,用“:”表示等值,且这五种运算符的优先级依次降低,如果需用括号改变运算优先级,则用小括号()改变。

以下为上述五种运算符运算时的一般真值表,用P和Q表示命题变元:1.非,用“/”表示2. 合取(与),用“*”表示3.析取(或),用“+”表示4.蕴含,用“>”表示5.等值,用“:”表示下面是求取后缀表达式的规则:1.从中缀表达式左边起逐个字符判断,如果是命题变元,则直接输出;如果是运算符,则将其与当前有效栈顶字符(即非空,可能为运算符或左半括号;如果栈为空,则直接入栈)的优先级比较,如果大于栈顶字符优先级,则直接入栈,如果小于或等于栈顶字符优先级,则弹出栈中字符并输出,直到大于栈顶字符优先级;2.如果遇到左半括号,则直接入栈,也就是栈外左半括号的优先级最高,入栈以后,其优先级变为最低,也就是不管下一个字符是什么,该左半括号都不出栈,当且仅当遇到与其对应的右半括号时(遇到右半括号前,所有的字符按1中的规则或左半括号的入栈规则入栈或出栈),将栈中该左半括号以上的字符按照出栈规则弹出并输出,最后该左半括号出栈并和右半括号一起被丢掉(右半括号永不入栈),余下的字符不出栈;3.按照上述规则判断命题公式中的所有字符后,如果栈中还有有效字符,则依次弹出并输出。

以/A*(B+/C)为例,说明后缀表达式的求法:(二)概要分析。

(三)详细设计1、输入合法命题公式的地址。

其流程图如下四、调试分析在输入命题公式时要注意输入格式区分大小写,要理解程序的含义五、使用说明输入任意命题公式,按回车结束,然后会列出真值表,根据真值表会列出其主析取主合取范式。

得到客户需要的结果。

六、源程序清单#include <stdio.h>#include <stdlib.h>#include <string.h>/*-----------------------------------------------------------------------*/ //Read the propositional formula, and judges its validity, if the illegal to re-enter/*-----------------------------------------------------------------------*/ char *pp,formula[100]={0};int valid=1;char *getformula(){char temp[100]={0},tempsign[3]={0};int i,j,len,flag=0;printf("\nPlease enter a propositional formula\n");printf("\n\"/\"said non,\"*\"to denote conjunction,\"and\"said disjunction,\",\"said contains,\"said:\"equivalent\n");printf("\n brackets are\"\"()said:\n");printf("\nPropositional variable uppercase English letters, to the end of the Enter key input:\n\n");while(flag==0){gets(temp);if(temp[0]=='\0'){valid=0;break;}for(j=0,i=0;*(temp+i);i++)if(*(temp+i)!=' '){*(formula+j)=*(temp+i);j++;}len=strlen(formula);if(!(formula[len-1]>=65&&formula[len-1]<=90||formula[len-1]==')')|| !((formula[0]>=65&&formula[0]<=90)||formula[0]=='('||formula[0]= ='/'))flag=0;else{for(pp=formula;*pp!='\0';pp++){if(!((*pp>=65&&*pp<=90)||*pp=='/'||*pp=='*'||*pp=='+'||*pp=='>'||*pp==':'||*pp= ='('||*pp==')')){flag=0;break;}else{tempsign[0]=*pp;tempsign[1]=*(pp+1);tempsign[2]='\0';if(strcmp(tempsign,"(+")==0||strcmp(tempsign,"(*")==0||strcmp(tempsign,"/)")==0 ||strcmp(tempsign,"+)")==0||strcmp(tempsign,"*)")==0||strcmp(tempsign,")/")==0||strcmp(tempsign,"*+")==0||strcmp(tempsign,"/*")==0||strcmp(tempsign,")(")==0||strcmp(tempsign,"+*")==0||strcmp(tempsign,"/+")==0||strcmp(tempsign,"()")==0||strcmp(tempsign,">+")==0||strcmp(tempsign,"+>")==0||strcmp(tempsign,"*>")==0||strcmp(tempsign,">*")==0||strcmp(tempsign,"(>")==0||strcmp(tempsign,">)")==0||strcmp(tempsign,"/>")==0||strcmp(tempsign,"+:")==0||strcmp(tempsign,":+")==0||strcmp(tempsign,"*:")==0||strcmp(tempsign,":*")==0||strcmp(tempsign,":>")==0||strcmp(tempsign,">:")==0||strcmp(tempsign,"/:")==0||strcmp(tempsign,"(:")==0|| strcmp(tempsign,":)")==0){flag=0;break;}if((tempsign[0]>=65&&tempsign[0]<=90)&&(tempsign[1]>=65&&tempsign[1]<=90)) {flag=0;break;}if(((tempsign[0]>=65&&tempsign[0]<=90)&&(tempsign[1]=='/'||tempsign[1]=='('))||((tempsign[1]>=65&&tempsign[1]<=90)&&tempsign[0]==')')){flag=0;break;}elseflag=1;}}}if(flag==0){printf("Expression is in error, please enter again:\n");for(i=0;*(temp+i)!='\0';i++)*(temp+i)='\0';for(i=0;*(formula+i)!='\0';i++)*(formula+i)='\0';}}pp=formula;// if(flag!=0)printf("%s",pp);return pp;}/*-----------------------------------------------------------------------*/ //Infix expression into a suffix expression is in error, please enter again /*-----------------------------------------------------------------------*/ char suf_formula[100]={0};char *convert_suffix(char *formula){// char plus,and,not,left,right;char stack[30],digit_stack[30];char *pt;int i=0,j=0,top=1,digit_top=1;pt=formula;for(i=0;*pt;pt++){if(*pt>=65&&*pt<=90)suf_formula[i++]=*pt;elseswitch(*pt)//优先级高低顺序,栈内(、:、>、+、*、/依次升高,分别用1、2、3、4、5、6表示 {case ':':// if(stack[0]=='\0')// {// stack[top++]='+';// digit_stack[digit_top++]=2;// }// else{for(;2<=digit_stack[digit_top-1];top--,digit_top--){suf_formula[i++]=stack[top-1];stack[top-1]='\0';digit_stack[digit_top-1]=0;}stack[top++]=':';digit_stack[digit_top++]=2;}break;case '>':// if(stack[0]=='\0')// {// stack[top++]='+';// digit_stack[digit_top++]=2;// }// else{for(;3<=digit_stack[digit_top-1];top--,digit_top--){suf_formula[i++]=stack[top-1];stack[top-1]='\0';digit_stack[digit_top-1]=0;}stack[top++]='>';digit_stack[digit_top++]=3;}break;case '+':// if(stack[0]=='\0')// {// stack[top++]='+';// digit_stack[digit_top++]=2;// }// else{for(;4<=digit_stack[digit_top-1];top--,digit_top--){suf_formula[i++]=stack[top-1];stack[top-1]='\0';digit_stack[digit_top-1]=0;}stack[top++]='+';digit_stack[digit_top++]=4;}break;case '*': //if(stack[0]=='\0')// {// stack[top++]='+';// digit_stack[digit_top++]=3;// }//elsefor(;5<=digit_stack[top-1];top--,digit_top--){suf_formula[i++]=stack[top-1];stack[top-1]='\0';digit_stack[digit_top-1]=0;}stack[top++]='*';digit_stack[digit_top++]=5;}break;case '/':// if(stack[0]=='\0')// {// stack[top++]='+';// digit_stack[digit_top++]=4;// }// else{for(;6<=digit_stack[top-1];top--,digit_top--){suf_formula[i++]=stack[top-1];stack[top-1]='\0';digit_stack[digit_top-1]=0;}stack[top++]='/';digit_stack[digit_top++]=6;}break;case '(': stack[top++]='(';digit_stack[digit_top++]=1;break;case ')': for(;stack[top-1]!='(';top--,digit_top--)suf_formula[i++]=stack[top-1];stack[top-1]='\0';digit_stack[digit_top-1]=0;}stack[top-1]='\0';digit_stack[top-1]=0;top--;digit_top--;break;default:;}}for(;top>=1;i++,top--){if(stack[top-1])suf_formula[i]=stack[top-1];}printf("\n");// printf("%s\n",suf_formula);return suf_formula;}/*---------------------------------------------------------------------------*/// Statistical suffix expression the variable/*---------------------------------------------------------------------------*/char var[16]={0};void variable(char *suf_formula){int i,j,len=0,flag=0;char temp;for(i=0;*(suf_formula+i);i++)//统计后缀表达式中的{ //变元if(suf_formula[i]>=65&&suf_formula[i]<=90) //{ //for(j=0;*(var+j);j++)if(suf_formula[i]==var[j]){flag=1;break;}if(flag!=1){len=strlen(var);var[len]=suf_formula[i];}flag=0;}}for(i=0;*(var+i);i++) //从小到大排列变元for(j=i+1;*(var+j);j++)if(var[i]>var[j]){temp=var[i];var[i]=var[j];var[j]=temp;}// return var;}/*-----------------------------------------------------------------------*/ // Calculate the value of the suffix expressions/*-----------------------------------------------------------------------*/ char normal_form[100][16]={0};void calc(char *suf_formula){char bin_val[16]={0}; //指派真值char suf_val[100]={0}; //后缀表达式相应的变元真值、运算符构成的序列inti,j,end=0,sum,result=1,index,temp_index,flag=0,xiqu_num=0,hequ_num=0;char *p,temp;int xiqu[50]={0},hequ[50]={0};variable(suf_formula);index=strlen(var);temp_index=index;if(index==0) //根据变元数计算指派的真值的最大值 result=1;elsefor(;temp_index>0;temp_index--)result=result*2;printf("\nExpression of truth value table as follows\n\n");for(i=0;*(var+i);i++)printf("%c ",*(var+i));printf("\t\t");printf("%s\n\n",formula);for(sum=0;sum<result;sum++){j=sum;for(i=0;i<16;i++)bin_val[i]=0+'0';for(i=0;j!=0;i++) //指派的真值以二进制字符串形式存储{bin_val[i]=j%2+'0';j=j/2;}// printf("%s\n",formula);// for(i=0;*(var+i);i++) //输出公式中所含变元// printf("%c ",*(var+i));// printf("\n");for(j=index;j>0;j--) //输出指派的真值printf("%d ",bin_val[j-1]-'0');// printf("\n");strcpy(suf_val,suf_formula);for(i=0;i<index/2;i++)//因变元(大写英文字母 )从小到大排列 ,以A为最高位,{ //而上面指派的真值刚好从bin_val低位(对应A位)开始,temp=bin_val[i]; //故需将真值序列反序bin_val[i]=bin_val[index-i-1];bin_val[index-i-1]=temp;}for(i=0;suf_formula[i];i++)for(j=0;var[j];j++)if(var[j]==suf_formula[i])suf_val[i]=bin_val[j];// printf("\n%s",suf_val);p=suf_val;for(i=0;*(p+i);) //计算由变元和运算符构成的后缀表达式 {switch(*(p+i)){case ':': if(*(p+i-1)==*(p+i-2)){*(p+i-2)='1';for(j=i+1;*(p+j);j++)*(p+j-2)=*(p+j);*(p+j-1)='\0';*(p+j-2)='\0';// printf("\n%s\n",suf_val);}else{*(p+i-2)='0';for(j=i+1;*(p+j);j++)*(p+j-2)=*(p+j);*(p+j-1)='\0';*(p+j-2)='\0';// printf("\n%s\n",suf_val); }i=0;break;case '>': if(*(p+i-1)=='0'&&*(p+i-2)=='1') {*(p+i-2)='0';for(j=i+1;*(p+j);j++)*(p+j-2)=*(p+j);*(p+j-1)='\0';*(p+j-2)='\0';// printf("\n%s\n",suf_val); }else{*(p+i-2)='1';for(j=i+1;*(p+j);j++)*(p+j-2)=*(p+j);*(p+j-1)='\0';*(p+j-2)='\0';// printf("\n%s\n",suf_val); }i=0;break;case '+': if(*(p+i-1)=='1'&&*(p+i-2)=='1') {*(p+i-2)='1';for(j=i+1;*(p+j);j++)*(p+j-2)=*(p+j);*(p+j-1)='\0';*(p+j-2)='\0';// printf("\n%s\n",suf_val);}else{*(p+i-2)=(*(p+i-2)-'0')+(*(p+i-1)-'0')+'0'; for(j=i+1;*(p+j);j++)*(p+j-2)=*(p+j);*(p+j-1)='\0';*(p+j-2)='\0';// printf("\n%s\n",suf_val);}i=0;break;case '*': *(p+i-2)= (*(p+i-2)-'0')*(*(p+i-1)-'0')+'0';for(j=i+1;*(p+j);j++)*(p+j-2)=*(p+j);*(p+j-1)='\0';*(p+j-2)='\0';// printf("\n%s\n",suf_val);for(j=i+1;*(p+j);j++)*(p+j-1)=*(p+j);*(p+j-1)='\0';// printf("\n%s\n",suf_val);i=0;break;default: i++;if(*(suf_val+1)=='\0')end=1;}if(end==1)break;}end=0;printf("\t\t%d\n",*p-'0');if(*p-'0'==1)xiqu[xiqu_num++]=sum+1;elseif(*p-'0'==0)hequ[hequ_num++]=sum+1;}printf("\nPrincipal disjunctive normal form is as follows:\n\n");for(i=0;xiqu[i]!=0;i++){printf("M%d",xiqu[i]-1);if(xiqu[i+1]!=0)printf("+");// if((i+1)%6==0) printf("\n");}printf("\n\nPrincipal conjunctive as follows:\n\n");for(i=0;hequ[i]!=0;i++){printf("m%d",hequ[i]-1);if(hequ[i+1]!=0)printf("*");// if((i+1)%6==0) printf("\n");}}/*-----------------------------------------------------------------------*/ // The main function/*-----------------------------------------------------------------------*/int main(){char *formula;formula=getformula();if(valid==1)//输入的表达式非空才可继续执行(即第一个字符不是回车符){convert_suffix(formula);calc(suf_formula);}getchar();return 0;}七截图是否 开始pp=formula ,i=-1i++,*(pp+i)(1) 真值i++,*(temp+i )非空 i=0 *(temp+i+1)非空 *(temp+i)=运算符 输出结果,即temp[0] 真值指派完毕 结束。

相关文档
最新文档