带 (-)/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)
。它只是一个复合术语,用作数据。
您将其用作可调用目标,但事实并非如此。
您不调用此类术语,而是操纵它们,将它们用作表达它们之间关系的谓词的参数。
我目前正在上 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)
。它只是一个复合术语,用作数据。
您将其用作可调用目标,但事实并非如此。
您不调用此类术语,而是操纵它们,将它们用作表达它们之间关系的谓词的参数。