我可以使用以下代码和查询将单个对象添加到列表中:
makelist(A, B, C, X) :- append([1, 2, 3],A, X).
?- makelist(a, b, c, X).
X = [1, 2, 3|a].
但是,不是通常的分隔符逗号 (,),而是垂直线分隔符 (|),我无法将另一个对象添加到同一列表中:
makelist(A, B, C, X) :- append([1, 2, 3],A, X), append(X,B, X).
?- makelist(a, b, c, X).
false.
最佳答案
有几个误解。首先,列表及其元素被混淆,这导致了“点对”,即 |a]
。那么,看来你对变量的作用还不太清楚。
在目标 append([1,2,3],A,X)
中,A
和 X
都应该是列表。但是,您将 A
设置为 a
,它不是列表。背后的问题是 append/3
接受第二个参数的任何术语。要了解这一点,只需查看其答案即可:
?- append([1,2,3],A,X).
X = [1,2,3|A].
因此,A
可以是任何内容,但它应该只是一个列表。
?- A = a, append([1,2,3],A,X).
A = a, X = [1,2,3|a].
请注意,append/3
坚持第一个参数是列表(或部分列表)。一旦你有了一个坏列表,你就不能再进一步追加它了。即:
?- A = a, append([1,2,3],A,X), append(X, _, _).
false.
请注意,我没有按字面意思使用你的定义。相反,我用 _
替换了某些参数,因为它们没有帮助。
第二个问题源于目标append(X, B, X)
。这个目标仅在B = []
时才成立。让我们试试这个:
?- append(X, B, X).
X = [], B = []
; X = [_A], B = []
; X = [_A,_B], B = []
; X = [_A,_B,_C], B = []
; ... .
还有:
?- B = [_|_], append(X, B, X).
loops.
虽然X
有很多答案,但B
始终是[]
。
关于list - 如何在Prolog中列出对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23185658/