人工智能-化为子句集的九步法实验
- 格式:doc
- 大小:186.50 KB
- 文档页数:19
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)。
第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)。
《人工智能》课后习题答案第一章绪论答:人工智能就是让机器完成那些如果由人来做则需要智能的事情的科学。
人工智能是相对于人的自然智能而言,即用人工的方法和技术,研制智能机器或智能系统来模仿延伸和扩展人的智能,实现智能行为和“机器思维”,解决需要人类专家才能处理的问题。
答:“智能”一词源于拉丁“Legere”,意思是收集、汇集,智能通常用来表示从中进行选择、理解和感觉。
所谓自然智能就是人类和一些动物所具有的智力和行为能力。
智力是针对具体情况的,根据不同的情况有不同的含义。
“智力”是指学会某种技能的能力,而不是指技能本身。
答:专家系统是一个智能的计算机程序,他运用知识和推理步骤来解决只有专家才能解决的复杂问题。
即任何解题能力达到了同领域人类专家水平的计算机程序度可以称为专家系统。
答:自然语言处理—语言翻译系统,金山词霸系列机器人—足球机器人模式识别—Microsoft Cartoon Maker博弈—围棋和跳棋第二章知识表达技术解答:(1)状态空间(State Space)是利用状态变量和操作符号,表示系统或问题的有关知识的符号体系,状态空间是一个四元组(S,O,S0,G):S—状态集合;O—操作算子集合;S0—初始状态,S0S;G—目的状态,GS,(G可若干具体状态,也可满足某些性质的路径信息描述)从S0结点到G结点的路径被称为求解路径。
状态空间一解是一有限操作算子序列,它使初始状态转换为目标状态:O1 O2 O3 OkS0S1S2……G其中O1,…,Ok即为状态空间的一个解(解往往不是唯一的)(2)谓词逻辑是命题逻辑的扩充和发展,它将原子命题分解成客体和谓词两个部分。
与命题逻辑中命题公式相对应,谓词逻辑中也有谓词(命题函数)公式、原子谓词公式、复合谓词公式等概念。
一阶谓词逻辑是谓词逻辑中最直观的一种逻辑。
(3)语义网络是一种采用网络形式表示人类知识的方法。
即用一个有向图表示概念和概念之间的关系,其中节点代表概念,节点之间的连接弧(也称联想弧)代表概念之间的关系。
化为子句集的九步法一、实验目的:熟悉谓词公式化为子句集的九个步骤,理解消解(谓词公式化为子句集)规则,能把任意谓词公式转换成子句集,掌握基于规则推理的基本方法。
二、实验原理产生式系统用来描述若干个不同的以一个基本概念为基础的系统,这个基本概念就是产生式规则或产生式条件和操作对。
在产生式系统中,论域的知识分为两部分:用事实表示静态知识;用产生式规则表示推理过程和行为。
任一谓词公式通过九步法可以化成一个子句集。
九步法消解包括消去蕴含和等价符号、把否定符号移到紧靠谓词的位置上、变量标准化、消去存在量词、化为前束型、化为Skolem标准形、略去全称量词、消去合取词,把母式用子句集表示、子句换变量标准化,依次变换即可得到子句集。
三、实验内容代码:void main(){cout<<"------------------求子句集九步法演示-----------------------"<<endl;system("color 0A");//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);}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;}四、实验步骤:1对默认谓词公式进行转换。
人工智能九宫格重移——搜索1.问题描述:八数码问题也称为九宫问题。
在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层节点进行扩展。
对九宫重排问题,即构造广度优先搜索树,从初始状态,利用广度优先搜索算法逐步找到目标状态的节点。
3.2.状态空间表示状态空间用一维数组表示,每个节点存放在Bfstr结构体中的字符now中,从第一行开始从左往右给九宫格标号0……8,字符串now元素下标代表格子位置,而now数组中对应数组的值代表九宫格中存放的数码,用数值9代表空格。
(人工智能)人工智能复习题及答案填空: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.知识 研究模拟智能程序 研制智能计算2.模式识别 问题求解 定理证明 专家系统 机器视觉和机器学习3.一阶谓词逻辑 框架 语义网络 脚本和Petri 网络4.规则库 综合数据库 控制系统5.删除策略 支持集策略 线性输入策略 单文字子句策略 祖先过滤策略6.队列 堆栈7.确定因子法 主观Bayes 法 D-S 证据理论 可能性理论8.符号主义 联想主义 行为主义9.知识获取 人类领域专家获取知识 系统运行过程中的知识获取10.信任程度的增长 不信任程度的增长11.模式识别 定理证明 程序自动设计 专家系统 机器学习 自然语言理解12.否定 合取 析取 蕴涵13.正向演绎 逆向演绎 双向演绎14.∑⊆=A b b m A Bel )()( )(1)(A Bel A Pl ⌝-=15.初始状态集合 算符集合 目标状态集合16.机器感知 机器思维 机器行为 智能机构造技术 机器学习17.一阶谓词逻辑 语义网络 框架 脚本 产生式18.DENDRAL 1965 Fengenbum 关幼波肝病诊断与治疗专家系统 197819. 分层前向网络 反馈层向网络 互连前向网络20.槽 侧面21.综合数据库 规则库 控制系统22.叙述性表示 过程性表示二、选择题1.B2.C3.C4.C5.A6.B7.A8.B9.C 10.D11.D 12.B 13.C 14.A 15.D 16.B 17.A 18.B 19.B 20.A三、判断题1.错误2.错误3.正确4.错误5.错误6.正确7.正确8.正确9.正确10.错误11.正确12.正确13.错误14.错误15.错误16.正确17.正确18.错误19.正确20.正确21.正确22.错误23.错误24.正确25.正确26.正确27.错误28.错误29.正确30.正确31.正确四、名词解释1.可解结点:对应本原问题的终端节点是可解节点;或节点的后继节点并非全部不可解,那么该或节点是可解的;与节点的后继节点均为可解节点时,那么该与节点为可解节点。
第2章知识表示方法部分参考答案2.8设有如下语句,请用相应的谓词公式分别把他们表示出来:s(1)有的人喜欢梅花,有的人喜欢菊花,有的人既喜欢梅花又喜欢菊花。
解:定义谓词dP(x):x是人L(x,y):x喜欢y其中,y的个体域是{梅花,菊花}。
将知识用谓词表示为:(∃x )(P(x)→L(x, 梅花)∨L(x, 菊花)∨L(x, 梅花)∧L(x, 菊花))(2) 有人每天下午都去打篮球。
解:定义谓词P(x):x是人B(x):x打篮球A(y):y是下午将知识用谓词表示为:a(∃x )(∀y) (A(y)→B(x)∧P(x))(3)新型计算机速度又快,存储容量又大。
解:定义谓词NC(x):x是新型计算机F(x):x速度快B(x):x容量大将知识用谓词表示为:(∀x) (NC(x)→F(x)∧B(x))(4) 不是每个计算机系的学生都喜欢在计算机上编程序。
解:定义谓词S(x):x是计算机系学生L(x, pragramming):x喜欢编程序U(x,computer):x使用计算机将知识用谓词表示为:¬ (∀x) (S(x)→L(x, pragramming)∧U(x,computer))(5)凡是喜欢编程序的人都喜欢计算机。
解:定义谓词P(x):x是人L(x, y):x喜欢y将知识用谓词表示为:(∀x) (P(x)∧L(x,pragramming)→L(x, computer))2.9用谓词表示法求解机器人摞积木问题。
设机器人有一只机械手,要处理的世界有一张桌子,桌上可堆放若干相同的方积木块。
机械手有4个操作积木的典型动作:从桌上拣起一块积木;将手中的积木放到桌之上;在积木上再摞上一块积木;从积木上面拣起一块积木。
积木世界的布局如下图所示。
图机器人摞积木问题解:(1) 先定义描述状态的谓词CLEAR(x):积木x上面是空的。
ON(x, y):积木x在积木y的上面。
ONTABLE(x):积木x在桌子上。
第2章附加题1.请写出用一阶谓词逻辑表示法表示知识的步骤。
步骤:(1)定义谓词及个体,确定每个谓词及个体的确切含义;(2)根据所要表达的事物或概念,为每个谓词中的变元赋予特定的值;(3)根据所要表达的知识的语义用适当的联接符号将各个谓词联接起来,形成谓词公式。
1.什么是子句?什么是子句集?请写出谓词公式子句集的步骤。
解:子句就是由一些文字组成的析取式。
由子句构成的集合称为子句集。
步骤:(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的含义同上。
谓词公式化为子句集的方法
谓词公式化为子句集的方法是将逻辑语句转化为子句的形式,每个子句都包含一个谓词,且谓词的参数只能是常量或变量。
此转化过
程通常包括以下步骤:
1. 将量词化为Skolem常量或函数,去掉量词。
2. 将条件语句P→Q转化为~P或Q。
3. 将复合语句P ∧ Q和P ∨ Q分别转化为{P, Q}和~{~P, ~Q}。
4. 将谓词的逻辑否定转化为新的谓词,比如"P(x)"的逻辑否定为
"not_P(x)"。
5. 最后,将转化后的谓词公式用如下形式表示为子句集:
{p1, p2, ..., pn},其中每个pi都是形如"Q(xi1, xi2, ..., xim)"的字句,且Q为原公式中的谓词。
其中如果xi是常量,则直接
出现在子句中,否则xi是变量,以"_"开头,表示为"_xi",注意所有出现过的变量必须统一。
例如,假设原公式为∀x∀y(人(x) ∧ 父亲(y, x) → 祖先(y, x)),那么可将其转化为以下子句集:
{not_人(x) 或 not_父亲(y,x) 或祖先(y,x)}。
实验三化为子句集的九步法实验一、实验目的理解和掌握消解原理,熟悉谓词公式化为子句集的九个步骤,理解消解推理规则,能把任意谓词公式转换成子句集。
二、实验原理消解是可用于一定的子句公式的重要推理规则,任一谓词演算公式可以化成一个子句集。
通过九步法消解可以从这两个父辈子句推导出一个新子句。
九步法消解包括消去蕴涵符号、减否定符辖域、对变量标准化、消去存在量词、化为前束型、化为合取范式、消去全程量词、消去合取符、更换变量名,依次变换即可得到子句集。
具体为:(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;}。