“开放式列表”和“差异列表”之间的区别

时间:2012-12-27 17:13:56

标签: prolog difference-lists

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

3 个答案:

答案 0 :(得分:5)

正如http://homepages.inf.ed.ac.uk/pbrna/prologbook/node180.html所述,开放列表是用于实现差异列表的工具。

打开列表是列表中某个位置有未分配变量的任何列表,例如:[a,b,c|X]。您可以使用开放列表来实现名为差异列表的数据结构,该结构正式指定了指向第一个元素和开放端的两个术语的结构,传统上定义为:[a,b,c|X]-X,以便更轻松地对此类列表进行操作。

例如,如果您拥有的只是一个打开的列表,则可以在末尾添加元素,但您需要迭代所有项目。在差异列表中,您可以使用list-of-list变量(在上面的页面上称为Hole)来跳过迭代并在恒定时间内执行操作。

答案 1 :(得分:3)

例如

开放式:[a,b,c | _]

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

答案 2 :(得分:3)

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

开放式列表,部分列表

开放式列表是不是列表但可以实例化以使它们成为列表的术语。在标准术语中,它们被称为部分列表。以下是部分列表: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。