Prolog 在将元素插入AVL树的程序中,maplist是如何工作的

Prolog 在将元素插入AVL树的程序中,maplist是如何工作的,prolog,Prolog,我正在学习Prolog,但我无法理解课程内容,因此我对内置SWI Prolog谓词的映射列表的特定用法有一些疑问 让我解释一下我的情况: 我有一个名为addavl(Tree/Height,Element,NewTree/Height)的个人谓词,它将元素

我正在学习Prolog,但我无法理解课程内容,因此我对内置SWI Prolog谓词的映射列表的特定用法有一些疑问

让我解释一下我的情况:

我有一个名为
addavl(Tree/Height,Element,NewTree/Height)
的个人谓词,它将元素
插入AVL树
(其中
Height
是这棵原始树的高度)并生成一个名为
的新AVL树,该树包含
元素
,并且具有新的高度
高度

现在我有了一个元素列表,我将把这些元素添加到一个AVL树中(开始时是void),所以我有下面的谓词(可以正常工作)

我对使用
maplist/4
SWI Prolog内置谓词有一些疑问,我还想知道我对所有这些谓词的一般解释是否正确,或者我是否遗漏了什么

/*断言从给定元素列表构建AVL树:*/
构建树(列表,树):-
长度(列表,N),%N:列表中的元素数
/*将L1创建为具有相同列表元素数的列表
例如,如果列表中有N=4个元素L1=[A,B,C,D],其中A,B,C,D
是尚未设置的变量
*/
长度(L1,N),
/*Se-fosse:append(L1[Tree],NewList)otterrei:NewList=[A,B,C,D | Tree]
ma essendo NewList=[[uui124; L2]因此L2=[B,C,D|Tree]
*/
追加(L1[树],124; L2]),
/*把这对(nil,0)放在L1的头上,这样我就有了A=(nil,0)这个
表示空的AVL树:
*/
L1=[nil/0 | |],,
/*调用addavl作为参数传递L1头中的树,值
将列表头和L2头作为当前新树插入-
当到达变量树时,它表示最终的AVL树
*/
映射列表(addavl、L1、List、L2)。
我对整个谓词的解释如下:

第一个
N
变量包含要插入AVL树中的原始元素列表的长度

然后创建一个新列表,该列表的元素数与原始列表的元素数相同,但在本例中,
L1
包含尚未设置值的变量

例如,如果原始元素列表为:
List=[5,8,3,4]
L1
列表类似于:
L1=[A,B,C,D]
其中
A、B、C、D
是尚未定值的变量

现在必须满足以下声明:

append(L1,[Tree],[_|L2]),
我是这样读的:

如果我有
附加(L1[Tree],NewList)
而不是前面的语句,我会有:

NewList=[A,B,C,D,Tree]
其中
A,B,C,D
L1
列表的先前未设置变量,
Tree
是新的未设置变量

但是在我的例子中,我有一个
NewList=[\u124; L2]
所以
L2=[B,C,D,Tree]

现在,前面的
append
操作的含义是创建
L2
列表,该列表在开始时包含
n
非定值变量(在前面的示例中为4个非定值变量:
B、C、D

这些变量中的每一个都代表一棵树,在树中它被插入了原始列表中的新元素
列表

因此,在开始时,程序通过以下指令将void AVL树放在这个列表的开头(在我的示例中是
A
变量):
L1=[nil/0 | |]

因此在
L1
变量的头部有一个高度为0的void树(void树是正确的AVL树)

现在我有了第一个疑问:通过前面的操作,我已经对
L1
列表的head变量进行了值化,但是在前面的操作中,我使用以下语句创建了
NewList=[\u124; L2]
列表:

append(L1,[Tree],[_|L2])
这意味着
[\u124; L2]
列表的
\ucode>匿名变量与
nil/0
AVL树匹配? 如果我在创建了
[\u124; L2]
列表后将
L1
附加到
[Tree]
之后对
进行了价值化,那么这项工作也是以这种方式进行的

好的,如果我的解释是正确的,请继续我的第二个疑问,即它与映射列表的确切工作方式有关

我有:

 maplist(addavl, L1, List, L2).
这个谓词到底是什么意思

阅读正式文件:

在我看来,这项工作的方式如下:

我有一个
addavl
谓词,它是列表中每个元素必须满足的目标

记住,
addval
谓词是这样工作的:
addavl(树/高度,元素,新树/高度)

因此:

1)
L1
是AVL树的列表(第一个是无效AVL树:
nil/0

2)
列表
是包含要插入的元素的原始列表

3)
L2
是包含我将创建的AVL树的列表

因此,我认为现在的工作方式如下:

首先从
L1
nil/0
nil/0   B   C   D   Tree
------------------
       L1
        -----------------
               L2
nil/0   B     C     D       % L1
 E1     E2    E3    E4      % List
 B      C     D    Tree     % L2