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