Prolog 为什么二叉树实现为嵌套项,而不是嵌套列表?

Prolog 为什么二叉树实现为嵌套项,而不是嵌套列表?,prolog,Prolog,我知道这是一个模糊的问题,但仍然是:是什么让术语比列表更适合嵌套?或者列表(内部)是嵌套术语的一个小例子 (例如,我意识到我可以“使用源代码”,SWI Prolog,但如果您事先不知道元素的数量,则使用指向正确方向的指针是很有意义的)。如果每个实体都有固定数量的元素(就像二叉树中的节点一样),那么使用具有固定算术的术语比列表更节省内存。例如,考虑结构: node(Name, Left, Right) 这总共需要4个内存单元:一个用于函子,三个用于参数 使用列表(在本例中为[Name,Left,

我知道这是一个模糊的问题,但仍然是:是什么让术语比列表更适合嵌套?或者列表(内部)是嵌套术语的一个小例子


(例如,我意识到我可以“使用源代码”,SWI Prolog,但如果您事先不知道元素的数量,则使用指向正确方向的指针是很有意义的)

。如果每个实体都有固定数量的元素(就像二叉树中的节点一样),那么使用具有固定算术的术语比列表更节省内存。例如,考虑结构:

node(Name, Left, Right)
这总共需要4个内存单元:一个用于函子,三个用于参数

使用列表(在本例中为
[Name,Left,Right]
)大约占用两倍的内存:

'.'(Name, '.'(Left, '.'(Right, []))).
3个单元格用于列表函子('.'),1个单元格用于
[]
,3个单元格用于参数


当然,你也知道,列表也是一个术语。不是列表、数字、对等的术语有时称为“结构”。

如果您事先不知道元素的数量,则使用列表是有意义的。如果每个实体都有固定数量的元素(就像二叉树中的节点一样),那么使用具有固定算术的术语比列表更节省内存。例如,考虑结构:

node(Name, Left, Right)
这总共需要4个内存单元:一个用于函子,三个用于参数

使用列表(在本例中为
[Name,Left,Right]
)大约占用两倍的内存:

'.'(Name, '.'(Left, '.'(Right, []))).
3个单元格用于列表函子('.'),1个单元格用于
[]
,3个单元格用于参数


当然,你也知道,列表也是一个术语。不是列表、数字、对等的术语有时称为“结构”。

如前所述,Prolog列表只是两个术语之上的语法糖:'./2和'[]'。请参阅此答案以了解详细信息:

如前所述,序言列表只是两个术语之上的语法糖:“.”/2和“[]”。请参阅此答案了解详细信息:

好的,这确实可以澄清问题。诚然,我忽略了列表是术语的一种特殊形式这一事实。我想象列表表示可以依赖于实现,但它是由语言规范决定的。好吧,这确实澄清了这一点。诚然,我忽略了列表是术语的一种特殊形式这一事实。我想象列表表示可以依赖于实现,但它是由语言规范决定的。