Prolog 区别于;开放式清单;及;差异列表“;

Prolog 区别于;开放式清单;及;差异列表“;,prolog,difference-lists,dcg,Prolog,Difference Lists,Dcg,“开放式列表”和“差异列表”之间有什么区别?例如 不限成员名额:[a、b、c | |] 差异列表:[a,b,c|U]-U.如上所述,开放列表是用于实现差异列表的工具 开放列表是在列表中的某个点上有未赋值变量的任何列表,例如:[a,b,c | X]。您可以使用开放列表来实现称为差分列表的数据结构,它正式指定了两个术语的结构,分别指向第一个元素和开放端,传统上定义为:[a,b,c | X]-X,以简化对此类列表的操作 例如,如果您只有一个开放列表,那么可以在末尾添加元素,但您需要迭代所有项。在差异列

“开放式列表”和“差异列表”之间有什么区别?例如

不限成员名额:[a、b、c | |]

差异列表:[a,b,c|U]-U.

如上所述,开放列表是用于实现差异列表的工具

开放列表是在列表中的某个点上有未赋值变量的任何列表,例如:
[a,b,c | X]
。您可以使用开放列表来实现称为差分列表的数据结构,它正式指定了两个术语的结构,分别指向第一个元素和开放端,传统上定义为:
[a,b,c | X]-X
,以简化对此类列表的操作


例如,如果您只有一个开放列表,那么可以在末尾添加元素,但您需要迭代所有项。在差异列表中,您只需使用列表结束变量(在上面的页面上称为
)跳过迭代并在固定时间内执行操作。

这两个概念似乎都是列表,但实际上它们不是。一个是具体的术语,另一个是惯例

开放式列表、部分列表 开放式列表是指不是列表但可以实例化为列表的术语。在标准行话中,它们被称为部分列表。以下是部分列表:
X
[a | X]
[X | X]
都是部分列表

开放式列表的概念暗示了对此类列表的某种使用,以模拟某种开放式状态。想象一本字典,它可能由一个开放式列表表示。每次添加新项时,变量“在部分列表的末尾”都会实例化为新元素。虽然这种编程技术在Prolog中是完全可能的,但它有一个很大的缺点:程序将严重依赖于过程解释。在许多情况下,根本没有办法进行声明性解释

差异列表 差异列表实际上并不是这样的列表,而是一种使用列表的特定方式,即预期列表由两个变量表示:一个用于列表的开始,一个用于列表的结束。因此,与其谈论差异列表,不如谈论差异列表

考虑:

el(E, [E|L],L).
在这里,最后两个参数可以被视为构成一个差异:一个包含单个元素
[E]
的列表。现在,您可以从更简单的列表中构建更复杂的列表,前提是您遵守某些约定,这些约定本质上是第二个参数只会进一步传递。这样的差异永远不会相互比较

el2(E, F, L0,L) :-
   el(E, L0,L1),
   el(F, L1,L).
请注意,这只是一个惯例。这些清单没有强制执行。想想:

?- el2(E, F, L, nonlist).
L = [E,F|nonlist].
这项技术也用于编码s