SWI-PROLOG第1章 事实
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
第1章事实、规则和查询
这一章有两个主要目标:
给一些简单的Prolog程序的例子。
这将会给我们介绍Prolog的三种基本结构:事实、规则和查询。
它也会给我们介绍其他一些主题,像逻辑Prolog的角色,执行统一的概念借助变量。
开始Prolog通过定义条件的系统研究,原子变量和其他语法概念。
1.1 一些简单的例子
知识基础1
知识基础2
知识库3
知识库4
知识基础5
1.2 Prolog语法
原子
数字
变量
复杂的条款
1.3 练习
1.4 实际的会话
1.1一些简单的例子
只有Prolog中的三种基本结构:事实、规则和查询。
事实和规则的集合称为知识库(或数据库)和Prolog 编程都是关于写作知识基础。
也就是说,Prolog程序简单是知识库,事实和规则的集合描述关系的集合,我们发现一些有趣的。
那么,我们如何使用Prolog程序?通过提出查询。
也就是说,通过询问信息存储在知识库中。
这可能听起来很奇怪。
这当然不明显,与编程。
毕竟,不是编程告诉计算机做什么吗?但我们应当看到,Prolog的编程方式是非常合理的,至少对于某些任务;例如,它是有用的在计算语言学和人工智能(AI)。
而是说更多关于Prolog概括地说,让我们直接开始编写一些简单的知识基础;这不仅仅是学习Prolog的最佳方式,这是唯一的方法。
知识基础1
知识库1(KB1)是一个简单事实的集合。
事实是用于国家的事情无条件地真正感兴趣的一些情况。
例如,我们可以,Mia, Jody, Yolanda是woman, Jody扮演空气吉他,一方发生,使用以下五个事实:
woman(mia).
woman(jody).
woman(yolanda).
playsAirGuitar(jody).
party.
这个事实是KB1的集合。
这是我们的第一个例子的Prolog程序。
注意,名字mia,jody,yolanda,属woman和 playsAirGuitar,命题方一直在写,第一个字母小写。
这是很重要的;稍后我们将看到为什么。
我们如何使用KB1吗?通过提出查询。
也就是说,通过询问KB1包含的信息。
这里有一些例子。
我们可以问Prolog米娅是一个女人是否构成查询:
- woman(mia).
Prolog将回答
yes
很明显的原因就是这是一个事实在KB1明确记录。
顺便说一下, 我们不输入 ?。
这个符号(或类似的,这取决于Prolog您正在使用)的实现是Prolog解释器的提示符号显示等待评估时查询。
我们只要输入实际的查询(例如woman (mia))紧随其后 .(句号)。
句号是很重要的。
如果你不输入,查询Prolog不会开始工作。
同样,我们可以问是否杨晨扮演空气吉他带来以下查询:
- playsAirGuitar(jody).
Prolog将再次回答是的,因为这是一个KB1的事实。
然而,假设我们问米娅扮演空气吉他:
- playsAirGuitar(mia).
我们将得到答案
no
为什么?嗯,首先,这不是一个在KB1事实。
此外,KB1极其简单,不包含其他信息(如规则不久我们将了解),可能有助于Prolog试图推断(演绎)是否Mia空气吉他。
所以Prolog正确的结论 playsAirGuitar(mia)做不从KB1跟��。
这里有两个重要的例子。
首先,假设我们的查询:
- playsAirGuitar(vincent).
再次Prolog回答没有。
为什么?嗯,这个查询的方法是对一个人(Vincent),它没有信息,所以它(正确地)认为 playsAirGuitar(vincent)在KB1不能推导出的信息。
同样的,假设我们的查询:
- tatooed(jody).
再次Prolog不会回答。
为什么?嗯,这个查询是一个属性(日吨产量),它没有信息,所以再次查询(正确地)得出结论,不能推导出KB1中的信息。
(事实上,一些Prolog实现将如何应对这个查询错误消息,告诉你,谓词或过程日吨产量没有定义;我们将很快介绍谓词的概念。
)
不用说,我们也可以查询有关命题。
例如,如果我们提出查询
- party.
然后Prolog的反应
yes
如果我们的查询
- rockConcert.
然后Prolog的反应
no
正如我们所期望的。
知识基础2
这是我们第二个知识库:KB2,
happy(yolanda).
listens2Music(mia).
listens2Music(yolanda):- happy(yolanda).
playsAirGuitar(mia):- listens2Music(mia).
playsAirGuitar(yolanda):- listens2Music(yolanda).
有两个事实KB2, listens2Music(mia)和happy(yolanda)。
最后它包含三项规则。
规则状态信息有条件地真正的感兴趣的情况。
例如,第一条规则说Yolanda听音乐如果她是幸福的,,
最后一个规则说, Yolanda空气吉他如果她听音乐。
更一般的, :-应该被���读为“如果”,或者“隐含了”。
的左手边 :-被称为规则的头,右手边的部分称为身体。
所以在一般规则说: 如果规则的身体是真的, 然
后的规则是正确的。
现在的关键点:
如果一个知识库包含一个规则头 :- 的身体, 和Prolog知道那身体遵循从知识库中的信息 Prolog可以推断出头。
这个基本推理步骤叫做演绎推理。
让我们考虑一个例子。
假设我们问米娅扮演空气吉他:
- playsAirGuitar(mia).
Prolog会是的。
为什么?虽然找不到 playsAirGuitar(mia)事实明确记录在KB2,它可以找到规律
playsAirGuitar(mia):- listens2Music(mia).
此外,KB2还包含事实 listens2Music(mia)。
因此Prolog可以使用规则的演绎推理推断
出 playsAirGuitar(mia) .
我们的下一个例子展示了演绎推理的Prolog可以连锁在一起使用。
假设我们问:
- playsAirGuitar(yolanda).
Prolog会是的。
为什么?首先,通过使用这个事实快乐(紫罗兰)和法治
listens2Music(yolanda):- happy(yolanda).
Prolog可以推导出新的事实 listens2Music(yolanda)。
这个新的事实是没有明确记载的知识库——只有隐式地礼物( 推断出知识)。
尽管如此,Prolog可以使用它就像一个明确记录的事实。
特别是,这个推断的事实和规则
playsAirGuitar(yolanda):- listens2Music(yolanda).
它可以推断出 playsAirGuitar(yolanda),这就是我们问。
总结:任何由应用程序产生的演绎推理可以作为进一步的输入规则。
通过以这种方式连接在一起,演绎推理的应用,Prolog能够检索信息,逻辑上遵循的规则和事实记录到知识库中。
知识库中包含的事实和规则被称为条款。
因此KB2包含五个条款,即三个规则和两个事实。
看着KB2的另一种方法是说,它由三个谓词(或过程)。
这三个谓词是:
listens2Music
happy
playsAirGuitar
的快乐谓词定义使用单一条款(事实)。
的 listens2Music和 playsAirGuitar谓词的定义都使用两个条款(在一个案例中,两个规则,在其他情况下,一个规则,一个事实)。
这是一个好主意去思考它们包含谓词的Prolog程序。
从本质上讲,谓词是我们发现重要的概念,和各种条款我们写下关于他们是我们试图确定他们的意思,它们是如何相互关联的。
最后一个评论。
我们可以把一个事实通常空着的身体。
我们能想到的事实没有任何前提条件的条件,或退化的规则。
知识库3
KB3,第三知识库,包括五个条款:
happy(vincent).
listens2Music(butch).
playsAirGuitar(vincent):-
listens2Music(vincent),
happy(vincent).
playsAirGuitar(butch):-
happy(butch).
playsAirGuitar(butch):-
listens2Music(butch).
有两个事实, ,happy(vincent)和listens2Music(butch和三个规则。
KB3定义KB2(即相同的三个谓词happy , listens2Music, playsAirGuitar),但这将它们定义不同。
特别是,定义的三个规则 playsAirGuitar谓词引入一些新的想法。
首先,注意规则
playsAirGuitar(vincent):-
listens2Music(vincent),
happy(vincent).
有两个物品在它的身体,或两个目标(使用标准术语)。
那么,这条规则到底意味着什么?最重要的是要注意的是逗号 ,把目标 listens2Music(vincent)和我们的目标happy( (vincent)在规则的身体。
这是逻辑连接的方式表达在序言(也就是说,逗号的意思和)。
这条规则说:“vincent空气吉他如果他听音乐和他很高兴”。
因此,如果我们提出查询
- playsAirGuitar(vincent).
Prolog不会回答。
这是因为而KB3包含快乐(vincent),它不显式地包含的信息 listens2Music(vincent),这个事实不能推导出。
所以KB3只满足两个前提条件中的一个需要建立 playsAirGuitar(vincent),我们查询失败。
顺便说一下,这个规则中使用的间隔是无关紧要的。
例如,我们可以写它
playsAirGuitar(vincent):- happy(vincent),
listens2Music(vincent).
这意味着同样的事情。
Prolog提供我们很多自由的方式我们知识基础出发,我们可以利用这个让我们的代码的可读性。
接下来,注意KB3包含两个规则完全相同的,即:
playsAirGuitar(butch):-
happy(butch).
playsAirGuitar(butch):-
listens2Music(butch).
这是一种说明butch空气吉他要么如果他听音乐, 或如果他是快乐。
清单多个规则相同的头,是一种表达逻辑析取(也就是说,它是一种的说法或)。
如果我们提出查询
- playsAirGuitar(butch).
Prolog会回答是的。
尽管这些规则的第一个不会帮助(KB3不允许Prolog的结论happy (butch)),KB3 做包含 listens2Music(布奇)这意味着Prolog使用规则可以应用演绎推理
playsAirGuitar(butch):-
listens2Music(butch).
得出结论, playsAirGuitar(布奇) .
还有另一种方式表达在Prolog脱节。
我们可以替换规则单上面给出的规则
playsAirGuitar(butch):-
happy(butch);
listens2Music(butch).
也就是说,分号 ;Prolog的象征吗或,这一规则意味着同样的事情与前面的规则。
它是更好的使用多个规则或分号?那得看情况。
一方面,大量使用分号就可以使Prolog代码难以阅读。
另一方面,分号是更高效的Prolog只需要处理一个规则。
它现在应该清楚Prolog和逻辑:毕竟, :-意味着暗示, ,方法结合, ;意味着分离。
(否定呢?这是另一个故事。
章中我们会讨论这个话题10)。
此外,我们已经看到一个标准的逻辑证明规则(演绎推理)在Prolog 编程中起着重要的作用。
所以我们已经开始理解为什么“序言”是“与逻辑编程”的缩写。
知识库4
这是我们第四知识库:KB4,
woman(mia).
woman(jody).
woman(yolanda).
loves(vincent,mia).
loves(marsellus,mia).
loves(pumpkin,honey_bunny).
loves(honey_bunny,pumpkin).
现在,这是一个很枯燥的知识基础。
没有规则,只有事实的集合。
好的,我们看到这两个名字作为参数的关系(即第一次爱关系),但让我们面对它吧,这是一个相当可预测的想法。
不,这次新奇不在于知识库,它在于我们要提出查询。
特别是, 第一次我们要利用变量。
这里有一个例子:
- woman(X).
的 X是一个变量(事实上,任何词从一个大写字母是Prolog变量开始,这就是为什么我们必须小心使用小写首字母在我们早期的例子)。
现在一个变量不是一个名字,而这是一个占位符获取信息。
也就是说,这个查询问Prolog:告诉我你知道的个人是一个woman。
Prolog回答���这个查询通过KB4工作,从上到下,试图统一(或匹配)表达式woman (X)KB4包含的信息。
现在知识库中的第一项woman (mia)。
所以,Prolog统一X与米娅,从而使查询完全同意这第一项。
(顺便说一下,有很多不同的术语这一过程:我们也可以说Prolog实例化 X来mia,或者它绑定 X
来mia)。
Prolog然后向我们报告如下:
X = mia
也就是说,它不仅表示,有信息至少有一个女人在KB4,实际上告诉我们她是谁。
它不只是说yes,它会给我们的变量绑定(或变量实例化),导致成功。
但这并不是故事的结局。
变量的目的是,他们可以代表,或统一,不同的事情。
还有其他女人信息知识库。
我们可以访问这些信息通过输入分号:
X = mia ;
记住, ;意味着或,因此该查询方式: 有什么选择吗?所以Prolog再���开始通过知识库(它还记得上次起身,从那里开始),看到,如果结合 X与杨晨查询,然后同意与第二项完美的知识库。
所以响应:
X = mia ;
X = jody
它告诉我们有关于第二个女人在KB4,实际上,(再一次),它给我们的价值导致成功。
当然,如果我们出版社 ;第二次,Prolog返回答案
X = mia ;
X = jody ;
X = yolanda
但是如果我们的新闻 ;一个第三时间吗?Prolog没有响应。
没有其他的统一是可能的。
没有其他的事实开始的象征女人。
知识库中最后四项问题爱关系,没有办法,这样的条目可以统一的查询表单woman (X) .
让我们尝试一个更复杂的查询,即
- loves(marsellus,X), woman(X).
现在,记住, ,意味着和这个查询,所以说: 有个人 X 这样Marsellus爱 X 和 X 是一个woman吗?如果你看知识库你会发现有:Mia是一个女人(1)和Marsellus爱Mia (事实5)。
事实上,Prolog的这个工作。
也就是说,它可以搜索知识库和工作,如果结合 X米娅,那么查询的并列结构满足(在以下的章节中,我们将学习如何Prolog这)。
所以Prolog返回答案
X = mia
统一的业务变量与知识库中的信息是Prolog的核心。
我们会学习,有很多有趣的想法���Prolog -但是当你认真思考这件事的时候,它Prolog的能力执行统一和返回的值变量绑定,是至关重要的。
知识基础5
我们已经介绍了变量,但到目前为止,我们只使用他们的查询。
但是变量不仅可以可用于知识库,只有当我们开始这样做,我们可以写真正有趣的项目。
这是一个简单的例子,知识库KB5:
loves(vincent,mia).
loves(marsellus,mia).
loves(pumpkin,honey_bunny).
loves(honey_bunny,pumpkin).
jealous(X,Y):- loves(X,Z), loves(Y,Z).
KB5包含四个事实有关爱关系和一个规则。
(顺便说一下,事实和规则之间的空行没有意义:它只是增加了可读性。
正如我们前面说的,Prolog给了我们很大的自由我们格式知识库的方式。
)但这条规则是最有趣的一个迄今为止我们所看到的:它包含三个变量(注意 X , Y, Z都是大写字母)。
它说什么了?
事实上,它是定义一个概念的嫉妒。
它说,一个独立的个体 X会嫉妒一个人吗 Y如果有一些人 Z那 X 爱, Y爱同一个人 Z了。
(好的,所以嫉妒不是这么简单的在现实世界中)。
关键要注意的是,这是一个一般声明:不是的米娅,或南瓜,或任何特定的——这是一个条件语句每个人都在我们的小世界。
假设我们的查询:
- jealous(marsellus,W).
这个查询问道:你能找到一个独立的个体 W这样,玛瑟卢斯是嫉妒 W吗?文森特就是这样一个人。
如果你检查嫉妒的定义,你会发现玛瑟卢斯必须是文森特的嫉妒,因为他们都喜欢相同的女人,也就是米娅。
所以Prolog将返回值
W = vincent
现在有些问题你。
首先,还有其他在KB5嫉妒的人吗?此外,假设我们希望Prolog告诉我们所有的嫉妒人:我们查询会带来什么呢?的答案让你吃惊吗?看起来愚蠢的吗?
1.2Prolog语法
现在,我们有一些什么开场白,是时候回到一开始,通过细节更仔细地工作。
让我们先问一个很基本的问题:我们看到各种各样的表达式(例如杨晨 ,playsAirGuitar(mia), X)在我们的Prolog程序,但是这些刚刚的例子。
时间精度:什么是事实,规则,和查询建立起来的?
答案是,有四种Prolog的术语:原子,数字、变量和复杂的条款(或结构)。
原子和数据集中在一起下标题常量,常量和变量一起构成了简单的开场白。
让我们仔细看看。
让事情清楚,我们首先是精确的基本特征(即符号)处理。
的大写字母是一
个 , B ,…, Z;的小写字母是一个 , b ,…, z;的数字是 0 , 1 , 2 ,…,9。
此外我们有 _符号,即强调,一
些特殊字符,其中包括字符等 + , - , * , / , < , > , = , : , . , & , ~。
空格也是一个字符,但一个非常不寻常的,是看不见的。
字符串是一个连续的字符序列。
原子
原子是:
1.一串字符组成的大写字母,小写字母,数字,下划线字符,以小写字母开始。
下面是一些例子:布
奇,big_kahuna_burger,listens2Music和playsAirGuitar.
2.一个任意字符序列包含在单引号。
例如“文森
特’, ’的Gimp’, ’Five_Dollar_Shake’, ’&^%&#@$&*”和’ ’。
单引号之间的字符序列被称
为原子的名字。
注意,我们可以使用空格等原子;事实上,使用单引号是一个常见的原因,所以我们能做的。
3.特殊字符的字符串。
下面是一些例子:@ =和= = = = >和;和:-都是原子。
正如我们所见,这
些原子,如;和:-有一个预定义的意义。
数字
实数在典型的Prolog应用程序并不特别重要。
所以尽管大多数Prolog实现支持浮点数或漂浮的(也就是说,表示如1657.3087或实数π在这本书中我们对他们说。
但整数(即:…-2 - 1,0,1,2,3,…)可用于计算等任务列表的元素,章,我们将讨论如何处理详见第5章。
他们的Prolog语法是最明显的一个: 23 , 1001年 , 0 , -365年,等等。
变量
一个变量是一个字符串的大写字母,小写字母,数字和下划线字符开始要么用一个大写字母或下划线。
例如, X , Y , 变量 , _tag , X_526 , 列表 , List24 ,_head , Tail , _input和 Outpu都是Prolog变量。
的变量 _(即一个下划线字符)相当特别。
它被称为匿名的变量章中,我们讨论它第4章 .
复杂的条款
常量、数字和变量的构建块:现在我们需要知道怎样把它们组合在一起,使复杂的术语。
回想一下,复杂的术语通常被称为结构。
构建复杂术语的函子紧随其后的一系列参数。
参数将在普通的括号,由逗号分隔,把函子。
注意,函子必须直接紧随其后括号;你不能有一个空间之间的函子和括号封闭的参数。
的函子必须是一个原子。
也就是说,变量不能作为仿函数。
另一方面,参数可以是任何类型的项。
现在,我们已经看到了很多复杂的术语的例子,当我们看着知识库KB1 KB5。
例如, playsAirGuitar(杨晨)是一个复杂的术语:函子是什么 playsAirGuitar和它的参数是 jody。
其他的例子有 loves(vincent,米娅)包含一个变量,举一个例子, jealous(marsellus,W) . .
但允许比这更复杂的术语的定义。
事实上,它允许我们保持无限期嵌套复杂的术语里面复杂的术语(也就是说,它是允许递归结构)。
例如
hide(X,father(father(father(butch))))
是一个完全可以接受的复杂的术语。
它的函子隐藏,它有两个参数:变量 X,复杂的术
语 father(father(father(butch))) 。
这种复杂的术语 father作为其函子,另一个复杂的术语,
即 father(father(butch)),作为其唯一的参数。
和这个复杂的参数项,即 father(butch),也是复杂的。
但随后嵌套的底部,对于这里的论点是常数 butch .
正如我们将要看到的,这样的嵌套(或递归结构)自然条件使我们能够代表很多问题。
事实上递归期限结构之间的相互作用和变量统一Prolog的大部分权力的来源。
参数的数量,一个复杂的术语叫做它的参数数量。
例如, woman(mia)是一个复杂的参数数量
1, loves(vincent,mia)是一个复杂的参数数量2。
参数数量对Prolog很重要。
Prolog都会很开心我们定义两个谓词相同的函子但不同数量的参数。
例如,我们可以自由的定义一个知识库,定义了一个两处谓词爱(这可能包含等事实 love(vincent,mia)),
还有一个三位的爱谓词(可能包含等事实 love(vincent,marsellus,mia) )。
然而,如果我们这么
做,Prolog定义了两处 loves和三位loves不同谓词。
后来在书中(例如,当我们介绍累加器Chapter5)我们将看到它可以用于定义两个谓词相同的函子,但不同的参数数量。
当我们需要谈论谓词和我们打算如何使用它们(例如,在文档)通常是使用一个后缀 /紧随其后的是一个数字表示谓词的参数数量。
回到KB2,而不是说它定义谓词
listens2Music
happy
playsAirGuitar
我们应该说它定义谓词
listens2Music/1
happy/1
playsAirGuitar/1
PROlog不能混淆包含两个不同的love谓词的知识库,因为它把love/2谓语和love/ 3谓语视为截然不同的。
1.3练习
1.1 下列哪一个字符序列是原子,它们是变量,哪些不是?
1.vINCENT
2.Footmassage
3.variable23
4.Variable2000
5.big_kahuna_burger
6.’big kahuna burger’
7.big kahuna burger
8.’Jules’
9._Jules
10.’_Jules’
1.2 下列哪一个字符序列是原子,它们是变量,它们是复杂的术语,而根本不是术语?给出每个复数项的函子和性质。
1.loves(Vincent,mia)
2.’loves(Vincent,mia)’
3.Butch(boxer)
4.boxer(Butch)
5.and(big(burger),kahuna(burger))
6.and(big(X),kahuna(X))
7._and(big(X),kahuna(X))
8.(Butch kills Vincent)
9.kills(Butch Vincent)
10.kills(Butch,Vincent
锻炼 1.3 下面的知识库中有多少事实、规则、子句和谓语?规则的头是什么,它们包含的目标是什么?
woman(vincent).
woman(mia).
man(jules).
person(X):- man(X); woman(X).
loves(X,Y):- father(X,Y).
father(Y,Z):- man(Y), son(Z,Y).
father(Y,Z):- man(Y), daughter(Z,Y).
1.4 Prolog代表如下:
1.Butch是一个杀手。
2.Mia 和Marsellu都结婚了。
3.Zed死了。
4.Marsellus杀死给Mia做足部按摩的人。
5.Mia喜欢跳舞的人。
6.Jules吃任何有营养或美味的东西。
Run Prolog Now!
1.5 假设我们正在使用以下知识库:
wizard(ron).
hasWand(harry).
quidditchPlayer(harry).
wizard(X):- hasBroom(X), hasWand(X).
hasBroom(X):- quidditchPlayer(X).
Prolog如何应对以下查询?
1.wizard(ron).
2.witch(ron).
3.wizard(hermione).
4.witch(hermione).
5.wizard(harry).
6.wizard(Y).
7.witch(Y).
1.4实际的会话
不要被这一事实的描述实际会话比文本你刚刚读过短;实际绝对是最重要的一部分。
是的,你需要读课文和做练习,但这还不足以成为Prolog的程序员。
要真正掌握语言需要坐在电脑前,玩Prolog -很多!
第一个实用会话的目的是让你熟悉基本的如何创建并运行简单的Prolog程序。
现在,因为有许多不同的Prolog实现,并可以运行不同的操作系统下,我们不能太具体。
相反,我们要做的是用非常普遍的语言参与运行的Prolog,列出你需要掌握的实践技能,并建议对你做一些事情。
最简单的方式运行Prolog程序如下。
你有一个文件与Prolog程序(例如,您可能有一个文件 kb2.pl它包含知识库KB2)。
然后开始开场白。
Prolog将显示提示,类似
-
这表明它已准备好接受一个查询。
现在,在这个阶段,对KB2 Prolog知道(或者别的什么)。
看到这,输入命令清单 ,紧随其后的是一个句号,点击返回。
也就是说,类型
- listing.
并按回车键。
现在,清单命令是一个特殊的内置Prolog谓词,指示Prolog显示当前知识库的内容。
但是我们还没有告诉Prolog任何知识基地,所以只会说
yes
这是一个正确的答案:然而Prolog一无所知——所以它正确显示所有这什么也没有说是的。
实际上,你可能会得到一个更复杂的Prolog实现更多(例如,加载的库的名称;图书馆是一章中讨论12),但是,不管怎样,你会收到什么本质上是一个“我不知道任何知识基地!”回答。
让我们告诉Prolog KB2。
假设你KB2存储在文件中 kb2.pl,这个文件是在你运行Prolog的目录,你需要类型
- [kb2].
这告诉Prolog咨询文件 kb2.pl和加载内容作为知识库。
假设 kb2.pl不包含拼写错误、Prolog会阅读,打印出一条消息说这可能是咨询这个文件,然后回答:
yes
顺便说一句,这是常见的Prolog的代码存储在文件 .pl后缀。
这是一个文件包含的指示(即Prolog代码)和一些Prolog实现你实际上并不需要的类型.pl当你咨询文件后缀。
好,但有一个缺点。
通常有一个文件包含Perl脚本 .pl后缀,现在有很多Perl脚本的使用,这可能会导致混乱。
生活就是如此。
如果以上没有工作,也就是说,如果打字
- [kb2].
产生一个错误消息称该文件 kb2不存在,那么你可能还没开始Prolog的目录 kb2.pl存储。
在这种情况下,您可以停止Prolog(通过输入停止。
后提示),更改的目录 kb2.pl存储和重新开始开场白。
或者你可以告诉Prolog哪里去找 kb2.pl。
要做到这一点,而不是只写 kb2在方括号之间,你给Prolog整个路径包含在单引号。
例如,键入类似
- ['home/kris/Prolog/kb2.pl'].
或
- ['c:/Documents and Settings/Kris/Prolog/kb2.pl'].
好的,所以Prolog现在应该知道所有KB2谓词。
我们可以检查它是否通过清单又命令:
- listing.
如果你这样做,Prolog将列出在屏幕上(类似的)以下:
listens2Music(mia).
happy(yolanda).
playsAirGuitar(mia):-
listens2Music(mia).
playsAirGuitar(yolanda):-
listens2Music(yolanda).
listens2Music(yolanda):-
happy(yolanda).
yes
也就是说,它将列出的事实和规则KB2,然后说是的。
再一次,你可能会多一点,如各种库加载的位置。
顺便说一下, 清单可以用在其他方面。
例如,输入
- listing(playsAirGuitar).
简单地列出所有的知识库中的信息 playsAirGuitar谓词。
所以在这种情况下将显示序言
playsAirGuitar(mia):-
listens2Music(mia).
playsAirGuitar(yolanda):-
listens2Music(yolanda).
yes
现在,你准备好了。
KB2加载和Prolog正在运行,所以您可以(而且应该)开始做这种类型的调查中我们讨论了文本。
但是让我们回来,总结的一些实用的技能,您需要掌握这个:
•你需要知道一些基本的事实对您使用的操作系统,如它所使用的目录结构。
毕竟,你需要知道如何保存文件包含程序你所想要的。
•你需要知道如何使用某种形式的文本编辑器,以编写和修改程序。
一些Prolog实现内置文本编辑器,但是如果你已经知道一个文本编辑器(如Emacs)您可以使用它来编写您的Prolog代
码。
只是确保你保存您的文件是简单的文本文件(例如,如果你在Windows下工作,不拯救他
们Word文档)。
•你可能想要例子Prolog程序从互联网。
所以确保你知道如何使用浏览器来找到你想要的,和存储代码,你想要它。
•你需要知道如何开始你的版本的Prolog,以及如何咨询文件。
你捡起这些技能,越早越好。
与他们的(这不会花很长时间)你可以开始专注于掌握Prolog(这将需要更长的时间)。
但是假设你已经掌握了这些技能,下一步是什么?很简单,玩PROlog!查阅文本中讨论的各种知识库,并检查所讨论的查询是否真的按我们所说的方式工作。
特别是,看看KB5,并确保你明白为什么你会得到这些特殊的嫉妒关系。
尝试设置新的查询。
用列表谓词进行实验(这是一个有用的工具)。
在练习1.5中使用知识库,并检查答案是否正确。
最重要的是,想想你感兴趣的一些简单的情况,从头开始创造一个全新的知识库。