[prolog 基础系列] Prolog 的使用以及 Knowledge Base
Posted GoldenaArcher
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[prolog 基础系列] Prolog 的使用以及 Knowledge Base相关的知识,希望对你有一定的参考价值。
[prolog 基础系列] Prolog 的使用以及 Knowledge Base
prolog 是一种逻辑编程语言。它建立在逻辑学的理论基础之上, 最初被运用于自然语言等研究领域。现在它已广泛的应用在人工智能的研究中,它可以用来建造专家系统、自然语言理解、智能知识库等。
据说 prolog 的语法和 LISP 很像,有空的时候倒是可以看看 LISP 的语法……
Prolog 的运行
Prolog 实际上有多个运行平台,这里选择的是 SWI-Prolog,下载地址在:https://www.swi-prolog.org/download/stable,包含 Windows,MacOSX,Linux 多个平台的下载。
SWI-Prolog 是安装包式,所以这里就不多做赘述,安装成功之后的 SWI-Prolog 的界面如下:
![](https://image.cha138.com/20211013/bc74b490d6274fec9e52d95001488672.jpg)
其中,?-
指代的是 prolog 的命令,一般代表“询问”的意思,大多数情况下,知识基础(Knowledge Base) 会写在另外的文件中,文件以 .pl
结尾。
如:
isAnimal(bird).
canFly(bird).
canWalk(bird).
canWalk(dog).
上面的就是 prolog 的 Knowledge Base,这时候导入文件后既可在命令行中 咨询(consult) prolog 以获得讯息。假设文件保存在 C:/prolog-study.pl
这个地址,在 SWI-Prolog 中导入文件就需要以 ['file-address']
的方式进行导入:
?- ['C:/prolog-study.pl'].
true.
true
代表导入成功,false
代表导入失败。
导入成功之后即可进行询问:
![](https://image.cha138.com/20211013/bf754cb6b2b64aebabff583f43d4f251.jpg)
注意 isAnimal(dog).
的结果是 false
,这是因为 Knowledge Base 并不包含 isAnimal(dog).
这个条件。
这个时候再进行询问 isAnimal(X).
和 canWalk(X).
的结果如下:
![](https://image.cha138.com/20211013/8171bc0644a345dd89b5256847571f6a.jpg)
Prolog 会告诉你,Bird
是动物,Dog
和 Bird
可以走,而这些都是在之前提供的 Knowledge Base 之中。
Knowledge Base
之前列举的 Knowledge Based 是一重的,相对而言比较简单,但是 Knowledge Based 也可以进行嵌套。假设这里定义成鸟的特性为:
- 是动物
- 会飞
- 有羽毛
其写法如下:
isAnimal(bird).
canFly(bird).
hasFether(bird).
isBird(X) :-
isAnimal(X),
canFly(X),
hasFether(X).
在 SWI-Prolog 终端运行命令:
?- isBird(X).
Prolog 可以自动进行推理,并且得出 X 的结果为 Bird
:
![](https://image.cha138.com/20211013/dc0ad1cbe2f64876af0c0c9b19dc0ebf.jpg)
但是当询问 Prolog 狗是不是鸟
时,Prolog 返回的结果就是 False
.
同样,对于多层嵌套,Prolog 也能够找到对应的答案。基础的 Knowledge Base 如下:
can(fly, bat).
can(fly, bird).
hasFeather(bird).
只要给出推理条件:能飞,有羽毛,Prolog 就能自动推测出答案是鸟:
![](https://image.cha138.com/20211013/cdf0fd893b024d1baed6a47e94c769a3.jpg)
现在进行一个稍微复杂一点的逻辑推理,即,通过给出父母的关系,寻找出两个人是否是组孙关系。其基础条件如下:
parent(Parent, Child) :- father(Parent, Child).
parent(Parent, Child) :- mother(Parent, Child).
father(vincent, bobby).
mother(mia, bobby).
mother(judy, mia).
grand_parent(Grandchild, Grandparent) :-
parent(Parent, Grandchild),
parent(Grandparent, Parent).
其中,parent(Parent, Grandchild)
这一条会找出 父母 - 子孙
之间的关系,第二条 parent(Grandparent, Parent)
会查找 祖父母 - 父母
之间的关系。组孙关系必须同时满足 第一条 和 第二条 的关系才能够同时成立:
![](https://image.cha138.com/20211013/4efa482eac4d4ba1bdc230799509cb72.jpg)
如果只是想要单纯的找到祖先,只需要修改代码:
parent(Parent, Child) :- father(Parent, Child).
parent(Parent, Child) :- mother(Parent, Child).
father(vincent, bobby).
mother(mia, bobby).
mother(judy, mia).
ancestor(Grandchild, Grandparent) :-
parent(Parent, Grandchild).
ancestor(Grandchild, Grandparent) :-
parent(Parent, Grandchild),
ancestor(Grandparent, Parent).
即可。
在这一条代码中,ancestor(Grandchild, Grandparent)
同样会查询 子孙 之间是否有父子关系,如果是,则返回 true,不再继续寻找。
![](https://image.cha138.com/20211013/6cf93d1a9ec5423d8484f214ae60d0f1.jpg)
由此可以看出,Prolog 的功能还是非常强大的。
以上是关于[prolog 基础系列] Prolog 的使用以及 Knowledge Base的主要内容,如果未能解决你的问题,请参考以下文章