与( - )/ 2运算符的差异列表

时间:2018-06-17 14:58:20

标签: prolog difference-lists

我目前正在参加Prolog课程。

我熟悉Prolog中列表的[A|B]符号,但老师表明[a,b,c|X]-X也是列表的有效方式,我们在其中引用了尾部的清单。当我使用Swi-Prolog尝试时,我收到以下错误:ERROR: Undefined procedure: (-)/2 (DWIM could not correct goal)

( - )/ 2运算符是刚刚在标准Prolog中定义的,而不是在Swi-Prolog中定义的,还是我错过了什么?

2 个答案:

答案 0 :(得分:2)

这种结构称为差异列表。 (https://en.wikibooks.org/wiki/Prolog/Difference_Lists

可能你用的是' - '错误。让我们考虑在差异列表中附加谓词:

app(X-Y, Y-Z, X-Z).

您可以像这样测试它(在编译具有此谓词的文件之后):

?- app([1,2,3|A]-A, [4, 5|B]-B, C).

[1,2,3 | A] -A可视为[1,2,3],[4,5 | B] -B可视为[4,5],因此输出:< / p>

A = [4, 5|B],
C = [1, 2, 3, 4, 5|B]-B.

你可以看到,C变为[1,2,3,4,5 | B] -B,可以认为是[1,2,3,4,5]。

很少看到那里发生了什么:

 <-------------------X--------------------->
               <-------------Y------------->
                              <-----Z------>
||............||.............||............||   <- List
 <--- X-Y ----><---- Y-Z ---->
 <---------- X-Z ------------>

答案 1 :(得分:2)

[a,b,c|X]-X'-'([a,b,c|X],X)相同。它只是一个复合词,用作数据。

您将其用作可调用的目标,但事实并非如此。

你不会调用这些术语,你操纵它们,将它们用作表达它们之间关系的谓词的参数。