转载自:https://mp.weixin.qq.com/s/KEvuSWTwz6Ef1Y7-8riQZQ
本文有两个主要目标:
1.给出一些prolog程序的简单例子。这将向我们介绍prolog中的三个基本构造:事实、规则和查询。它还将向我们介绍一些其他主题,如prolog中逻辑的作用,以及借助变量执行合一的思想。
2.开始prolog的系统研究,定义项、原子、变量和其他句法概念。
1一些简单的例子
prolog中只有三个基本结构:事实、规则和查询。事实和规则的集合称为知识库(或数据库),prolog编程就是编写知识库。那也就是说,prolog程序只是知识库、事实和规则的集合,它们描述了一些我们感兴趣的关系集合。
那么我们如何使用Prolog程序?通过构成查询。也就是说,通过询问有关知识库中存储的信息的问题。
这听起来可能有点奇怪。显然,这与编程有很大关系。毕竟,编程不就是告诉计算机该做什么吗?但正如我们将要看到的,Prolog编程方法有很多意义,至少对于某些任务来说是这样;例如,它在计算语言学和人工智能(AI)中很有用。但是,我们不必泛泛地谈论Prolog,而是直接开始编写一些简单的知识库;这不仅是学习prolog的最好方法,也是唯一的方法。
知识库1
知识库1(KB1)只是事实的集合。使用事实陈述某些情况下无条件适用的事物。例如,我们可以说Mia,Jody和Yolanda是女性,乔迪在弹奏空中吉他,并且正在使用
以下五个事实:
woman(mia).
woman(jody).
woman(yolanda).
playsAirGuitar(jody).
party.
该事实集合为KB1。这是我们序言的第一个例子程序。请注意,名称mia,jody和yolanda属性是女人和playsAirGuitar,并且提议party一直这样写,以使第一个字母小写。这个很重要; 我们稍后会明白为什么。
我们如何使用KB1?通过构成查询。也就是说,通过询问有关KB1包含的信息的问题。这里有些例子。我们可以通过以下查询来询问Prolog Mia是否是女性:
?- woman(mia).
Prolog会回答
true
出于明显的原因,这是明确记录在KB1其中的事实之一。顺便说一句,我们不输入?-.这个符号(或其他喜好,取决于您使用的Prolog的实现)是Prolog解释器在等待时显示的提示符号评估查询。我们只输入实际的查询(例如woman(mia)),然后是.(句号).句号很重要。如果您没有输入,Prolog将不会开始处理查询。
同样,我们可以通过(Jody plays air guitar by posing)弹吉他进行以下查询:
?- playsAirGuitar(jody).
Prolog将再次回答是,因为这是KB1中的事实之一。
但是,假设我们问Mia是否弹吉他:
?- playsAirGuitar(mia).
我们会得到答案
false
为什么?好吧,首先,这不是KB1中的事实。而且,KB1是非常简单,并且不包含其他信息(例如规则我们将在短期内了解),这可能有助于Prolog进行推断(推论)Mia是否在弹奏吉他。所以Prolog正确地得出结论KB1中没有playsAirGuitar(mia)的声音。
这是两个重要的例子。首先,假设我们构成查询:
?- playsAirGuitar(vincent).
Prolog再次回答“否”。为什么?好吧,这个查询是关于一个人的(Vincent)它没有任何信息,因此(正确)得出的结论是无法从KB1中的信息推导出playsAirGuitar(vincent)。
同样,假设我们构成查询:
?- tatooed(jody).
再次Prolog将回答“否”。为什么?好吧,这个查询是关于没有相关信息的属性(正在纹身),因此再次(正确)得出结论,无法从KB1中的信息得出。(实际上,某些Prolog实施会做出回应带有错误消息的查询,告诉您谓词或没有定义程序 我们将很快介绍谓词)。
不用说,我们还可以对命题进行查询。例如,如果我们构成查询
?- party.
然后Prolog会回应
true
如果我们构成查询
?- rockConcert.
然后Prolog会回应
false
完全符合我们的预期。
知识库2
这是KB2,这是我们的第二个知识库:
happy(yolanda).
listens2Music(mia).
listens2Music(yolanda):- happy(yolanda).
playsAirGuitar(mia):- listens2Music(mia).
playsAirGuitar(yolanda):- listens2Music(yolanda).
KB2中有两个事实,listens2Music(mia) and happy(yolanda).
它包含的最后三个项目是规则。
规定状态信息有条件地符合以下情况的规则利益。例如,第一个规则说Yolanda听音乐如果她快乐,最后一条规则说,Yolanda她弹吉他听音乐。更一般而言,:-应该读为“ if”,或者“暗示”。:-左侧的部分称为规则的首部,右侧的部分称为主体。所以
一般规则说:如果规则的主体是正确的,那么规则也是如此。现在,关键点是:
如果一个知识库包含一个规则头:-规则体,和prolog知道规则体从知识库中的信息,然后prolog可以推断头。
这个基本的推导步骤称为“惯性方式”。
让我们考虑一个例子。假设我们问Mia是否在弹吉他:
?- playsAirGuitar(mia).
Prolog将回答是。为什么?好吧,虽然找不到playsAirGuitar(mia)作为明确记录在KB2中的事实,它可以找到规则
playsAirGuitar(mia):- listens2Music(mia).
此外,KB2还包含事实listens2Music(mia).因此,Prolog可以使用惯用定律的规则来推断出playsAirGuitar(mia).的角色。
我们的下一个示例显示Prolog可以将惯用方式链接在一起。假设我们问:
?- playsAirGuitar(yolanda).
Prolog会回答是。为什么?好吧,首先,利用事实happy(yolanda)和规则
listens2Music(yo