如何在Prolog中列出对象列表?

时间:2014-04-20 17:43:13

标签: list prolog

我可以使用此代码和查询将单个对象添加到列表中:

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.

2 个答案:

答案 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]]).