使用concat在Prolog中连续使用3个元素

时间:2016-03-24 05:03:58

标签: prolog

所以我正在解决这个问题,要在列表中连续使用3个X元素,并且只能使用concat。

以下是我的尝试:

threeConsecutive(X, L):- concat(X, X, L2), concat(L2, X, L).

这是对的吗?如果没有,你能解释一下我做错了什么吗?根据我的看法,我将2个X元素连接起来并将它们放在另一个名为L2的自由变量中,然后再用元素X连接它。最后我将它存储在原始列表L中。

如果有人可以检查一下,我会非常感激,因为我真的想要在Prolog中掌握concat的概念。

谢谢!

2 个答案:

答案 0 :(得分:2)

您所要做的就是使用模式匹配:

?- append(_, [X,Y,Z|_], [a,b,c,d,e,f]).
X = a, Y = b, Z = c ;
X = b, Y = c, Z = d ;
X = c, Y = d, Z = e ;
X = d, Y = e, Z = f ;
false.

append/3为你做回溯。

如果您希望将这三个元素放在自己的列表中,可以使用两次调用append/3

append(_, Suffix, List), append([X,Y,Z], _, Suffix)

如何制作包含三个元素的列表:只需说出List = [X,Y,Z]。要制作任何长度的列表,您甚至可以使用length(List, Len),例如length(List, 3)

而且,如果您需要三个变量相同(例如,统一它们),那么只需使用相同的变量:List = [X, X, X]

答案 1 :(得分:0)

  

这是对的吗?

不,第一个问题是追加/ 3(为了讨论,让我们说未定义的concat / 3 追加/ 3)表示3 之间的关系列表即可。所以

  

连接2个X元素并将它们放入另一个名为L2的自由变量

应该是

concat([X], [X], L2)

这可以通过统一更好地表达,如

[X,X] = L2

同样的问题适用于

..., concat(L2, X, L).

应该是concat(L2,X,L)。

..., concat(L2, [X], L).

然后您可以看到整个代码将减少到

threeConsecutive(X, [X,X,X]).

所以第二个问题很明显,但由于@Boris的回答已经显示了所需的正确模式,我将避免在此重复。