第二部分:第5章 Prolog基础 5.5程序控制 当试图为如下目标寻找一个解时 ? -father(x, y 可以有许多实现方式。例如,如果只考虑定理中的第二个事实,那么, 就可得到一个解 ●但是 Prolog不使用随机搜索策略,而总是使用同一种策略。系统保持 一个当前目标,始终从左到右进行求解。 例如,如果当前目标是: ?-grandFather(x, y), mother(y, Z) 那么,系统就会尝试在求解子目标 mother(Y,Z)之前,首先求解子目 标 grandFather(X,丫)。如果第一个(即最左面的)子目标不能被求 解,则全部问题就没有解,第二个子目标根本就不用再尝试求解。 2004.11.3 A|程序设计 16
2004.11.3 AI程序设计 16 第二部分:第5章 Prolog基础 5.5 程序控制 ⚫ 当试图为如下目标寻找一个解时: ?- father(X, Y). ⚫ 可以有许多实现方式。例如,如果只考虑定理中的第二个事实,那么, 就可得到一个解。 ⚫ 但是Prolog不使用随机搜索策略,而总是使用同一种策略。系统保持 一个当前目标,始终从左到右进行求解。 例如,如果当前目标是: ?- grandFather(X, Y), mother(Y, Z) 那么,系统就会尝试在求解子目标mother(Y, Z)之前,首先求解子目 标grandFather(X, Y )。如果第一个(即最左面的)子目标不能被求 解,则全部问题就没有解,第二个子目标根本就不用再尝试求解
第二部分:第5章 Prolog基础 5.5程序控制 ●当求解一个特定子目标时,事实和规则将被自上而下进行尝试。 ●当使用规则求解了一个子目标时,当前目标中待求解的那个子目标将 被其规则右边的那些子目标所代替 ●例如,如果当前目标是 ?-grand Father(x, y, mother(y, z) ●而我们使用规则 grandFather(Person GrandFather): father(Person, Father, father (Father, Grand Father ●去求解第一个子目标,则作为结果的当前目标是 ?-father(, Father), father (Father, Y, mother(Y, z) 2004.11.3 A|程序设计 17
2004.11.3 AI程序设计 17 第二部分:第5章 Prolog基础 5.5 程序控制 ⚫当求解一个特定子目标时,事实和规则将被自上而下进行尝试。 ⚫当使用规则求解了一个子目标时,当前目标中待求解的那个子目标将 被其规则右边的那些子目标所代替。 ⚫例如,如果当前目标是: ?- grandFather(X, Y), mother(Y, Z). ⚫而我们使用规则 grandFather(Person, GrandFather) :- father(Person, Father), father(Father, GrandFather). ⚫去求解第一个子目标,则作为结果的当前目标是 ?- father(X, Father), father(Father, Y), mother(Y, Z)
第二部分:第5章 Prolog基础 5.5程序控制 ●注意,规则中的某些变量已经被子目标中的变量替换,我们将在后面详细解 释这一点。 ●给定这种评价策略,就可以更多地从程序上解释子句的控制过程。 ●考虑这个规则: grandFather(Person, Grand Father) father(Person, Father), father(Father, Grand Father) ●给定严格的评价策略,我们可以这样解读这个规则:为了求解 grand Father( Person, Grand Father),首先要求解 father( Person, Father),然后再求解 father( Father, Grand Father)。或者这样理解:当调 用 grand Father( Person, Grand Father)时,首先要调用 father( Person, Father),然后再调用 Father( Father, Grand Father)。 ●有了这种程序上的解读,我们就可以理解,所谓的谓词实际上就相当于其他 编程语言中的过程或子例程。它们之间主要的区别在于一个 Prolog谓词对于 个单个提问可以返回多个结果或没有结果(即失败)。这一点将在下一节 详细进行讨论。 2004.11.3 A|程序设计 18
2004.11.3 AI程序设计 18 第二部分:第5章 Prolog基础 5.5 程序控制 ⚫注意,规则中的某些变量已经被子目标中的变量替换,我们将在后面详细解 释这一点。 ⚫给定这种评价策略,就可以更多地从程序上解释子句的控制过程。 ⚫考虑这个规则: grandFather(Person, GrandFather) :- father(Person, Father), father(Father, GrandFather). ⚫给定严格的评价策略,我们可以这样解读这个规则:为了求解 grandFather(Person, GrandFather),首先要求解father(Person, Father),然后再求解father(Father, GrandFather)。或者这样理解:当调 用grandFather(Person, GrandFather) 时,首先要调用father(Person, Father),然后再调用father(Father, GrandFather)。 ⚫有了这种程序上的解读,我们就可以理解,所谓的谓词实际上就相当于其他 编程语言中的过程或子例程。它们之间主要的区别在于一个Prolog谓词对于 一个单个提问可以返回多个结果或没有结果(即失败)。这一点将在下一节 详细进行讨论
令第二部分:第5童Plog基础 5.5.1失败 ●在定理中,一个谓词提问可能没有任何一个解。例如调用 parent("Hans",),因为不存在适用于Hans的双亲关系的事 实或规则,所以没有一个解。我们就说这个谓词调用失败 (fai)。如果目标失败了,则说明定理中完全不存在针对该目 标的解。下一节将解释在通常情况下,即当它不是一个失败的目 标时,如何处理失败。 2004.11.3 A|程序设计 19
2004.11.3 AI程序设计 19 第二部分:第5章 Prolog基础 5.5.1 失败 ⚫ 在定理中,一个谓词提问可能没有任何一个解。例如调用 parent("Hans", X),因为不存在适用于Hans的双亲关系的事 实或规则,所以没有一个解。我们就说这个谓词调用失败 (fail)。如果目标失败了,则说明定理中完全不存在针对该目 标的解。下一节将解释在通常情况下,即当它不是一个失败的目 标时,如何处理失败
第二部分:第5章 Prolog基础 5.5.2回溯 ●在 Prolog程序的过程性解释中,“或(or)”以相当特殊的方式 进行处理。考虑下面的子句: parent(Person, Parent mother(Person, Parent); father(Person, Parent ●从逻辑上解读,我们这样解释这个子句:如果 Parent是 Person 的母亲,或(o) Parent是 Person的父亲,则 Parent是 Person 的双亲。 2004.11.3 A|程序设计 20
2004.11.3 AI程序设计 20 第二部分:第5章 Prolog基础 5.5.2 回溯 ⚫ 在Prolog程序的过程性解释中, “或(or)”以相当特殊的方式 进行处理。考虑下面的子句: parent(Person, Parent) :- mother(Person, Parent); father(Person, Parent). ⚫ 从逻辑上解读,我们这样解释这个子句:如果Parent是Person 的母亲,或(or)Parent是Person的父亲,则Parent是Person 的双亲