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 。

可能还有其他一些例子,所以让我们看一个家庭例子。因此,如果我们想表达前驱逻辑,可以使用下图来表达 -

递归 递归1

所以我们可以理解前驱关系是递归的。我们可以使用以下语法来表达这种关系 -

  • 前驱(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)