2

我目前正在参加 Prolog 课程。

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

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

4

2 回答 2

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],所以有输出:

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 ------------>
于 2018-06-17T15:56:33.500 回答
2

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

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

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

于 2018-06-17T18:45:13.280 回答