人工智能(蔡自兴)实验2事实表示

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

实验2 Prolog程序事实表示

Visual Prolog是面向对象的、严格类型化的和模式检验的程序设计语言。在编写Visual Prolog程序时,必须掌握这些内容,但是在这里将集中在编写代码这个核心问题上,也就是说,编写这些代码时暂时不考虑类、类型和模式。

为此,将使用包含在Visual Prolog 6 中的PIE例子。PIE是一个经典的Prolog解释器,通过它,可以学会和实现Prolog程序,而不必关心类、类型等方面的知识。

这里的内容是基于使用Build6004或者是以后的Visual Prolog 6版本,否则,PIE应用程序将不会象现在描述的这样工作。这个编译号可以在VDE的About对话框中找到。

1.Horn子句逻辑

Visual Prolog 和其它Prolog用语都是基于Horn子句逻辑的。Horn 子句逻辑是对事物及其相互关系进行推理的形式系统。

在自然语言中,可以有这样样的一个陈述句:

John是Bill的父亲。

这里涉及两个实体,John和Bill,以及他们之间的关系,即一个是另一个的父亲.在Horn子句逻辑中,可以这样形式化地表述上面的陈述句:

father(“Bill”,”John”).

上面的father是带两个参量的一个谓词或关系,它表示第2个人是第1个人的父亲。

注意:此处已经选择了第2个人是第1个人的父亲,也可以选择另外的方式,变量的顺序形式化设计者的选择,然而一旦选定了,就必须保持一致,在这里的表述中,父亲始终是第2个人。

已经选择用人名来代表人,因为在现实世界中,许多人有相同的名字,所以这一方法不一定有效。但在这里,用这一简单的形式化表示。

有了上面的形式化方法,可以表示任何人之间的任何类型的家庭关系,但是,为了让这些表述更为有趣,制定下面的规则。

X是Z的祖父,如果X是Y的父亲且Y是Z的父亲

其中X,Y,Z指人。在Horn子句逻辑中,可以这样表述grandFathe(Person,GrandFathe):-

father(Person,Father),father(Father,GrandFather).

已经选择使用了比X,Y,Z更容易理解的变量名。另外,还引入了一

个谓词来描述祖父关系。再次选择了祖父作为第二个变量,像这样的

保持一致是明智的,不同谓词的变量可以遵循相同的规则,当解读这

些规则时,可以将:-解释为“如果(if)”,将隔开关系的逗号解释

为“与(and)”.

像“John是Bill的父亲”这样的陈述称为事实,而“X是Z的祖父,

如果X是Y的父亲且Y是Z的父亲“称为规则。

可以用事实和规则来形成定理,一个定理是事实和规则的集合,下面

陈述一个小定理:

father(“Bill”,”John”).

fathaer(“Pam””Bill”). grandFather(Person,GrandFather):-

father(Person,Father), father(Father,GrandFather). 这个定理的作用是回答这样的一些问题:

John是Sue的父亲吗?

谁是Pam的父亲?

John是Pam的祖父吗?

^……

这些问题称为目标(goal),它们可以这样形式化表示:

?- father(“Sue”,”John”).

?-father(“Pam”,X). ?- grandfather(“Pam”,”John”).

这些问题被称为目标子句(goal clause)或简称为目标。事实(facts),

规则(rules)及目标合起来称为Horn子句,因此得名为Horn子句

逻辑。

某些目标,如第一个和最后一个目标,可以简单地用“是”或“不是”

来回答,其他目标,如第2个目标,需要寻找一个解,例如,X=“Bill”.

一个目标可以有多个解,例如:

?- father(X,Y).

E有两个解:

X=“Bill”,Y=”John”.

X=“Pam”,Y=”Bill”.

一个Prolog程序是一个定理和目标的集合。当程序开始时,它试图

使用定理为目标找到一个解。

探索Prolog

Prolog在英语中的意思就是Programming in LOGic(逻辑编程)。它是建立在逻辑学的理论基础之上的,最初是运用于自然语言的研究领域。然而现在它被广泛的应用在人工智能的研究中,它可以用来建造专家系统、自然语言理解、智能知识库等。同时它对一些通常的应用程序的编写也很有帮助。使用它能够比其他的语言更快速地开发程序,因为它的编程方法更象是使用逻辑的语言来描述程序。

从纯理论的角度来讲,Prolog是一种令人陶醉的编程语言,但是在这本书中还是着重介绍他的实际使用方法。

逻辑编程

什么叫逻辑编程?也许你还没有一个整体的印象,还是让我们首先来研究一个简单的例子吧。运用经典的逻辑理论,我们可以说“所有的人(person)都属于人类(moral)”,如果用Prolog的语言来说就是“对于所有的X,只要X是一个人,它就属于人类。”

moral(X):-person(X) . 同样,我们还可以加入一些简单的事实,比如:苏格拉底(socrates)是一个人。

person(socrates).

有了这两条逻辑声明,Prolog就可以判断苏格拉底是不是属于人类。在Prolog的Listener中键入如下的命令:

?-mortal(socrates). (此句中的'?-'是Listener的提示符,本句表示询问苏格拉底是不是属于人类。)

Linstener将给出答案:

yes

我们还可以询问,“谁属于人类?”

?-mortal(X).

我们会得到如下的答案:

X= socrates

这个简单的例子显示了Prolog的一些强大的功能。它能让程序代码更简洁、更容易编写。在多数情况下Prolog的程序员不需要关心程序的运行流程,这些都由Prolog自动地完成了。

当然,一个完整的程序不能只包括逻辑运算部分,还必须拥有输入输出,乃至用户界面部分。很遗憾,Prolog在这些方面做得不好,或者说很差。不过它还是提供了一些基本的方法的。下面是上述的程序一个完整的例子。

相关文档
最新文档