我可以使用此代码和查询将单个对象添加到列表中:
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.
答案 0 :(得分:4)
有几个误解。首先,列表及其元素混淆,导致“{1}}的”点对“。然后,似乎你不清楚变量的作用。
在目标|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, _, _).
no
替换了某些参数,因为它们无法帮助。
第二个问题源于目标_
。如果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).
有很多答案,但X
总是B
。
答案 1 :(得分:0)
append
附加列表。因此,您希望创建一个包含单个元素的列表,以将其附加到另一个列表中:
makelist(A, B, C, X) :- append([1, 2, 3], [A], X). % What's the purpose of B and C, btw?
您还可以更有效地将项目添加到列表的开头:
makelist(A, B, C, [A | [1, 2, 3]]).