- 序言教程
- 序言 - 主页
- Prolog - 简介
- Prolog - 环境设置
- Prolog - 你好世界
- Prolog - 基础知识
- Prolog - 关系
- Prolog - 数据对象
- Prolog - 运算符
- 循环与决策
- 连接词和析取词
- Prolog - 列表
- 递归和结构
- Prolog - 回溯
- Prolog - 不同与不同
- Prolog - 输入和输出
- Prolog - 内置谓词
- 树数据结构(案例研究)
- Prolog - 示例
- Prolog - 基本程序
- Prolog - 剪切示例
- 河内塔问题
- Prolog - 链接列表
- 猴子和香蕉问题
- Prolog 有用资源
- Prolog - 快速指南
- Prolog - 有用的资源
- Prolog - 讨论
Prolog - 递归和结构
本章介绍递归和结构。
递归
递归是一种技术,其中一个谓词使用自身(可能与其他一些谓词一起)来查找真值。
让我们借助一个例子来理解这个定义 -
is_digesting(X,Y) :- just_ate(X,Y)。
is_digesting(X,Y) :-just_ate(X,Z),is_digesting(Z,Y)。
所以这个谓词本质上是递归的。假设我们说just_ate(deer,gras),则意味着is_digesting(deer,grass)为 true。现在,如果我们说is_digesting(tiger,gras),则如果is_digesting(tiger,gras) :- just_ate(tiger, deer), is_digesting(deer,gras)则为 true ,则语句is_digesting(tiger,gras)也为 true 。
可能还有其他一些例子,所以让我们看一个家庭例子。因此,如果我们想表达前驱逻辑,可以使用下图来表达 -
所以我们可以理解前驱关系是递归的。我们可以使用以下语法来表达这种关系 -
前驱(X,Z):- 父级(X,Z)。
前驱(X,Z):- 父级(X,Y),前驱(Y,Z)。
结构
结构是包含多个组件的数据对象。
例如,日期可以被视为具有三个组成部分的结构——日、月和年。那么日期 2020 年 4 月 9 日可以写成:date(9, apr, 2020)。
注意- 结构又可以有另一个结构作为其中的组件。
所以我们可以将视图视为树结构和Prolog Functor。
现在让我们看一个 Prolog 中的结构示例。我们将定义点、线段和三角形的结构作为结构。
为了使用 Prolog 中的结构来表示点、线段和三角形,我们可以考虑以下语句 -
p1 − 点(1, 1)
p2 − 点(2,3)
S − seg( P1, P2): seg( 点(1,1), 点(2,3))
T − 三角形( 点(4,Z), 点(6,4), 点(7,1) )
注意- 结构可以自然地被描绘成树。Prolog 可以被视为一种处理树的语言。
Prolog 中的匹配
匹配用于检查两个给定项是否相同(相同)或者两个项中的变量在实例化后是否可以具有相同的对象。让我们看一个例子。
假设日期结构定义为 date(D,M,2020) = date(D1,apr, Y1),这表示 D = D1、M = feb 和 Y1 = 2020。
以下规则用于检查两个术语 S 和 T 是否匹配 -
如果 S 和 T 是常数,则如果两者是相同的对象,则 S=T。
如果 S 是变量且 T 是任意值,则 T=S。
如果 T 是变量并且 S 是任意值,则 S=T。
如果 S 和 T 是结构,则 S=T 如果 -
S 和 T 具有相同的函子。
它们所有相应的参数组件必须匹配。
二叉树
以下是使用递归结构的二叉树的结构 -
该结构的定义如下 -
node(2, node(1,nil,nil), node(6, node(4,node(3,nil,nil), node(5,nil,nil)), node(7,nil,nil))
每个节点有三个字段、数据和两个节点。没有子节点(叶子节点)结构的节点写为node(value, nil, nil),只有一个左子节点的节点写为node(value, left_node, nil),只有一个右子节点的节点写为node (value, nil; right_node),并且具有两个子节点的节点具有node(value, left_node, right_node)。