人工智能(蔡自兴)实验2事实表示
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 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在这些方面做得不好,或者说很差。不过它还是提供了一些基本的方法的。下面是上述的程序一个完整的例子。