谓词逻辑归结原理源代码
人工智能第6章 谓词逻辑与归结原理
• 当量词仅对谓词的个体(变量)起限定作用,即谓词名视
为常量时,称其为一阶谓词(First Order Predication
Logic ).
• 若量词对个体和谓词都有限定作用时,称其为高阶谓词。 – 例如: Qy Q(y) 是二阶谓词; xyP( x, y) 是一阶谓词。 • 通常我们约定连接词和量词的优先级为:~, , 最高; 次
–连接 词: –量词:
全称量词
~ 否定(非); 合取(与); 析取(或); 蕴涵(IF......TH EN); 等价(双条件)
表示所有的,例如,对于所有个体x, 谓词F(x)均成立时,可表示为 x F ( x ) 表示存在某一些,例如,若存在某些个体x, 使谓词F(x)成立时,可表示为 x F ( x )
由于事先不知道哪两个子句可以进行归结更不知道通过对哪些子句对的归结可以尽快地得到空子句因而必须对子句集中的所有子句逐对地进行比较对任何一对可归结的子句对都进行归结这样的效率是很低的
第六章 谓词逻辑与归结原理
• 6.1 一阶谓词逻辑基础 • 6.2 归结法(消解Resolution) • 6.3 归结反演系统
4. 若A是合式公式,x是个体变量,则x(A)、
x(A)是合式公式。
•
所有合式公式都是有限次应用规则1~4得到的。
(1)谓词公式的解释
• 在应用谓词逻辑解决问题时,必须对谓词公式进行解释,即 人为地给谓词公式指派语义。
• 一阶谓词公式P的解释可有多种,其中一些解释可使P为真,
而另一些解释则可使P为假。
• 推理过程:反复使用谓词演算的基本等价式及推理规则, 对已知谓词公式进行变换,得到所需逻辑结论的过程。
6.1.6 谓词公式的规范化
为了方便使用WFF进行定理证明和逻辑推理,需要把 WFF变换为便于使用的规范形式,称为WFF范式。典型的 范式包括:前束范式,SKOLEM范式。
第三章_谓词逻辑与归结原理
例:P∨~P
矛盾式或永假式 contradictory
设A为任一命题公式,若A在它的各种赋值下取值均为假,则称 A是永假式。
例: P∧~P
3.1 命题逻辑
可满足式 satisfiable
设A为任一命题公式,如果存在一组取值使A为真,则A为可满 足式。 即:对于命题公式A,若A不是矛盾式,则称A是可满足式。
3.1 命题逻辑
命题公式的赋值
对命题公式中的所有的命题变量各赋给一个值0,1。
真值表 p 0 0 1 1 q 0 1 0 1 ~p p∧q p∨q p→q p ↔q
1 1 0 0
0 0 0 1
0 1 1 1
1 1 0 1
1 0 0 1
3.1 命题逻辑
复合命题的真值
例:
p: 周杰伦是一个流行歌手 q: 人工智能是计算机科学的一个分支 r: 牛在天上飞 求下列复合命题的真值
将命题从语言表述转换为命题公式
step1、找出简单命题,并用符号表示 step2、分析简单命题间的逻辑关系,用联结符号进行描述
例
4、只要不下雨,我就骑自行车上班 令p表示“天下雨”,q表示“骑自行车上班” 2、教室里有30名男生和10名女生 1、3不是偶数 3、如果天下雨,出门带伞 ~p→q 令:p表示“教室里有30名男生”, 令:p表示“3是偶数”,~p 令p表示“天下雨”,q表示“出门带 q表示“教室里有10名女生” 伞” 5、只有不下雨,我才骑自行车上班 p∧q p→q 令p表示“天下雨”,q表示“骑自行车上班” q →~p
怪物洞穴
智能体行动的关键是要 根据获得的信息推理, 从而判断那个房间有怪 物,那个房间有陷阱, 那个房间是安全的 房间[4,2]和[2,3]有陷阱, 房间[3,4]有怪物,房间 [4,3]有金子
离散数学谓词逻辑python
离散数学谓词逻辑python离散数学是计算机科学中的一门重要学科,它研究离散对象及其相互关系的数学理论和方法。
谓词逻辑是离散数学中的一个重要概念,它用于描述和推理关于对象之间的关系和性质。
在本文中,我们将介绍谓词逻辑在Python编程语言中的应用。
谓词逻辑是一种用于描述和推理关于对象之间关系的形式系统。
它由一组谓词、变量和逻辑连接词组成。
在谓词逻辑中,谓词用于描述对象的性质或关系,变量用于表示未知对象,逻辑连接词用于构建复杂的命题。
在Python中,我们可以使用谓词逻辑来表示和处理关于对象之间的关系和性质。
Python的谓词逻辑库提供了一些函数和方法,可以实现谓词逻辑的基本操作,如命题的合取、析取、否定、存在量化和全称量化等。
在Python中,我们可以使用符号或者关键字来表示谓词逻辑中的各种操作。
例如,我们可以使用符号"∧"表示合取操作,使用符号"∨"表示析取操作,使用关键字"not"表示否定操作,使用关键字"exists"表示存在量化,使用关键字"forall"表示全称量化等。
下面是一个简单的例子,演示了如何使用Python的谓词逻辑库来表示和处理关于人和年龄的关系:```pythonfrom sympy import symbols, Predicate, And, Or, Not, Exists, ForAll# 定义谓词和变量Person = symbols('Person')Age = symbols('Age')Young = Predicate('Young', Age)Old = Predicate('Old', Age)# 定义谓词逻辑公式formula = And(Exists(Person, Young), ForAll(Person, Old))# 打印谓词逻辑公式print(formula)```上述代码中,我们首先引入了Python的谓词逻辑库,并定义了谓词"Young"和"Old"以及变量"Person"和"Age"。
人工智能导论-第2章 逻辑推理2 - 谓词逻辑
(∀)( ∨ ) ≡ (∀) ∨
(∀)( ∧ ) ≡ (∀) ∧
(∃)( ∨ ) ≡ (∃) ∨
(∃)( ∧ ) ≡ (∃) ∧
谓词逻辑
量词的约束,因此是约束变元;Crown是一个常量符号,表示皇冠; ()是一个一元
谓词,表示是国王,_(Crown, )是一个二元谓词,表示头戴皇冠。
谓词逻辑
定理 2.4 当公式中存在多个量词时,若多个量词都是全称量词或者都是存在量词,
则量词的位置可以互换;若多个量词中既有全称量词又有存在量词,则量词的位
人工智能导论
Introduction of Artificial Intelligence
第2章
逻辑与推理
一、命题逻辑
二、谓词逻辑
三、知识图谱推理
四、因果推理
从 命题逻辑 到 谓词逻辑
命题逻辑的局限性:在命题逻辑中,每个陈述句是最基本的单位(即原子命题),
无法对原子命题进行分解。因此在命题逻辑中,不能表达局部与整体、一般与个
这就是谓词逻辑研究内容。
谓词逻辑
定义2.7 个体:
个体是指所研究领域中可以独立存在的具体或抽象的概念。
定义2.9 谓词:
谓词是用来刻画个体属性或者描述个体之间关系存在性的元素,其
值为真或为假。
包含一个参数的谓词称为一元谓词,表示一元关系。
包含多个参数的谓词称为多元谓词,表示个体之间的多元关系。
存在量词消去(Existential Instantiation, EI): (∃)() → ()
存在量词引入(Existential Generalization, EG): () → (∃)()
鲁宾逊归结原理伪代码
While(p!=null)
{ q指向子句C2的第一个谓词;
While(q!=null)
{if(p,q指向的谓词对象的num之和==0)
{运用最一般合一算法对C1和C2进行归结;终止并返回新子句指针;}
else if(p指向的谓词对象的num的绝对值)>q指向的谓词对象的num的绝对值)
string ArgList;
};
子句对象的表示(双向链表):
Class Clause
{
int nItems //标识子句中谓词的数目。
list<Predication*> PredList //该链表存储子句中的谓词信息,其元素是Predication指针类型。
prey, next: Clause指针类型成员,这两个元素是为了构造子句集的双向链表设置
6.C是空子句,则终止,否,转3.
二、实现伪代码
谓词对象的表示:谓词在计算机内部表示为一个类,该类有两个类型,一个是int型num表示谓词符号的标识,谓词符号的否定形式用负数标识,但绝对值相同。另一个是string类型,表示该谓词的参数表。
class Predication
{public: intnum;
p指向S2中的下一个子句;}while(p!=head1)
输出信息:该子句集不能证明不可满足;
退出程序;
}}
}
}
//该函数从p和q指向的子句中寻找互补谓词对,并调用具体的归结实现函数生成新
子句,并返回新子句。如果子句p和q不能归结则返回NULL。
Clause *guijie(Clause *p,*q){
鲁宾逊归结原理算法:
一.算法流程:
谓词逻辑与归结原理1
p
q 1 0 1 0
p →q 1 0 1 1
q是p的必要条件有许多不同的叙述方式
– 因为p,所以q
– p仅当q – 只有q才p
– 除非q才p
– 除非q,否则非p
14/52
例 将下列命题符号化,并指出其真值
(1) (2) (3) (4)
如果3+3=6,则雪是白的。 如果3+3≠6,则雪是白的。 如果3+3=6,则雪不是白的。 如果3+3≠6,则雪不是白的。
解:令p:3+3=6,p的真值为1。 q:雪是白色的,q的真值也为1。 (1) p→q 1 1 0 1
15/52
(2)┐p→q
(3) p→┐q
(4) ┐p→┐q
例 将下列命题符号化,并指出其真值
以下命题中出现的a是一个给定的正整数: (5) 只要a能被4整除,则a一定能被2整除。 (6) a能被4整除,仅当a能被2整除。 (7) 除非a能被2整除, a才能被4整除。 (8) 除非a能被2整除,否则a不能被4整除。 (9) 只有a能被2整除, a才能被4整除。 (10)只有a能被4整除, a才能被2整除。
9/52
例 将下列命题符号化
(1) (2) (3)
(4)
(5)
吴颖既用功又聪明。 p: 吴颖用功。 q: 吴颖不仅用功而且聪明。 吴颖聪明。 r: 张辉是三好学生。 吴颖虽然聪明,但不用 s: 王丽是三好学生。 功。 t: 张辉与王丽是同学。 张辉与王丽都是三好学 生。 张辉与王丽是同学。 (1)p∧q
22/52
赋值举例
在公式(┐p1∧┐p2∧┐p3)∨(p1∧p2)中, 000(p1=0,p2=0,p3=0), 110(p1=1,p2=1,p3=0)都是成真赋值, 001(p1=0,p2=0,p3=1), 011(p1=0,p2=1,p3=1)都是成假赋值。 在(p∧┐q)→r中, 011(p1=0,p2=1,p3=1)为成真赋值, 100(p1=1,p2=0,p3=0)为成假赋值。 重要结论: 含n(n≥1)个命题变项的公式共有2n个不同的赋 值。
人工智能第3章谓词逻辑与归结原理
人工智能第3章谓词逻辑与归结原理
1、谓词逻辑是什么?
谓词逻辑(Predicate Logic)是一种通用的符号化语言,用来表达
和分析各种谓词命题(Propositional Statements)的逻辑关系。
它可以
用来表达抽象概念和客观真理,并以精确的形式描述这些概念和真理。
谓
词逻辑最重要的功能是,它能够发现和解决各种类型的逻辑问题,这在人
工智能中显得尤为重要。
2、归结原理是什么?
归结原理是一种认识论。
它提出的基本原则是,如果要获得B给定A,应当给出一个充分陈述,即必须提供一系列真实可信的参数,以及由此产
生B的能力证明,在这种情况下A必须是正确的。
因此,归结原理会被用
来推理。
例如,通过归结原理,如果一个具体的概念被认为是正确的,那
么人们可以得出结论,即所有概念的结果也是正确的。
z3 solver 谓词 编程 示例
z3 solver 是微软研究院开发的一款高性能定理证明器,它主要用于解决布尔约束,线性算术约束和非线性约束等问题,被广泛应用于软硬件验证、形式化验证、符号执行、模型检验等领域。
本文将介绍 z3 solver 在谓词编程中的应用示例,并详细阐述其在谓词编程中的重要性和价值。
一、z3 solver 谓词编程的基本概念谓词编程是一种基于谓词逻辑的编程范式,它将程序的状态和行为抽象为谓词,通过对谓词进行推理和求解,来验证程序的正确性和性质。
而 z3 solver 作为一种高效的定理证明器,能够提供强大的谓词求解能力,为谓词编程的实践提供了有力的支持。
二、z3 solver 谓词编程示例接下来,我们将通过一个具体的示例来演示 z3 solver 在谓词编程中的应用。
假设有一个简单的程序,其功能为判断一个整数数组中是否存在重复元素。
此时,我们可以借助 z3 solver 来进行谓词编程,具体步骤如下:1. 定义状态和谓词:我们首先需要定义程序的状态和谓词,其中程序的状态包括输入数组和重复元素的存在性,谓词则是用来描述重复元素的性质。
2. 构造约束条件:接下来,我们需要根据程序的逻辑和性质,构造相应的约束条件,以限定谓词的取值范围。
在本例中,我们可以构造一个关于数组元素不等的约束条件。
3. 运行 z3 solver:将约束条件输入 z3 solver 中,通过调用 z3 solver 的求解接口,来求解谓词的取值。
如果 z3 solver 能够找到符合约束条件的解,即说明程序存在重复元素;如果 z3 solver 无法找到解,即说明程序不存在重复元素。
通过以上步骤,我们可以很方便地利用 z3 solver 来验证程序的正确性和性质,从而提高程序的可靠性和安全性。
三、z3 solver 在谓词编程中的重要性和价值z3 solver 作为一种高性能的定理证明器,具有以下几点重要性和价值:1. 提供强大的谓词求解能力:z3 solver 可以高效地求解包括布尔约束、线性算术约束和非线性约束在内的各种谓词,为谓词编程提供了强大的支持。
第三章 谓词逻辑与归结原理分析
2018/10/29
21
华北电力大学
概述-推理的控制策略
推理的控制策略 3.冲突解决策略 (2) 规则排序
规则编排的顺序就表示了启用的优先级
(3) 数据排序
数据排序就是把规则条件部分的所有条件排序,按优先级次序编排, 发生冲突时,首先使用在条件部分包含较高优先级数据的规则
(4) 就近排序
把最近使用的规则放在最优先的位置。如果某一规则经常使用,则 倾向于更多地使用这条规则
–完全归纳推理是必然性推理 • 不完全归纳推理 –只考察了相应事物的部分对象,就得出了结论 –不完全推理得出的结论不具有必然性,属于非必然性推理
2018/10/29
9
华北电力大学
概述-演绎推理、归纳推理和默认推理
归纳推理之类比法
在两个或两类事物在许多属性上都相同的基础上,推出 它们在其它属性上也相同,这就是类比法归纳推理 类比法归纳可形式化地表示为:
A1ΛA2ΛA3→B是重言式等价于A1ΛA2ΛA3Λ~B是矛 盾式,也就是永假式 反证法:证明A1ΛA2ΛA3Λ~B 是矛盾式(永假式)
2018/10/29
28
华北电力大学
归结法和其它推理方法的比较
语义网络、框架表示、产生式规则等知识表示 方法的推理都是以逻辑推理方法为前提的
也就是说如果有了规则和已知条件,就能够依据一 定的规则和公理顺藤摸瓜找到结果 归结方法是在一个规则指导下,进行自动推导。多 用于计算机自动推理、自动推导证明
2018/10/29
20
华北电力大学
概述-推理的控制策略
推理的控制策略
冲突解决策略 (1) 专一性排序 如果某一规则的条件部分规定的情况比另一规则的条件部分 所规定的情况更专门,则这条规则具有较高的优先级 例,有如下规则: 规则1:IF A AND B AND C THEN E; 规则2:IF A AND B AND C AND D THEN F; 数据库中A、B、C、D均为真,这时规则1和规则2都与数据库 相匹配,但因为规则2的条件部分包括了更多的限制,所以具有较 高的优先级 本策略是优先使用针对性较强的产生式规则
谓词演算与消解(归结)原理-图文
3.3.3 合一的一个例子
在此基础上又调用: unify (((father bill) (mother bill)), ((father bill) Y )) 导致调用: (1) unify((father bill),(father bill)) unify (father, father) unify (bill, bill) unify (( ), ( )) 所有的调用都成功,返回空代入集 { }。 (2) unify ((mother bill), Y)
与谓词相关的一个正整数称为元数或“参数数目”, 具有相同的名但元数不同的谓词是不同的。
真值true和false也是原子命题。
任何原子命题都能够用逻辑操作符将其变成谓词演 算的命题。用的联结词也和命题演算一样: ∨,∧, ~, => 和=。
当一个变元在一个命题中作为参数出现时,它代表 的是域中不特定的对象。谓词演算包括两个符号, 量词(全称量词)和彐(存在量词), 用于限定 包含变元的命题的含义。
3.2.2 谓词演算的语义
谓词演算表达式的真值 设有表达式E和在非空论域D上对E的一个解释I,E的
真值按以下规律决定: 1)一个常元的值是根据I指派给它的D的一个元素。 2)一个变元的值是根据I指派给它的D的一个元素集合
。 3)一个函词的值是根据由I指派给它的参数值计算得
到的D的元素。 4)真值符号true的值是T,false的值是F。 5)原子命题的值或者为T,或者为F,取决于解释I。 6)如果一个命题的值为F,则其否定式为T,否则为F
▪
~ (P∧Q) = (~P∨~Q)
▪分配律:P∨(Q∧R) = (P∨Q)∧(P∨R)
▪ 分配律:P∧(Q∨R)=(P∧Q)∨(P∧R)
人工智能谓词逻辑与归结原理
2021/2/21
9
子句集的求取由下列九个步骤组成:
(6)把母式化为合取范式
任何母式都可写成由一些谓词公式和(或)谓词公式的否定的析取的有限集组 成的合取。这种母式叫做合取范式。我们可以反复应用分配律。把任一母式 化成合取范式。例如,我们把
(7)消去全称量词
到了这一步,所有余下的量词均被全称量词量化了。同时,全称量词的次序
2021/2/21
4
命题逻辑的推理方法:
我们说如果有条件F1,F2,F3…..Fn同时成立,则有结 论B成立。 可以表示说: F1 ∧ F2 ∧ F3 ∧ …… ∧ Fn → B成立(永真)
~ (F1 ∧ F2 ∧ F3 ∧ …… ∧ Fn) ∨ B成立(永真)
~ ( ~ (F1 ∧ F2 ∧ F3 ∧ …… ∧ Fn) ∨ B )不成立
标准化而得到:
(4)消去存在量词
对于一个受存在量词约束的变量,如果它不受全称量词约束,则该变量用一
个常量来代替,如果它受全称量词约束,则该变量用一个含有全称量词对应
变量的函数(Skolem函数)来代替。
Skolem函数所使用的函数符号必须是新的,即不允许是公式中已经出现过的
函数符号。
替代的常量符号必须是个新的常量符号,它未曾在公式中其它地方使用过。
(9)更换变量名称
可以更换变量符号的名称,使一个变量符号不出现在一个以上的子句中。
例如,对于子集 {~P(x)∨~P(y)∨P[f(x,y)],~P(x)∨Q[x,g(x)],~P(x)∨~P[g(x)]},
在更改变量名后,可以得到子句集: { ~P(x1)∨~P(y)∨P[f(x1,y)], ~P(x2)∨Q[x2,g(x2)], ~P(x3)∨~P[g(x3)]
5-谓词逻辑与归结原理
24
sspu 王帅
命题逻辑的归结法
▪ 定义:设有两个子句C1= P∨C1’,C2= ~P∨C2’, 式 则R(C1,C2)=C1’∨C2’称为子句C1,C2的归结
▪ 即归结式是从两个子句中消去一个互补对而得到的
▪ 注1:没有互补对的两个子句没有归结式 ▪ 注2:一次只能消去一个互补对
❖例: C1= P∨Q,C2=~P∨~Q 则 C1,C2的归结式R(C1,C2)= Q∨~Q=T 注意 C1,C2不能归结出空子句
25
sspu 王帅
归结原理(消解原理)
▪ 定理:归结式是原两个子句的逻辑推论, 即C1ΛC2→R(C1,C2) , 反之不一定成立。
▪ 即:在某种指派下,C1,C2 为真,则它们 的归结式在该解释下也必为真
▪ 推论:子句集S={C1,C2 ,…,Cn}与子句 S={C,C1,C2 ,…,Cn}的不可满足性是相同 的,其中C是C1和C2的归结式
26
sspu 王帅
归结过程
▪ 从子句集S出发,只对S的子句进行归结, 并将所得归结式仍放入S中,再对新子句 集进行归结,重复下去,直到得到空子句 为止,说明S是不可满足的,从而说明S对 应的问题A1ΛA2ΛA3Λ~B不可满足(或产 生矛盾),所以A1ΛA2ΛA3→B是永真的 (成立的)
27
sspu 王帅
❖假言易位式: p → q <=> ~ p → ~ q
16
sspu 王帅
命题例
▪ 命题:能判断真假(不是既真又假)的陈述句。
简单陈述句描述事实、事物的状态、关系等性质。
例如:1. 1+1=2
➢2. 雪是黑色的。
➢3. 北京是中国的首都。
➢4. 到冥王星去渡假。
谓词逻辑归结原理源代码
#include<iostream.h>#include<string.h>#include<stdio.h>#define null 0typedef struct{char var;char *s;}mgu;void strreplace(char *string,char *str1,char *str2) {char *p;while(p=strstr(string,str1)){int i=strlen(string);int j=strlen(str2);*(string+i+j-1)='\0';for(int k=i-1;(string+k)!=p;k--)*(string+k+j-1)=*(string+k);for(i=0;i<strlen(str2);i++)*(p++)=*(str2+i);}}void sort(mgu *u,int count){int j=count;int k=j;if(count==1)return;for(int i=1;i<count;i++){if(!((u+i)->s))continue;if((u+i)->var==(u+j)->var){delete (u+j)->s;(u+j)->s=null;k--;j=i;}if(((u+i)->s)&&((u+i)->var==*((u+i)->s))) {delete (u+i)->s;(u+i)->s=null;k--;}}j=count;if(k==j)return;count=k;for(int i=1;i<j&&k>0;i++){if((u+i)->s)continue;while(!((u+j)->s))j--;(u+i)->var= (u+j)->var;(u+i)->s= (u+j)->s;(u+j)->s=null;k--;}cout<<"gjvjkhllknkln";}class unifier{char *string;mgu unit[50];int count;public:int num;unifier();void input();int differ(int n);int change(int i,int j,int n);void print();~unifier(){delete string;}};unifier::unifier(){count=0;unit[0].s=null;}void unifier::input(){cout <<endl<< "请输入原子谓词公式的个数(输入0退出) "; cin>>num;string=new char[num*50];cout<<"请注意:公式的输入不能出错!"<<endl;for(int j=1;j<=num;j++){cout << "请输入第" << j << "个原子谓词公式(字符个数不超过50个)" <<endl; cin>>(string+(j-1)*50);}}int unifier::change(int i,int j,int n){char temp[2][10];temp[0][0]=string[i++];temp[1][0]=string[j++];if(string[i]!='(')temp[0][1]='\0';else{int k=1,flag=1;temp[0][k++]=string[i++];while((flag!=0)&&k<10){if(string[i]=='(')flag++;else if(string[i]==')')flag--;temp[0][k++]=string[i++];}temp[0][k]='\0';}temp[1][1]='\0';if(strlen(temp[1])==1){if(strstr(temp[0],temp[1]))return 2;strreplace(string+n*50,temp[1],temp[0]);strreplace(string+(n+1)*50,temp[1],temp[0]);count++;int m=count;unit[m].var=temp[1][0];char *p=new char[strlen(temp[0])+1];unit[m].s=p;strcpy(p,temp[0]);}return 1;}int unifier::differ(int n){int i=n*50,j=(n+1)*50;while((string[i]!='\0')&&(string[j]!='\0')&&(string[i]==string[j])) {i++;j++;}if(string[i]=='\0'||string[j]=='\0')return 1;int k;if(string[i+1]=='(')k=change(i,j,n);else if(string[j+1]=='(')k=change(j,i,n);else if(string[j]=='x'||string[j]=='y'||string[j]=='z'||string[j]=='u'|| string[j]=='v'||string[j]=='w')k=change(i,j,n);elsek=change(j,i,n);if(k==2)return k;j=count;char c[2],*p;for(i=1;i<j;i++){c[0]=unit[j].var;c[1]='\0';if(!strstr(unit[i].s,c))continue;p=new char[strlen(unit[j].s)+strlen(unit[i].s)+1];strcpy(p,unit[i].s);strreplace(p,c,unit[j].s);delete unit[i].s;unit[i].s=p;}sort(unit,count);return 0;}void unifier::print(){cout <<"The MGU is ";for(int i=1;i<count+1;i++){cout <<(unit[i]).s<<"/"<<unit[i].var;if(i<count)cout<<",";}}int once(){unifier form;form.input();if(form.num<2){cout<<"The MGU is empty!"<<endl;return form.num;}int k=form.differ(0);if(k==1&&form.num==2){cout<<"The MGU is empty!"<<endl;return form.num;}if(k==2){cout<<"The MGU is not exist!"<<endl;return form.num;}else if(k==0&&form.num==2){while(k!=1){k=form.differ(0);if(k==2){cout<<"The MGU is not exist!"<<endl;return form.num;}}form.print();return form.num;}for(k=0;k<form.num-1;k++){if(form.differ(k)==2){cout<<"The MGU do not exist!"<<endl;return form.num; }}form.print();}int main(){int i=once();while(i!=0)i=once(); return 0;}。
人工智能 谓词逻辑与归结原理
人工智能
命题逻辑归结方法
吉林大学珠海学院计算机科学与技术系
命题归结式 设 c1, c2是两个子句, c1=L1∨D1, c2=L2∨D2 , 其中L1 =~ L2, L1 , L2也 称作互补文字, D1和D2 为子句. 则 D1∨D2称作c1, c2的归结式, 记为R(c1, c2), c1, c2称做是归结式的亲本子句。 • 例如, 设 c1, c2是两个子句, c1 = ~P∨Q, c2 = P∨R∨~ S, 则~P和P为互补文 字, c1, c2的归结式是Q∨R∨~ S.
人工智能
命题逻辑归结方法
吉林大学珠海学院计算机科学与技术系
• 一个命题逻辑公式可以采用如下方式转换 成等价的子句的合取形式, 即合取范式: • 1. 利用等价公式 P←→ Q =( P→Q)∧ (Q←P)和P→Q=~P∨Q删去公式中的←→ 符号和→符号. • 2. 利用De Morgan 律把所有的否定符号移 到每个原子之前. • 3. 利用分配律得到子句的合取形式
定义:满足, 模型, 有效, 不一致
如果一个解释 I 使语句 s 取值为真, 则称解释I满足s, 也称I是s的模型,如果语句s对所有解释都取值为真,则s称 为是有效的(valid),如果语句s对所有解释都取值为假,则 s称为是不一致的(inconsistent),
定义:证明过程
利用逻辑蕴涵推出新语句的过程,推导出的结果称为推导 结果
定义: 命题逻辑公式(Well-formed formula, WFF) 利用命题演算符号, 真值符号和逻辑连接词组成
的合法符号串。
人工智能
合取项(conjunct) 析取项(disjunct)
吉林大学珠海学院计算机科学与技术系
蕴涵式(implication)
第3.3节--谓词逻辑的归结原理PPT课件
辖域扩展
x y z w ( P ( a , x , y ) Q ( w , b ) R ( z ))
辖域扩展
4)求 skolem 标准型
x y z w ( P ( a , x , y ) Q ( w , b ) R ( z ))
x z w ( P ( a , x , f ( x )) Q ( w , b ) R ( z ))
2008-2009学年第1学期
.
1515
求mgu的步骤
① 令W={F1, F2},k=0,W0=W,σ0={ }; ② 若Wk已合一,停止,σk就是mgu;否则找不一
致集Dk; ③ 若Dk存在vk和tk,且vk不出现于tk,转④;否则
不可合一; ④ 令σk+1= σk·{tk/vk},Wk+1=Wk{tk/vk} ⑤ k=k+1,转②。
2) 深入到量词后,得:
x yP ( a , x , y ) x ( yQ ( y , b ) R ( x ))
3)求前束范式,得:
x yP ( a , x , y ) z ( wQ ( w , b ) R ( z ))
换名
x yP ( a , x , y ) z w ( Q ( w , b ) R ( z ))
Q(a, y)∨R(b, z)
2008-2009学年第1学期
.
1919
归结式的合理性
∵{C1, C2} R ∴{C1, C2} {C1, C2, R} 但是,若R=□,则意味着C1和C2是互否定的,{C1, C2}
是不可满足的。
归结使子句集不断增大,一旦归结出“□”,则子句集中 有互否定的单元子句存在,从而整个子句集是不可满足 的。
2008-2009学年第1学期
谓词逻辑与归结原理2
开始: (1)消去蕴涵符号 只应用∨和~符号,以~A∨B替换AB。
16/57
(2) (x){~P(x)∨{(y)[~P(y)∨P(f(x,y))]
∧(y)[Q(x,y)∧~P(y)]}}
(2) 减少否定符号的辖域 每个否定符号~最多只用到一个谓词符号上,并 反复应用狄· 摩根定律。
(3) (x){~P(x)∨{(y)[~P(y)∨P(f(x,y))]
20/57
谓词归结子句形( Skolem 标准形)
量词消去原则: 消去存在量词“”,略去全程量词 “”。
注意:左边有全程量词的存在量词,消去
时该变量改写成为全程量词的函数;如没有, 改写成为常量。
21/57
谓词归结子句形( Skolem 标准形)
( x )( P(x) ∨ Q) <=> ( x ) P(x) ∨ Q ( x )( P(x) Λ Q) <=> ( x ) P(x) Λ Q ( x )( P(x) → Q) <=> ( x ) P(x) → Q ( x )(Q → P(x) ) <=>Q → ( x ) P(x) ( x )( P(x) ∨ Q) <=> ( x ) P(x) ∨ Q ( x )( P(x) Λ Q) <=> ( x ) P(x) Λ Q ( x )( P(x) → Q) <=> ( x ) P(x) → Q ( x )(Q → P(x) ) <=>Q → ( x ) P(x)
文字:不含任何连接词的谓词公式。 子句:一些文字的析取(谓词的和)。 子句集S的求取: G → SKOLEM标准形 → 消去存在变量 → 以“,”取代“Λ”,并表示为集合形式 。
人工智能导论课件:第四章 谓词逻辑与归结原理
谓词逻辑
是一种形式语言,具有严密的理论体系 是一种常用的知识表示方法, 例:
City(北京) City(上海) Age(张三,23) (X)(Y)(Z)(father(X, Y)father(Y,
Z)gf(X, Z)
6
归结原理
归结原理是一种定理证明方法,1965年由 J.A.Robinson提出,从理论上解决了定理证明 问题。当时被认为是人工智能领域的重大突破。
例如:令E为p(x,y,f(a))
={b/x,f(x)/y},则 E= ?
E=p(b,f(x),f(a)) 此例显示了同时置换的含义. 可以看到E是
在E上的作用,也就是将E中的(i=1, ,n)同时换成相 应的ti所得到的公式.
34
ห้องสมุดไป่ตู้
置换乘法
定义 令 ={s1/y1,,sm/ym}, ={t1/x1,,tn/xn},则与的复合是
32
置换
定义: 置换是形如{t1/x1,,tn/xn}的有限集,其中xi是 互不相同的变量,ti是不等于xi的项,且xi与ti互不循环 出现. 如果ti都是不含变量的项(基项),称该置换为基置换. 若={ },则称为空置换(表示不做置换),记为.
例如:1) {a/x,g(y)/y,f(g(b))/z}是一个置换? (是, 但不是基置换).
F1F2…Fn~W为永假,可以通过证明F所 对应的子句集S=S0∪{~W}是不可满足的。
22
命题: P|=F P{F}是不可满足的。 证明: ① 若P {~F}是不可满足的,则 P|= F ② 若P|=F 则 P {~F}是不可 满足的。(反证法)
23
归结原理
基本思想 将待证明的逻辑公式的结论(F),通过 等值公式转换成附加前提,再证明该逻 辑公式是不可满足的。
d3-谓词逻辑归结基本方法
例3.1(永真性判断)给定一阶语言 , 其中 是两个常元,是 元谓词符号, 是不同的变元. 假设 是以下公式:考察公式 :即它的前束范式是:它的 Skolem 范式 是:根据以下语义推出关系:可知:若将 看成是命题变元 , 对于子句集合它具有一个反驳, 这表明它能够语义推出一个恒假式, 所以, 能够语义推出一个恒假式, 因而 是永假的.所以 是永假的.所以 是永真的.□定义3.1(文字,相反文字,子句,子句集合,空子句,基文字,基子句,子句代换,子句集合代换 )对于谓词逻辑, 可以定义类似于命题逻辑的一些概念:z原子公式或者原子公式的非称为文字.谓词逻辑归结法,,,,.L={c1,c2,P,Q}c1,c2P,Q1x,y,zA(^xP(x)Z^xQ(x))> ^x(P(x)Z Q(x))\A\((^xP(x)Z^xQ(x))> ^x(P(x)Z Q(x))),(^xP(x)Z^xQ(x))[]x(\P(x)[\Q(x)).^x^y]z((P(x)Z Q(y))[\P(z)[\Q(z)).C]z((P(c1)Z Q(c2))[\P(z)[\Q(z)).C(P(c1)Z Q(c2))[\P(c1)[\Q(c1)C(P(c1)Z Q(c2))[\P(c2)[\Q(c2)C X P(c1)Z Q(c2)C X\P(c1)C X\Q(c2)P(c1),Q(c2)p,q{p Z q,\p,\q},CC\AA X Xz 若 是原子公式,则 是 的 相反文字,是 的相反文字. z 文字的有限集合称为子句.z 不出现变元的文字称为基文字. z 不出现变元的子句称为基子句. z 空的子句称为空子句.z 子句的有限集合称为子句集合.z称 为一个代换. 若 是文字, 则 表示z若子句 是 , 则 表示□事实3.1(子句集合与 Skolem 范式)子句 也写为 表示的闭包. 子句集合表示以下合取范式的闭包:因而表示一个 Skolem 范式.□例3.2(基本概念)z 与 是相反文字, 但是 与 不是相反文字.z假设代换 , 则 等于 .z基子句 表示 .z子句 表示语句L \L L L \L 5:{x 1/t 1,l ,x m /t m }L 5(L)L x 1,l ,xm t 1,l ,t m.C {L 1,l ,L n }5(C){5(L 1),l ,5(L n )}.{L 1,l ,L n }L 1ZlZ L n L 1ZlZ L n {{L 1,1,l ,L 1,n 1},{L 2,1,l ,L 2,n 2},l ,{L m,1,l ,L m,n m}}(L 1,1ZlZ L 1,n 1)[(L 2,1ZlZ L 2,n 2)[l[(L m,1ZlZ L m,nm).P(c 1)\P(c 1)P(c 1)\P(z)5={z/c 1}5(\P(z))\P(c 1){P(c)}P(c){P(x),Q(y)}]x ]y(P(x)Z Q(y)).z子句集合 表示 Skolem 范式□定义3.2(可满足)给定一阶语言 , 假设 是子句,是字句集合. z的一个解释 满足 , 是指 满足 所表示的语句.记为z若以下条件成立:则称 是 和 的逻辑推论. 记为 .z若存在 的解释满足 , 则称 是可满足的; 否则称 是不可满足的.z解释 满足 是指 满足 所表示的 Skolem 范式.z若存在 的解释满足 , 则称 是可满足的; 否则称 是不可满足的.□例3.3(可满足)给定一阶语言 , 假设 是 元谓词符号,是常元, 是变元. z子句 是可满足的.z□定义3.3(归结子句)给定一阶语言 , 假设 是 的两个子句. 形如的子句称为 与 的归结子句. 其中 是两个代换,而 与 是两个相反的文字.若三个子句 具有上述关系, 则记为 .□例3.4(归结子句)对任意的赋值 , 当 及 时, 有 . {P(x)Z Q(y),P(c)Z\Q(z)}]x ]y ]z ((P(x)Z Q(y))[(P(c)Z\Q(z))).L C,C 1,C 2,C 3S L I C I C I X C I I X C 1I X C 2I X C 3C 3C 1C 2C 1,C 2X C 3L C C C I S I S L S S S L P,Q 1c x,y P(c)Z Q(x)P(c)Z Q(x),\Q(y)P(c).L C 1,C 2L (51(C 1)-{L 1})P (52(C 2)-{L 2})C 1C 251,52L 1J 51(C 1),L 2J 52(C 2),L 1L 2C 1,C 2,C 3C 1,C 2U res C 3X给定一阶语言 , 其中 是常元,是变元, 是 元函数符号, 是 元谓词符号. 有以下归结推出关系:z .z .z .z .z. z假设{ 是 . {是 . 则:□定义3.4(反驳)子句集合 的一个反驳是指子句的有限序列 , 它满足以下条件:z 是 .z对于每个 :{或者 ,{或者存在 使得 . □例3.5(反驳)给定一阶语言 , 其中 是常元,是变元, 是 元谓词符号. 子句集合有一个反驳 , 其中:L ={c,f,g,P,Q}c x,y f,g 11P(c),\P(x)U res P(c)Z Q(x),\Q(y)U res P(c)P(x)Z Q(x),\Q(y)U res P(x)P(x)Z Q(x),\Q(y)U res P(f (x))P(x)Z Q(x),\Q(y)res P(f 2(x))A P(x)Z P(f(y))Z R(g(y))B \P(y)Z\R(y)A,B res P(f(y))Z R(g(y))Z\R(y),A,B res R(g(y))Z\R(f(y)).S {C i |15i 5n}C n `i C i J S j,k<i (15j,k< n )C j ,C k U res C i L ={c 1,c 2,P,Q}c 1,c 2x P,Q 1{P(c 1)Z Q(c 2),\P(x),\Q(x)}{C 1,C 2,C 3,C 4,C 5}C 1:P(c 1)Z Q(c 2)C 2:\P(x)C 3:\Q(x)C 4:Q(c 2)C 1,C 2U res C 4C 5:`C 3,C 4U res C 5`U U U□定理3.1(归结推出与语义推出)给定一阶语言 , 假设 是 的两个子句.证明:从 可知存在代换 及两个相反的文字 与 , 使得 , , 而假设子句 分别表示公式 . 则可知 . 因为 , 所以即:□定理3.2(归结方法的可靠性)给定一阶语言 , 假设 是 的子句集合. 若 有一个反驳, 则 是不可满足的. 证明根据归结一步可以传递可满性, 若 是可满足的, 则它的反驳序列中每个子句都是可满足的, 但最後一个空子句是不可满足的. 所以 是不可满足的.□定理3.3(归结方法的完全性)给定一阶语言 , 假设 是 的子句集合. 若 是不可满足的, 则 有一个反驳.□例3.6(简单证明)给定一阶语言 , 其中 是常元,是变元, 是 元谓词符号. 语句的 Skolem 范式是:所对应的子句集合是:若 则 .L C 1,C 2L C 1,C 2U res C 3C 1,C 2X C 3C 1,C 2U res C 351,52L 1L 2L 1J 51(C 1)L 2J 52(C 2)C 3=(51(C 1)-{L 1})P (52(C 2)-{L 2}).C i 9i 9i X 5i (C i )(i=1,2)(51(C 1)-{L 1})P (52(C 2)-{L 2})C 391,92C 3,91,9293.C 1,C 2X C 3.L S L S S S S L S L S S L ={c 1,c 2,P,Q}c 1,c 2x P,Q 1\((^xP(x)Z^xQ(x))> ^x(P(x)Z Q(x))),]z((P(c 1)Z Q(c 2))[\P(z)[\Q(z)).=X X它有一个反驳:因而是永假的, 即是永真的. 子句集合对应的基实例集合是若将 分别看成是命题变元 , 则上述基实例集合对应于命题逻辑语句集合:它有一个反驳:对应于谓词逻辑的反驳:可以直接转换为最初子句集合的反驳:□例3.7(多种证明)给定一阶语言 , 假设 是 元谓词符号, 是 元谓词符号,是三个不同的变元, 是两个不同的常元. 定义以下公式: {P(c 1)Z Q(c 2),\P(z),\Q(z)},< P (c 1)Z Q(c 2),\P(z),\Q(z),Q(c 2),`> .\((^xP(x)Z^xQ(x))> ^x(P(x)Z Q(x)))(^xP(x)Z^xQ(x))> ^x(P(x)Z Q(x)){P(c 1)Z Q(c 2),\P(z),\Q(z)},{P(c 1)Z Q(c 2),\P(c 1),\P(c 2),\Q(c 1),\Q(c 2),},P(c 1),P(c 2),Q(c 1),Q(c 2)p 1,p 2,q 1,q 2{p 1Z q 2,\p 1,\p 2,\q 1,\q 2},<p 1Z q 2,\p 1,\q 2,q 2,`> .<P (c 1)Z Q(c 2),\P(c 1),\Q(c 2),Q(c 2),`> .< P (c 1)Z Q(c 2),\P(z),\Q(z),Q(c 2),`> .L ={c 1,c 2,P,Q,R,S}P,Q,R 1S 2x,y,z c 1,c 2A :^x(P(x)[]y(R(y)> S (x,y))),B :]x(P(x)>]y(Q(y)> \S(x,y))),C :]x(R(x)>\Q(x)).则 .□证明(解释赋值方法).若 是一个解释. 假设 , 以下证明:z从 , 可知存在 , 使得 , 且对任意的 , 都有当 时z因为 且 , 所以因而 . z所以 .证毕.□证明(归结方法).的转化为:的转化为:的转化为:前提与结论的反面可以转化为以下子句:有以下的归结推出:对任意的 , 当 时 .若 则 , , , ,., , ,,A,B X C I I X A [B a J D I R I (a )=1Q I (a )=0I X A b J D I P I (b )=1a J D I R I (a )=1S I (b ,a )=1.I X B I X P I (b )Q I (a )=1S I (b ,a )=0.Q I (a )=0I X C A ^x(P(x)[]y(R(y)>S (x,y))),^x ]y(P(x)[(R(y)>S (x,y)))^x ]y(P(x)[(\R(y)Z S(x,y)))]y(P(c 1)[(\R(y)Z S(c 1,y)))]x(P(c 1)[(\R(x)Z S(c 1,x))){P(c 1),\R(x)Z S(c 1,x)}B ]x(P(x)> ]y(Q(y)> \S(x,y))),]x ]y(P(x)>(Q(y)> \S(x,y))),]x ]y(\P(x)Z\Q(y)Z\S(x,y)),]]x(\P(y)Z\Q(z)Z\S(y,z)),{\P(y)Z\Q(z)Z\S(y,z)}.\C \]x(R(x)> \Q(x)).^x \(R(x)> \Q(x))^x(R(x)[Q(x))R()[Q(c 2){R(c 2),Q(c 2)}C 1:P(c 1)C 2:\R(x)Z S(c 1,x),C 3:\P(y)Z\Q(z)Z\S(y,z),C 4:R(c 2)C 5:Q(c 2)y c 2所以证毕.□例3.8(语义推出)给定一阶语言 , 为 元谓词符号, 为 元谓词符号, 为元谓词符号,是三个不同的常元.是四个不同的变元.是以下公式:则 .证明的转化为:的转化为:的转化为:的转化为:可得以下子句:有以下的归结关系:,,..,.,.,,.C1,C3Ures\Q(z)Z\S(c1,z),C2,C4UresS(c1,c2),\Q(z)Z\S(c1,z),S(c1,c2)Ures\Q(c2),C5,\Q(c2)Ures`.A,B X C.L={a,b,c,P,Q,R,S}P,S1R2Q 3a,b,c x,y,z,w A,B,C,D ]x]y((Q(x,x,y)[\P(y))> S(x)),^x^y(R(y,x)[\P(x))^x]yQ(x,x,y)^xS(x)A,B,C X DA]x]y((Q(x,x,y)[\P(y))> S(x)),]x]y(\Q(x,x,y)Z P(y)Z S(x)),\Q(x,x,y)Z P(y)Z S(x)B^x^y(R(y,x)[\P(x)){R(b,a),\P(a)}C^x]yQ(x,x,y)Q(c,c,z)\D\^xS(x)]x\S(x)\S(w)\Q(x,x,y)Z P(y)Z S(x)R(b,a),\P(a)Q(c,c,z)\S(w)证毕.□例3.9(不可推出)给定一阶语言 , 为 元谓词符号,是两个不同的常元. 是三个不同的变元. 则证明可以化为:可能的归结推出只有:因而上述子句集合没有反驳. 即□例3.10(符号化与证明)某些学生喜欢每门课程, 没有学生喜欢文学. 因此, 没有课程是文学. 假设学生与课程的集合为论域, 定义以下谓词:则有以下的符号化:z“某些学生喜欢每门课程”的符号化为 :\Q(x,x,y)Z P(y)Z S(x),Q(c,c,z)U res P(y)Z S(c),P(y)Z S(c),\P(a)U res S(c),S(c),\S(w)U res `.L ={c 1,c 2,P,Q}P,Q 1c 1,c 2x,y,z ^xP(x),^xQ(x)X^x(P(x)[Q(x))./^xP(x)[^xQ(x)[\^x(P(x)[Q(x))^xP(x)[^xQ(x)[]x(\P(x)Z\Q(x))^x ^y(P(x)[Q(y))[]x(\P(x)Z\Q(x))^x ^y ]z(P(x)[Q(y)[(\P(z)Z\Q(z)){P(c 1),Q(c 2),\P(z)Z\Q(z)}P(c 1),\P(z)Z\Q(z)U res \Q(c 1),Q(c 2),\P(z)Z\Q(z)U res \P(c 2).^xP(x),^xQ(x)X^x(P(x)[Q(x))./P(x)x D(x)x S(x)x L(x,y)x yA ^x(P(x)[]y(D(y)>L (x,y))).z“没有学生喜欢文学”的符号化为 :z“没有课程是文学”的符号化为 :需要证明假设 是两个不同的常元,是三个不同的变元.的转化为:的转化为:的转化为:有以下归结推出关系:因而□作业全部B\^xy(P(x)[S(y)[L(x,y)).C\^x(D(x)[S(x)).A,B X C.c1,c2x,y,zA^x(P(x)[]y(D(y)> L(x,y))).P(c1),\D(y)Z L(c1,y).P(c1),\D()Z L(c1,z).B\^xy(P(x)[S(y)[L(x,y)).\P(x)Z\S(y)Z\L(x,y).\C\\^x(D(x)[S(x)).^x(D(x)[S(x)).D(c2),S(c2).P(c1),\P(x)Z\S(y)Z\L(x,y)Ures\S(y)Z\L(c1,y),S(c2),\S(y)Z\L(c1,y)Ures\L(c1,c2),\D(z)Z L(c1,z),\L(c1,c2)Ures\D(c2),D(c2),\D(c2)Ures`.A,B X C.z。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
#include<iostream.h>#include<string.h>#include<stdio.h>#define null 0typedef struct{char var;char *s;}mgu;void strreplace(char *string,char *str1,char *str2) {char *p;while(p=strstr(string,str1)){int i=strlen(string);int j=strlen(str2);*(string+i+j-1)='\0';for(int k=i-1;(string+k)!=p;k--)*(string+k+j-1)=*(string+k);for(i=0;i<strlen(str2);i++)*(p++)=*(str2+i);}}void sort(mgu *u,int count){int j=count;int k=j;if(count==1)return;for(int i=1;i<count;i++){if(!((u+i)->s))continue;if((u+i)->var==(u+j)->var){delete (u+j)->s;(u+j)->s=null;k--;j=i;}if(((u+i)->s)&&((u+i)->var==*((u+i)->s))) {delete (u+i)->s;(u+i)->s=null;k--;}}j=count;if(k==j)return;count=k;for(int i=1;i<j&&k>0;i++){if((u+i)->s)continue;while(!((u+j)->s))j--;(u+i)->var= (u+j)->var;(u+i)->s= (u+j)->s;(u+j)->s=null;k--;}cout<<"gjvjkhllknkln";}class unifier{char *string;mgu unit[50];int count;public:int num;unifier();void input();int differ(int n);int change(int i,int j,int n);void print();~unifier(){delete string;}};unifier::unifier(){count=0;unit[0].s=null;}void unifier::input(){cout <<endl<< "请输入原子谓词公式的个数(输入0退出) "; cin>>num;string=new char[num*50];cout<<"请注意:公式的输入不能出错!"<<endl;for(int j=1;j<=num;j++){cout << "请输入第" << j << "个原子谓词公式(字符个数不超过50个)" <<endl; cin>>(string+(j-1)*50);}}int unifier::change(int i,int j,int n){char temp[2][10];temp[0][0]=string[i++];temp[1][0]=string[j++];if(string[i]!='(')temp[0][1]='\0';else{int k=1,flag=1;temp[0][k++]=string[i++];while((flag!=0)&&k<10){if(string[i]=='(')flag++;else if(string[i]==')')flag--;temp[0][k++]=string[i++];}temp[0][k]='\0';}temp[1][1]='\0';if(strlen(temp[1])==1){if(strstr(temp[0],temp[1]))return 2;strreplace(string+n*50,temp[1],temp[0]);strreplace(string+(n+1)*50,temp[1],temp[0]);count++;int m=count;unit[m].var=temp[1][0];char *p=new char[strlen(temp[0])+1];unit[m].s=p;strcpy(p,temp[0]);}return 1;}int unifier::differ(int n){int i=n*50,j=(n+1)*50;while((string[i]!='\0')&&(string[j]!='\0')&&(string[i]==string[j])) {i++;j++;}if(string[i]=='\0'||string[j]=='\0')return 1;int k;if(string[i+1]=='(')k=change(i,j,n);else if(string[j+1]=='(')k=change(j,i,n);else if(string[j]=='x'||string[j]=='y'||string[j]=='z'||string[j]=='u'|| string[j]=='v'||string[j]=='w')k=change(i,j,n);elsek=change(j,i,n);if(k==2)return k;j=count;char c[2],*p;for(i=1;i<j;i++){c[0]=unit[j].var;c[1]='\0';if(!strstr(unit[i].s,c))continue;p=new char[strlen(unit[j].s)+strlen(unit[i].s)+1];strcpy(p,unit[i].s);strreplace(p,c,unit[j].s);delete unit[i].s;unit[i].s=p;}sort(unit,count);return 0;}void unifier::print(){cout <<"The MGU is ";for(int i=1;i<count+1;i++){cout <<(unit[i]).s<<"/"<<unit[i].var;if(i<count)cout<<",";}}int once(){unifier form;form.input();if(form.num<2){cout<<"The MGU is empty!"<<endl;return form.num;}int k=form.differ(0);if(k==1&&form.num==2){cout<<"The MGU is empty!"<<endl;return form.num;}if(k==2){cout<<"The MGU is not exist!"<<endl;return form.num;}else if(k==0&&form.num==2){while(k!=1){k=form.differ(0);if(k==2){cout<<"The MGU is not exist!"<<endl;return form.num;}}form.print();return form.num;}for(k=0;k<form.num-1;k++){if(form.differ(k)==2){cout<<"The MGU do not exist!"<<endl;return form.num;}}form.print(); }int main() {int i=once(); while(i!=0)i=once(); return 0;}。