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