人工智能-化为子句集的九步法实验

合集下载

包括某些推理规则以及置换合一等概念。但对于许多比较复

包括某些推理规则以及置换合一等概念。但对于许多比较复
S(x,y)∨~M(y)∨I(f(x)),~S(x,y)∨~ M(y)∨E(x,f(x)),~I(z),S(a,b),M(b)} ③把新产生的集合S’化成子句集,即 S’= {~ S(x,y)∨~M(y)∨I(f(x)),~S(x,y)∨~M(y)∨ E(x,f(x)),~I(z), S(a,b), M(b) }
P[y,f(A)] 进一步消解得消解式为:P[y,f(y)]
18
可见这两个子句消解一共可得4个不同的消解式, 其中3个是消解P得到的,而另一个是由消解Q得 到的。
下面举几个对含有变量的子句使用消解的例子。
例1:
例2:
19
例3:
本节中所例举的对基子句和对含有变量的子句进行消 解的例子,其父辈子句和消解式列表示于表4.1。这些例 子表示出消解推理的某些常用规则。
}
12
3.4.2 消解推理规则
令L1为任一原子公式,L2为另一原子公式; L1 和L2具有相同的谓词符号,但一般具有不同的变 量。已知两子句L1∨α和~L2∨β如果L1和L2具 有最一般合一者σ,那么通过消解可以从这两个 父辈子句推导出一个新子句(α∨β)σ。这个新子句 叫做消解式。它是由取这两个子句的析取,然后 消去互补对而得到的。
27
④应用消解原理,力图推导出一个表示矛盾的空子
句NIL。该消解反演可以表示为一棵反演树,如 下图4.1所示,其根节点为NIL。因此,储蓄问题 的结论获得证明。
28
图 4.1 储蓄问题反演树
(4) 反演求解过程 从反演求解的举例中可以看出,用反演树求取
对某个问题的答案,其过程如下: (a) 把由目标公式的否定产生的每个子句添加到 目标公式否定之否定的子句中去。 (b) 按照反演树,执行和以前相同的消解,直至 在根部得到某个子句止。 (c) 用根部的子句作为一个回答语句。

(完整版)人工智能(部分习题答案及解析)

(完整版)人工智能(部分习题答案及解析)

1.什么是人类智能?它有哪些特征或特点?定义:人类所具有的智力和行为能力。

特点:主要体现为感知能力、记忆与思维能力、归纳与演绎能力、学习能力以及行为能力。

2.人工智能是何时、何地、怎样诞生的?解:人工智能于1956年夏季在美国Dartmouth大学诞生。

此时此地举办的关于用机器模拟人类智能问题的研讨会,第一次使用“人工智能”这一术语,标志着人工智能学科的诞生。

3.什么是人工智能?它的研究目标是?定义:用机器模拟人类智能。

研究目标:用计算机模仿人脑思维活动,解决复杂问题;从实用的观点来看,以知识为对象,研究知识的获取、知识的表示方法和知识的使用。

4.人工智能的发展经历了哪几个阶段?解:第一阶段:孕育期(1956年以前);第二阶段:人工智能基础技术的研究和形成(1956~1970年);第三阶段:发展和实用化阶段(1971~1980年);第四阶段:知识工程和专家系统(1980年至今)。

5.人工智能研究的基本内容有哪些?解:知识的获取、表示和使用。

6.人工智能有哪些主要研究领域?解:问题求解、专家系统、机器学习、模式识别、自动定论证明、自动程序设计、自然语言理解、机器人学、人工神经网络和智能检索等。

7.人工智能有哪几个主要学派?各自的特点是什么?主要学派:符号主义和联结主义。

特点:符号主义认为人类智能的基本单元是符号,认识过程就是符号表示下的符号计算,从而思维就是符号计算;联结主义认为人类智能的基本单元是神经元,认识过程是由神经元构成的网络的信息传递,这种传递是并行分布进行的。

8.人工智能的近期发展趋势有哪些?解:专家系统、机器人学、人工神经网络和智能检索。

9.什么是以符号处理为核心的方法?它有什么特征?解:通过符号处理来模拟人类求解问题的心理过程。

特征:基于数学逻辑对知识进行表示和推理。

11.什么是以网络连接为主的连接机制方法?它有什么特征?解:用硬件模拟人类神经网络,实现人类智能在机器上的模拟。

特征:研究神经网络。

人工智能实验报告

人工智能实验报告

人工智能九宫格重移——搜索成员:赵春杰 2009210665羊森 2009210653黄鑫 2009210周成兵 2009210664王素娟 20092106441.问题描述:八数码问题也称为九宫问题。

在3×3的棋盘,摆有八个棋子,每个棋子上标有1至8的某一数字,不同棋子上标的数字不相同。

棋盘上还有一个空格,与空格相邻的棋子可以移到空格中。

要求解决的问题是:给出一个初始状态和一个目标状态,找出一种从初始转变成目标状态的移动棋子步数最少的移动步骤。

所谓问题的一个状态就是棋子在棋盘上的一种摆法。

棋子移动后,状态就会发生改变。

解八数码问题实际上就是找出从初始状态到达目标状态所经过的一系列中间过渡状态。

2.九宫重移有无答案检查(逆序数)我们把每个9宫格横向展开,如第一个123456789,我们把左边数大于右边数的组数称为这个九宫格的逆序数,显然123456789的逆序数为0;考虑横向平移,那么逆序数的增量为2或0或-2;纵向平移,逆序数的增量为4或0或-4;但147258369的逆序数为奇数。

所以147258369是无解的情况。

由此也可以类推当将9宫格展开后,如果数据序列的逆序数为奇数,则此数据序列对应的九宫格是无解的。

3.BFS算法队列: Queue open = new Queue();存放待扩展的节点List: List<Bfstr> closed = new List<Bfstr>();存放已被扩展过的节点ArrayList map = new ArrayList();//存放答案HashTale: Hashtable table = new Hashtable();构造哈希表以方便查找3.1.BFS算法介绍广度优先搜索算法BFS基本思想:从图中某顶点v出发,逐层对节点进行拓展,并考察是否为目标节点,在第n层节点没有全部扩展并考察前,不对第n+1层节点进行扩展。

人工智能复习题及答案

人工智能复习题及答案

一、填空:1.人工智能的研究途径有心理模拟、生理模拟和行为模拟。

2.任意列举人工智能的四个应用性领域智能控制、智能管理、智能决策、智能仿真。

3.人工智能的基本技术包括表示、运算、搜索归纳技术、联想技术。

4.谓词逻辑是一种表达能力很强的形式语言,其真值的特点和命题逻辑的区别是(10)。

5.谓词逻辑中,重言式(tautlogy)的值是(11)。

6.设P是谓词公式,对于P的任何论域,存在P为真的情况,则称P为(12)。

7.在著名的医疗专家系统MYCIN中规定,若证据A的可信度CF(A)=0,则意味着 13 ,CF(A)=-1,则意味着(14),CF(A)=1,则意味着(15)。

8.谓词公式G是不可满足的,当且仅当对所有的解释(16)。

9.谓词公式与其子句集的关系是(17)。

10.利用归结原理证明定理时,若得到的归结式为(18),则结论成立。

11.若C1=┐P∨Q,C2=P∨┐Q,则C1和C2的归结式R(C1,C2)= (19)。

12.若C1=P(x) ∨Q(x),C2=┐P(a) ∨R(y),则C1和C2的归结式R(C1,C2)= (20)。

13.有谓词公式G,置换δ,则G·ε= (21),δ·ε= (22)。

14.有子句集S={P(x),P(y)},其MGU= (23)。

15.在归结原理中,几种常见的归结策略并且具有完备性的是(24),(25),(26)。

16.状态图启发式搜索算法的特点是(27)。

17.广度优先搜索算法中,OPEN表的数据结构实际是一个(28),深度优先搜索算法中,OPEN表的数据结构实际是一个(29)。

18.产生式系统有三部分组成(30),(31)和推理机。

其中推理可分为(32)和(33)。

19.专家系统的结构包含人机界面、(34),(35),(36),(37)和解释模块。

20.在MYCIN推理中,对证据的可信度CF(A)、CF(A1)、CF(A2)之间,规定如下关系:CF(~A)= (38),CF(A1∧A2 )= (39),CF(A1∨A2 )= (40)。

人工智能第4版部分课后答案

人工智能第4版部分课后答案

第2章附加题请写出用一阶谓词逻辑表示法表示知识的步骤。

步骤:(1)定义谓词及个体,确定每个谓词及个体的确切含义;(2)根据所要表达的事物或概念,为每个谓词中的变元赋予特定的值;(3)根据所要表达的知识的语义用适当的联接符号将各个谓词联接起来,形成谓词公式。

什么是子句?什么是子句集?请写出谓词公式子句集的步骤。

解:子句就是由一些文字组成的析取式。

由子句构成的集合称为子句集。

步骤:(1)消去谓词公式中的蕴涵和双条件符号,以(A(B代替A(B,以(A(B)(((A((B)替换A(B。

(2)减少不定符号的辖域,使不定符号最多只作用到一个谓词上。

(3)重新命名变元名,使所有的变元的名字均不同,并且自由变元及约束变元亦不同。

(4)消去存在量词。

(5)把全称量词全部移到公式的左边,并使每个量词的辖域包括这个量词后面公式的整个部分。

(6)母式化为合取范式,建立起与其对应的子句集。

2-2 用谓词表示法求解修道士和野人问题。

在河的北岸有三个修道士、三个野人和一条船,修道士们想用这条船将所有的人都运过河去,但要受到以下条件限制:(1) 修道士和野人都会划船,但船一次只能装运两个人。

(2) 在任何岸边,野人数不能超过修道士,否则修道士会被野人吃掉。

假定野人愿意服从任何一种过河安排,请规划出一种确保修道士安全的过河方案。

要求写出所用谓词的定义、功能及变量的个体域。

解:(1)定义谓词先定义修道士和野人人数关系的谓词:G(x,y,S):在状态S下x大于yGE(x,y,S):在状态S下x大于或等于y其中,x,y分别代表修道士人数和野人数,他们的个体域均为{0,1,2,3}。

再定义船所在岸的谓词和修道士不在该岸上的谓词:Boat(z,S):状态S下船在z岸EZ(x,S):状态S下x等于0,即修道士不在该岸上其中,z的个体域是{L,R},L表示左岸,R表示右岸。

再定义安全性谓词:Safety(z,x,y,S)≡(G(x,0,S)∧GE(x,y,S))∨(EZ(x,S))其中,z,x,y的含义同上。

人工智能实验

人工智能实验

《人工智能导论》实验河南理工大学《人工智能》实验指导实验内容实验一状态空间搜索实验实验二 A*算法实验实验三子句消解实验实验四化为子句集的九步法实验实验五梵塔问题实验实验六 BP网络实验温馨提示:上述实验可以采用任何自己熟悉的语言来实现《人工智能导论》实验河南理工大学实验一状态空间搜索实验——八数码问题(必修,2学时)一、实验目的及内容实验目的:理解和掌握状态空间搜索的策略实验内容要求:在一个3X3的九宫中有1—8,这八个数及一个空格,随机的摆放在其中的格子里,现要求实现这个问题:将该九宫格调整为某种有序的形式,调整的原则为每次只能将空格(上、下、左、右)相邻的一个数字平移到空格中,试编程实现这一问题的求解二、实验原理及基本技术路线图(方框原理图或程序流程图)实验原理:算法分析:实验流程图:三、所用仪器、材料(设备名称、型号、规格等或使用软件)硬件:软件:四、实验方法、步骤(或:程序代码或操作过程)1.实验步骤2.实验源程序五、实验过程原始记录( 测试数据、图表、计算等)六、实验结果、分析和结论1《人工智能导论》实验河南理工大学实验二 A*算法实验(2学时)一、实验目的:熟悉和掌握启发式搜索的定义、估价函数和算法过程,并利用A*算法求解N数码难题,理解求解流程和搜索顺序。

二、实验原理:A*算法是一种有序搜索算法,其特点在于对估价函数的定义上。

对于一般的有序搜索,总是选择f值最小的节点作为扩展节点。

因此,f是根据需要找到一条最小代价路径的观点来估算节点的,所以,可考虑每个节点n的估价函数值为两个分量:从起始节点到节点n的代价以及从节点n到达目标节点的代价。

三、实验条件:1 N数码难题演示程序。

2 IE6.0以上,可以上Internet。

三、实验内容:1 分别以8数码和15数码为例实际求解A*算法。

2 画出A*算法求解框图。

3 分析估价函数对搜索算法的影响。

4 分析A*算法的特点。

四、实验步骤:1 开始演示。

人工智能作业答案(中国矿大)

人工智能作业答案(中国矿大)

1把以下适宜公式化简为合取范式的子句集:(1⌝ (∀x(∃y(∃z{P(x ⇒ (∀x[Q(x, y ⇒ R(z]}(2( ∀x( ∃y{{P(x ∧ [Q(x ∨ R(y]} ⇒ (∀y[P(f(y ⇒ Q(g(x]}(3 (∀x( ∃y{P(x ∧ [Q(x∨ R(y]}⇒ (∀y{[P(f(y⇒ Q(g(y]⇒ (∀xR(x} (1∙⌝(∀x( ∃y( ∃z{P(x ⇒ (∀x[Q(x,y ⇒ R(z]}∙⌝(∀x( ∃y( ∃z{ ⌝P(x ∨ ( ∀x[⌝Q(x,y ∨ R(z]}∙ (∃x( ∀y( ∀z{ P(x ∧ (∃ x[Q(x,y ∧⌝R(z]}∙ P(A ∧ [Q(f(y,z, y ∧⌝R(z]∙ {P(A, Q(f(y,z,y, ∧⌝R(w}(2∙ (∀x(∃y{{P(x ∧ [Q(x ∨ R(y]} ⇒ (∀y[P(f(y ⇒ Q(g(x]}∙ (∀x(∃y{⌝{P(x ∧ [Q(x ∨ R(y]} ∨(∀y[⌝P(f(y ∨ Q(g(x]}∙ (∀x(∃y{⌝P(x ∨ [⌝Q(x ∧⌝R(y] ∨(∀w[⌝P(f(w ∨ Q(g(x]}∙ (∀x{⌝P(x ∨ [⌝Q(x ∧⌝R(h(x] ∨(∀w[⌝P(f(w ∨ Q(g(x]}∙ [⌝P(x ∨⌝Q(x ∨⌝P(f(w ∨ Q(g(x] ∧[⌝P(x ∨⌝R(h(x ∨⌝P(f(w ∨ Q(g(x]∙ {⌝P(x1 ∨⌝Q(x1 ∨⌝P(f(w1 ∨ Q(g(x1,⌝P(x2 ∨⌝R(h(w2 ∨⌝P(f(w2 ∨ Q(g(x2} (3 ∙ (∀x(∃y{P(x ∧ [Q(x ∨ R(y]} ⇒(∀y{[P(f(y ⇒ Q(g(y]⇒(∀xR(x}∙⌝(∀x(∃y{P(x ∧ [Q(x ∨ R(y]} ∨( ∀y{⌝[⌝P(f(y ∨ Q(g(y] ∨ (∀xR(x} ∙ (∃x(∀y{ ⌝P(x ∨ [⌝Q(x ∧⌝R(y]} ∨(∀w{⌝[⌝P(f(w ∨ Q(g(w] ∨ (∀vR(v} ∙ {⌝P(A ∨[⌝Q(A ∧⌝R(y]} ∨{[P(f(w ∧⌝Q(g(w] ∨ R(v}∙⌝P(A ∨ {[⌝Q(A ∨ P(f(w] ∧ [⌝Q(A ∨⌝Q(g(w] ∧[⌝R(y ∨ P(f(w] ∧ [⌝R(y ∨⌝Q(g(w]} ∨ R(v ∙ {⌝P(A ∨⌝Q(A ∨ P(f(w1 ∨R(v1,⌝P(A ∨⌝Q(A ∨ Q(g(w2 ∨ R(v2,⌝P(A ∨⌝R(y3 ∨ P(f(w3 ∨ R(v3,⌝P(A ∨⌝R(y4 ∨ Q(g(w4 ∨ R v4}2假设以下事实:1小李(Li喜欢容易的(Easy课程(Course。

人工智能复习题及答案

人工智能复习题及答案

一、填空:1.人工智能的研究途径有心理模拟、生理模拟和行为模拟。

2.任意列举人工智能的四个应用性领域智能控制、智能管理、智能决策、智能仿真。

3.人工智能的基本技术包括表示、运算、搜索归纳技术、联想技术。

4.谓词逻辑是一种表达能力很强的形式语言,其真值的特点和命题逻辑的区别是(10)。

5.谓词逻辑中,重言式(tautlogy)的值是(11)。

6.设P是谓词公式,对于P的任何论域,存在P为真的情况,则称P为(12)。

7.在著名的医疗专家系统MYCIN中规定,若证据A的可信度CF(A)=0,则意味着 13 ,CF(A)=-1,则意味着(14),CF(A)=1,则意味着(15)。

8.谓词公式G是不可满足的,当且仅当对所有的解释(16)。

9.谓词公式与其子句集的关系是(17)。

10.利用归结原理证明定理时,若得到的归结式为(18),则结论成立。

11.若C1=┐P∨Q,C2=P∨┐Q,则C1和C2的归结式R(C1,C2)= (19)。

12.若C1=P(x) ∨Q(x),C2=┐P(a) ∨R(y),则C1和C2的归结式R(C1,C2)= (20)。

13.有谓词公式G,置换δ,则G·ε= (21),δ·ε= (22)。

14.有子句集S={P(x),P(y)},其MGU= (23)。

15.在归结原理中,几种常见的归结策略并且具有完备性的是(24),(25),(26)。

16.状态图启发式搜索算法的特点是(27)。

17.广度优先搜索算法中,OPEN表的数据结构实际是一个(28),深度优先搜索算法中,OPEN表的数据结构实际是一个(29)。

18.产生式系统有三部分组成(30),(31)和推理机。

其中推理可分为(32)和(33)。

19.专家系统的结构包含人机界面、(34),(35),(36),(37)和解释模块。

20.在MYCIN推理中,对证据的可信度CF(A)、CF(A1)、CF(A2)之间,规定如下关系:CF(~A)= (38),CF(A1∧A2 )=(39),CF(A1∨A2 )= (40)。

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

实验三化为子句集的九步法实验一、实验目的理解和掌握消解原理,熟悉谓词公式化为子句集的九个步骤,理解消解推理规则,能把任意谓词公式转换成子句集。

二、实验原理消解是可用于一定的子句公式的重要推理规则,任一谓词演算公式可以化成一个子句集。

通过九步法消解可以从这两个父辈子句推导出一个新子句。

九步法消解包括消去蕴涵符号、减否定符辖域、对变量标准化、消去存在量词、化为前束型、化为合取范式、消去全程量词、消去合取符、更换变量名,依次变换即可得到子句集。

具体为:(1)消去连接词“→”和“↔”P→Q⇔﹁P∨QP↔Q⇔(P∧Q)∨(﹁P∧﹁Q)(2)将否定符号“﹁”移到仅靠谓词的位置﹁(﹁P)⇔P﹁(P∧Q)⇔﹁P∨﹁Q﹁(P∨Q)⇔﹁P∧﹁Q﹁(∀x)P(x)⇔(∃x)﹁P(x)﹁(∃x)P(x)⇔(∀x)﹁P(x)(∀x)(﹁(∀y)P(x,y)∨﹁(∀y)(﹁Q(x,y)∨R(x,y)))⇔(∀x)((∃y)﹁P(x,y)∨(∃y)(Q(x,y)∧﹁R(x,y)))(3)对变元标准化(∀x)((∃y)﹁P(x,y)∨(∃z)(Q(x,z)∧﹁R(x,z)))(4)化为前束范式(∀x)(∃y)(∃z)(﹁P(x,y)∨(Q(x,z)∧﹁R(x,z)))(5)消去存在量词(∀x)(﹁P(x,f(x))∨(Q(x,g(x))∧﹁R(x,g(x))))(6)化为Skolem标准形P∨(Q∧R)⇔(P∨Q)∧(P∨R)(∀x)((﹁P(x,f(x))∨Q(x,g(x))∧(﹁P(x,f(x))∨﹁R(x,g(x))))(7)消去全称量词(∀x)((﹁P(x,f(x))∨Q(x,g(x))∧(﹁P(x,f(x))∨﹁R(x,g(x))))(8)消去合取词﹁P(x,f(x))∨Q(x,g(x))﹁P(x,f(x))∨﹁R(x,g(x))(9)更换变量名称﹁P(x,f(x))∨Q(x,g(x))﹁P(y,f(y))∨﹁R(y,g(y))三、实验内容(1)可以采用自己熟悉的C#、C++、JA V A等任一种语言编写出Windows应用程序,演示子句消解推理演示程序。

(2)界面中可以通过实例按钮,由程序指定具体的实例,给出原始谓词公式;(3)设计九个步骤的按钮,每按一步按钮,给出这一步消解的结果;(4)该程序主要帮助初学者学习、掌握九步法谓词公式化为子句集的过程。

四、实验要求(1)提交实验报告,以word文档形式“学号+姓名”命名;(2)报告中要有程序源代码;(3)有程序运行结果截图;(4)报告提交到:ftp://192.168.129.253/xstjzy/任建平/人工智能五.实验截图六.源代码#include<iostream>#include<sstream>#include<stack>#include<queue>#include<string>using namespace std;//一些函数的定义void initString(string &ini);//初始化string del_inlclue(string temp);//消去蕴涵符号string dec_neg_rand(string temp);//减少否定符号的辖域string standard_var(string temp);//对变量标准化string del_exists(string temp);//消去存在量词string convert_to_front(string temp);//化为前束形string convert_to_and(string temp);//把母式化为合取范式string del_all(string temp);//消去全称量词string del_and(string temp);//消去连接符号合取% string change_name(string temp);//更换变量名称//辅助函数定义bool isAlbum(char temp);//是字母string del_null_bracket(string temp);//删除多余的括号string del_blank(string temp);//删除多余的空格void checkLegal(string temp);//检查合法性char numAfectChar(int temp);//数字显示为字符//主函数void main(){cout<<"------------------求子句集九步法演示-----------------------"<<endl;//orign = "Q(x,y)%~(P(y)";//orign = "(@x)(P(y)>P)";//orign = "~(#x)y(x)";//orign = "~((@x)x!b(x))";//orign = "~(x!y)";//orign = "~(~a(b))";string orign,temp;char command,command0,command1,command2,command3,command4,command5, command6,command7,command8,command9,command10;//================================================================= ============cout<<"请输入(Y/y)初始化谓词演算公式"<<endl;cin>>command;if(command == 'y' || command == 'Y')initString(orign);elseexit(0);//================================================================= ============cout<<"请输入(Y/y)消除空格"<<endl;cin>>command0;if(command0 == 'y' || command0 == 'Y'){//del_blank(orign);//undonecout<<"消除空格后是"<<endl<<orign<<endl;}elseexit(0);//================================================================= ============cout<<"请输入(Y/y)消去蕴涵项"<<endl;cin>>command1;if(command1 == 'y' || command1 == 'Y'){orign =del_inlclue(orign);cout<<"消去蕴涵项后是"<<endl<<orign<<endl;}elseexit(0);//================================================================= ============cout<<"请输入(Y/y)减少否定符号的辖域"<<endl;cin>>command2;if(command2 == 'y' || command2 == 'Y'){do{temp = orign;orign = dec_neg_rand(orign);}while(temp != orign);cout<<"减少否定符号的辖域后是"<<endl<<orign<<endl;}elseexit(0);//================================================================= ============cout<<"请输入(Y/y)对变量进行标准化"<<endl;cin>>command3;if(command3 == 'y' || command3 == 'Y'){orign = standard_var(orign);cout<<"对变量进行标准化后是"<<endl<<orign<<endl;}elseexit(0);//================================================================= ============cout<<"请输入(Y/y)消去存在量词"<<endl;cin>>command4;if(command4 == 'y' || command4 == 'Y'){orign = del_exists(orign);cout<<"消去存在量词后是(w = g(x)是一个Skolem函数)"<<endl<<orign<<endl;}elseexit(0);//=============================================================================cout<<"请输入(Y/y)化为前束形"<<endl;cin>>command5;if(command5 == 'y' || command5== 'Y'){orign = convert_to_front(orign);cout<<"化为前束形后是"<<endl<<orign<<endl;}elseexit(0);//================================================================= ============cout<<"请输入(Y/y)把母式化为合取方式"<<endl;cin>>command6;if(command6 == 'y' || command6 == 'Y'){orign = convert_to_and(orign);cout<<"把母式化为合取方式后是"<<endl<<orign<<endl;}elseexit(0);//================================================================= ============cout<<"请输入(Y/y)消去全称量词"<<endl;cin>>command7;if(command7 == 'y' || command7 == 'Y'){orign= del_all(orign);cout<<"消去全称量词后是"<<endl<<orign<<endl;}elseexit(0);//================================================================= ============cout<<"请输入(Y/y)消去连接符号"<<endl;cin>>command8;if(command8 == 'y' || command8 == 'Y'){orign = del_and(orign);cout<<"消去连接符号后是"<<endl<<orign<<endl;}elseexit(0);//================================================================= ============cout<<"请输入(Y/y)变量分离标准化"<<endl;cin>>command9;if(command9 == 'y' || command9 == 'Y'){orign = change_name(orign);cout<<"变量分离标准化后是(x1,x2,x3代替变量x)"<<endl<<orign<<endl;}elseexit(0);//================================================================= ===========cout<<"-------------------------完毕-----------------------------------"<<endl;cout<<"(请输入Y/y)结束"<<endl;do{}while('y' == getchar() || 'Y'==getchar());exit(0);}void initString(string &ini){char commanda,commandb;cout<<"请输入您所需要转换的谓词公式"<<endl;cout<<"需要查看输入帮助(Y/N)? "<<endl;cin>>commanda;if(commanda == 'Y' || commanda == 'y')cout<<"本例程规定输入时蕴涵符号为>,全称量词为@,存在量词为#,"<<endl <<"取反为~,吸取为!,合取为%,左右括号分别为( 、),函数名请用一个字母"<<endl;cout<<"请输入(y/n)选择是否用户自定义"<<endl;cin>>commandb;if(commandb =='Y'|| commandb=='y')cin>>ini;elseini = "(@x)(P(x)>((@y)(P(y)>P(f(x, y)))%~(@y)(Q(x,y)>P(y))))";cout<<"原始命题是"<<endl<<ini<<endl;}string del_inlclue(string temp)//消去>蕴涵项{//a>b变为~a!bchar ctemp[100]={""};string output;int length = temp.length();int i = 0,right_bracket = 0,falg= 0;stack<char> stack1,stack2,stack3;strcpy(ctemp,temp.c_str());while(ctemp[i] != '\0' && i <= length-1){stack1.push(ctemp[i]);if('>' == ctemp[i+1])//如果是a>b则用~a!b替代{falg = 1;if(isAlbum(ctemp[i]))//如果是字母则把ctemp[i]弹出{stack1.pop();stack1.push('~');stack1.push(ctemp[i]);stack1.push('!');i = i + 1;}else if(')' == ctemp[i]){right_bracket++;do{if('(' == stack1.top())right_bracket--;stack3.push(stack1.top());stack1.pop();}while((right_bracket != 0));stack3.push(stack1.top());stack1.pop();stack1.push('~');while(!stack3.empty()){stack1.push(stack3.top());stack3.pop();}stack1.push('!');i = i + 1;}}i++;}while(!stack1.empty()){stack2.push(stack1.top());stack1.pop();}while(!stack2.empty()){output += stack2.top();stack2.pop();}if(falg == 1)return output;elsereturn temp;}string dec_neg_rand(string temp)//减少否定符号的辖域{char ctemp[100],tempc;string output;int flag2 = 0;int i = 0,left_bracket = 0,length = temp.length();stack <char> stack1,stack2;queue <char> queue1;strcpy(ctemp,temp.c_str());//复制到字符数组中while(ctemp[i] != '\0' && i <= length - 1){stack1.push(ctemp[i]);if(ctemp[i] == '~')//如果是~否则什么都不做{char fo = ctemp[i+2];if(ctemp[i+1] == '(')//如果是(,否则什么都不做{if(fo == '@' || fo =='#')//如果是全称量词{flag2 = 1;i++;stack1.pop();stack1.push(ctemp[i]);if(fo == '@')stack1.push('#');elsestack1.push('@');stack1.push(ctemp[i+2]);stack1.push(ctemp[i+3]);stack1.push('(');stack1.push('~');if(isAlbum(ctemp[i+4])){stack1.push(ctemp[i+4]);i = i + 5;}elsei = i + 4;do{queue1.push(temp[i]);if(temp[i] == '(')left_bracket ++;else if(temp[i] == ')')left_bracket --;i ++;}while(left_bracket != 0 && left_bracket >=0);queue1.push(')');while(!queue1.empty()){tempc = queue1.front();queue1.pop();stack1.push(tempc);}}}}i ++;}while(!stack1.empty()){stack2.push(stack1.top());stack1.pop();}while(!stack2.empty()){output += stack2.top();stack2.pop();}if(flag2 == 1)temp = output;/************************************************************/char ctemp1[100];string output1;stack<char> stack11,stack22;int falg1 = 0;int times = 0;int length1 = temp.length(),inleftbackets = 1,j = 0;strcpy(ctemp1,temp.c_str());while(ctemp1[j] != '\0' && j <= (length1 -1)){stack11.push(ctemp1[j]);if(ctemp1[j] == '~'){if(ctemp1[j+1] == '(' /*&& ctemp1[j + 2] != '~'*/){j = j + 2;stack11.push('(');////////////////while(inleftbackets != 0 && inleftbackets >=0 && times <= (length1 - j) && times >= 0){stack11.push(ctemp1[j]);if(ctemp1[j] == '(')inleftbackets ++;else if(ctemp1[j] == ')')inleftbackets --;if(inleftbackets == 1 && ctemp1[j+1] == '!' && ctemp1[j+2] != '@' && ctemp1[j+2] != '#'){falg1 =1;stack11.push(')');//////////stack11.push('%');stack11.push('~');stack11.push('(');//////////j = j+1;}if(inleftbackets == 1 && ctemp1[j+1] == '%' && ctemp1[j+2] != '@' && ctemp1[j+2] != '#'){falg1 =1;stack11.push(')');//////////stack11.push('!');stack11.push('~');stack11.push('(');//////////j = j+1;}j = j +1;}if(falg1 == 1)stack11.push(')');stack11.pop();stack11.push(')');//此处有bugstack11.push(')');//此处有bug}}j ++;}while(!stack11.empty()){stack22.push(stack11.top());stack11.pop();}while(!stack22.empty()){output1 += stack22.top();stack22.pop();}if(falg1 == 1)temp = output1;/************************************************************/ char ctemp3[100];string output3;int k = 0,left_bracket3 = 1,length3 = temp.length();stack <char> stack13,stack23;int flag = 0,bflag = 0;strcpy(ctemp3,temp.c_str());//复制到字符数组中while(ctemp3[k] != '\0' && k <= length3-1){stack13.push(ctemp3[k]);if(ctemp3[k] == '~'){if(ctemp3[k+1] == '('){if(ctemp3[k + 2] == '~'){flag = 1;stack13.pop();k =k + 2;while(left_bracket3 != 0 && left_bracket3 >=0){stack13.push(ctemp3[k+1]);if(ctemp3[k+1] == '(')left_bracket3 ++;if(ctemp3[k+1] == ')')left_bracket3 --;if(ctemp3[k+1] == '!'|ctemp3[k+1] == '%')bflag = 1;k ++;}stack13.pop();}}}k ++;}while(!stack13.empty()){stack23.push(stack13.top());stack13.pop();}while(!stack23.empty()){output3 += stack23.top();stack23.pop();}if(flag == 1 && bflag == 0)temp = output3;return temp;}string standard_var(string temp)//对变量标准化,简化,不考虑多层嵌套{char ctemp[100],des[10]={" "};strcpy(ctemp,temp.c_str());stack <char> stack1,stack2;int l_bracket = 1,falg = 0,bracket = 1;int i = 0,j = 0;string output;while(ctemp[i] != '\0' && i < temp.length()){stack1.push(ctemp[i]);if(ctemp[i] == '@' || ctemp[i] == '#'){stack1.push(ctemp[i+1]);des[j] = ctemp[i+1];j++;stack1.push(ctemp[i+2]);i = i + 3;stack1.push(ctemp[i]);i++;if(ctemp[i-1] == '('){while(ctemp[i] != '\0' && l_bracket != 0){if(ctemp[i] == '(')l_bracket ++;if(ctemp[i] == ')')l_bracket --;if(ctemp[i] == '(' && ctemp[i+1] == '@' ){des[j] = ctemp[i+2];j++;}if(ctemp[i+1] == '(' && ctemp[i+2] == '#' ){falg = 1;int kk = 1;stack1.push(ctemp[i]);stack1.push('(');stack1.push(ctemp[i+2]);i = i+3;if(ctemp[i] == 'y')ctemp[i] ='w';stack1.push(ctemp[i]);stack1.push(')');stack1.push('(');i = i+3;while(kk != 0){if(ctemp[i]=='(')kk++;if(ctemp[i] ==')')kk--;if(ctemp[i] == 'y')ctemp[i] ='w';stack1.push(ctemp[i]);i++;}}stack1.push(ctemp[i]);i ++;}}}i ++;}while(!stack1.empty()){stack2.push(stack1.top());stack1.pop();}while(!stack2.empty()){output += stack2.top();stack2.pop();}if(falg == 1)return output;elsereturn temp;}string del_exists(string temp)//消去存在量词{char ctemp[100],unknow;strcpy(ctemp,temp.c_str());int left_brackets = 0,i = 0,falg = 0;queue<char> queue1;string output;while(ctemp[i] != '\0' && i < temp.length()){if(ctemp[i] =='(' && ctemp[i+1] =='#'){falg = 1;unknow = ctemp[i+2];i = i+4;do{if(ctemp[i] == '(')left_brackets ++;if(ctemp[i] == ')')left_brackets --;if(ctemp[i] == unknow){queue1.push('g');queue1.push('(');queue1.push('x');queue1.push(')');}if(ctemp[i] != unknow)queue1.push(ctemp[i]);i++;}while(left_brackets != 0);}queue1.push(ctemp[i]);i++;}while(!queue1.empty()){output+= queue1.front();queue1.pop();}if(falg == 1)return output;elsereturn temp;}string convert_to_front(string temp)//化为前束形{char ctemp[100];strcpy(ctemp,temp.c_str());int i = 0;string out_var = "",output = "";while(ctemp[i] != '\0' && i < temp.length()){if(ctemp[i] == '(' && ctemp[i+1] == '@'){out_var = out_var + ctemp[i] ;//(@)out_var = out_var + ctemp[i+1] ;out_var = out_var +ctemp[i+2];out_var = out_var +ctemp[i+3];i = i + 4;}output = output + ctemp[i];i++;}output = out_var + output;return output;}string convert_to_and(string temp)//把母式化为合取范式,Q/A?{temp = "(@x)(@y)((~P(x)!(~P(y))!P(f(x,y)))%((~P(x)!Q(x,g(x)))%((~P(x))!(~P(g(x)))))";return temp;}string del_all(string temp)//消去全称量词{char ctemp[100];strcpy(ctemp,temp.c_str());int i = 0,flag = 0;string output = "";while(ctemp[i] != '\0' && i < temp.length()){if(ctemp[i] == '(' && ctemp[i+1] == '@'){i = i + 4;flag = 1;}else{output = output + ctemp[i];i ++;}}return output;}string del_and(string temp)//消去连接符号合取%{char ctemp[100];strcpy(ctemp,temp.c_str());int i = 0,flag = 0;string output = "";while(ctemp[i] != '\0' && i < temp.length()){if(ctemp[i] == '%' ){ctemp[i] = '\n';}output = output +ctemp[i];i++;}return output;}string change_name(string temp)//更换变量名称{char ctemp[100];strcpy(ctemp,temp.c_str());string output = "";int i = 0,j = 0,falg = 0;while(ctemp[i] != '\0' && i < temp.length()){falg++;while('\n' != ctemp[i] && i < temp.length()){if('x' == ctemp[i]){output = output + ctemp[i] ;output = output + numAfectChar(falg);}elseoutput = output + ctemp[i] ;i++;}output = output + ctemp[i] ;i ++;}return output;}bool isAlbum(char temp){if(temp <= 'Z' && temp >= 'A' || temp <= 'z' && temp >= 'a') return true;return false;}char numAfectChar(int temp)//数字显示为字符{char t;switch (temp){case 1:t = '1';break;case 2:t = '2';break;case 3:t = '3';break;case 4:t = '4';break;default:t = '89';break;}return t;}。

相关文档
最新文档