Prolog - 基础知识


在本章中,我们将获得一些关于 Prolog 的基本知识。所以我们将继续 Prolog 编程的第一步。

本章将涵盖的不同主题是 -

知识库- 这是逻辑编程的基本部分之一。我们将详细了解知识库,以及它如何帮助逻辑编程。

事实、规则和查询- 这些是逻辑编程的构建块。我们将获得一些有关事实和规则的详细知识,并且还将看到一些将在逻辑编程中使用的查询。

在这里,我们将讨论逻辑编程的基本构建块。这些构建块是事实、规则和查询

事实

我们可以将事实定义为对象之间的显式关系以及这些对象可能具有的属性。所以事实本质上是无条件真实的。假设我们有一些事实如下 -

  • 汤姆是一只猫

  • 库纳尔喜欢吃面食

  • 头发是黑色的

  • 纳瓦兹喜欢玩游戏

  • 普拉秋莎很懒。

所以这些是一些绝对真实的事实。这些实际上是陈述,我们必须将其视为真实的。

以下是编写事实的一些准则 -

  • 属性/关系的名称以小写字母开头。

  • 关系名称显示为第一项。

  • 对象显示为括号内以逗号分隔的参数。

  • 一段时间 ”。” 必须结束一个事实。

  • 对象也以小写字母开头。它们也可以以数字开头(如 1234),也可以是用引号引起来的字符串,例如 color(penink, 'red')。

  • 电话(agnibha,1122334455)。也称为谓词或子句。

句法

事实的语法如下 -

relation(object1,object2...).

例子

以下是上述概念的示例 -

cat(tom).
loves_to_eat(kunal,pasta).
of_color(hair,black).
loves_to_play_games(nawaz).
lazy(pratyusha).

规则

我们可以将规则定义为对象之间的隐式关系。所以事实是有条件的。因此,当一个关联条件为真时,谓词也为真。假设我们有一些规则如下 -

  • 莉莉跳舞会很高兴。

  • 如果汤姆正在寻找食物,他就饿了。

  • 如果杰克和比利都喜欢打板球,他们就是朋友。

  • 如果学校放假,他就会去玩,而且他有空。

这些是一些有条件为真的规则,因此当右侧为真时,左侧也为真。

这里符号(:-)将发音为“If”,或“隐含于”。这也称为颈部符号,该符号的左侧称为头部,右侧称为身体。这里我们可以使用逗号(,),称为合取,也可以使用分号,称为析取。

句法

rule_name(object1, object2, ...) :- fact/rule(object1,
 object2, ...)
Suppose a clause is like :
P :- Q;R.
This can also be written as
P :- Q.
P :- R.

If one clause is like :
P :- Q,R;S,T,U.

Is understood as
P :- (Q,R);(S,T,U).
Or can also be written as:
P :- Q,R.
P :- S,T,U.

例子

happy(lili) :- dances(lili).
hungry(tom) :- search_for_food(tom).
friends(jack, bili) :- lovesCricket(jack), lovesCricket(bili).
goToPlay(ryan) :- isClosed(school), free(ryan).

查询

查询是关于对象和对象属性之间关系的一些问题。所以问题可以是任何问题,如下所示 -

  • 汤姆是猫吗?

  • Kunal 喜欢吃面食吗?

  • 莉莉幸福吗?

  • 瑞恩会去玩吗?

因此,根据这些查询,逻辑编程语言可以找到答案并返回它们。

逻辑编程知识库

在本节中,我们将了解逻辑编程中的知识库是什么。

嗯,众所周知,逻辑编程由三个主要组成部分——事实、规则查询。这三者如果我们把事实和规则作为一个整体收集起来,那就形成了一个知识库。所以我们可以说知识库事实和规则的集合

现在,我们将看到如何编写一些知识库。假设我们有第一个知识库,称为 KB1。在 KB1 中,我们有一些事实。事实用于陈述在感兴趣的领域中无条件真实的事物。

知识库1

假设我们有一些知识,Priya、Tiyasha 和 Jaya 是三个女孩,其中 Priya 会做饭。让我们尝试以更通用的方式来写这些事实,如下所示 -

girl(priya).
girl(tiyasha).
girl(jaya).
can_cook(priya).

注意- 这里我们用小写字母写名称,因为在 Prolog 中,以大写字母开头的字符串表示变量

现在我们可以通过提出一些查询来使用这个知识库。“Priya 是女孩吗?”,它会回答“是”,“Jamini 是女孩吗?” 那么它会回答“否”,因为它不知道jamini是谁。我们的下一个问题是“Priya 可以做饭吗?”,它会说“是”,但如果我们问 Jaya 同样的问题,它会说“不”。

输出

GNU Prolog 1.4.5 (64 bits)
Compiled Jul 14 2018, 13:19:42 with x86_64-w64-mingw32-gcc
By Daniel Diaz
Copyright (C) 1999-2018 Daniel Diaz
| ?- change_directory('D:/TP Prolog/Sample_Codes').

yes
| ?- [kb1]
.
compiling D:/TP Prolog/Sample_Codes/kb1.pl for byte code...
D:/TP Prolog/Sample_Codes/kb1.pl compiled, 3 lines read - 489 bytes written, 10 ms

yes
| ?- girl(priya)
.

yes
| ?- girl(jamini).

no
| ?- can_cook(priya).

yes
| ?- can_cook(jaya).

no
| ?-

让我们看看另一个知识库,其中有一些规则。规则包含一些关于感兴趣的域有条件为真的信息。假设我们的知识库如下 -

sing_a_song(ananya).
listens_to_music(rohit).

listens_to_music(ananya) :- sing_a_song(ananya).
happy(ananya) :- sing_a_song(ananya).
happy(rohit) :- listens_to_music(rohit).
playes_guitar(rohit) :- listens_to_music(rohit).

所以上面给出了一些事实和规则。前两条是事实,其余的是规则。我们知道阿纳尼亚会唱歌,这意味着她也听音乐。因此,如果我们问“Ananya 听音乐吗?”,答案是正确的。同样,“罗希特快乐吗?”,这也是真的,因为他听音乐。但如果我们的问题是“Ananya 会弹吉他吗?”,那么根据知识库,它会说“No”。这些是基于此知识库的查询的一些示例。

输出

| ?- [kb2].
compiling D:/TP Prolog/Sample_Codes/kb2.pl for byte code...
D:/TP Prolog/Sample_Codes/kb2.pl compiled, 6 lines read - 1066 bytes written, 15 ms

yes
| ?- happy(rohit).

yes
| ?- sing_a_song(rohit).

no
| ?- sing_a_song(ananya).

yes
| ?- playes_guitar(rohit).

yes
| ?- playes_guitar(ananya).

no
| ?- listens_to_music(ananya).

yes
| ?-

知识库3

知识库3的事实和规则如下:

can_cook(priya).
can_cook(jaya).
can_cook(tiyasha).

likes(priya,jaya) :- can_cook(jaya).
likes(priya,tiyasha) :- can_cook(tiyasha).

假设我们想查看会做饭的成员,我们可以在查询中使用一个变量。变量应以大写字母开头。结果会一一显示。如果我们按回车键,那么它就会出来,否则如果我们按分号(;),那么它就会显示下一个结果。

让我们看一个实际的演示输出,以了解它是如何工作的。

输出

| ?- [kb3].
compiling D:/TP Prolog/Sample_Codes/kb3.pl for byte code...
D:/TP Prolog/Sample_Codes/kb3.pl compiled, 5 lines read - 737 bytes written, 22 ms
warning: D:/TP Prolog/Sample_Codes/kb3.pl:1: redefining procedure can_cook/1
         D:/TP Prolog/Sample_Codes/kb1.pl:4: previous definition
         
yes
| ?- can_cook(X).

X = priya ? ;

X = jaya ? ;

X = tiyasha

yes
| ?- likes(priya,X).

X = jaya ? ;

X = tiyasha

yes
| ?-