我目前正在参加 Prolog 课程。
我熟悉[A|B]
Prolog 中列表的表示法,但老师表明这[a,b,c|X]-X
也是一种有效的列表方式,我们在其中引用了列表的尾部。但是,当我使用 Swi-Prolog 进行尝试时,我收到以下错误:ERROR: Undefined procedure: (-)/2 (DWIM could not correct goal)
.
(-)/2 运算符是刚刚在标准 Prolog 中定义但在 Swi-Prolog 中没有定义,还是我遗漏了什么?
我目前正在参加 Prolog 课程。
我熟悉[A|B]
Prolog 中列表的表示法,但老师表明这[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)
。它只是一个复合术语,用作数据。
您将其用作可调用的目标,但事实并非如此。
您不调用这些术语,而是操纵它们,将它们用作表达它们之间关系的谓词的参数。