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

Difference list with (-)/2 operator

我目前正在上 Prolog 课程。

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

(-)/2 运算符是在标准 Prolog 中定义的,但在 Swi-Prolog 中没有定义,还是我遗漏了什么?

这种结构称为差异表。 (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],所以有输出:

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 ------------>

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

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

您不调用此类术语,而是操纵它们,将它们用作表达它们之间关系的谓词的参数。