所以我正在解决这个问题,要在列表中连续使用3个X元素,并且只能使用concat。
以下是我的尝试:
threeConsecutive(X, L):- concat(X, X, L2), concat(L2, X, L).
这是对的吗?如果没有,你能解释一下我做错了什么吗?根据我的看法,我将2个X元素连接起来并将它们放在另一个名为L2的自由变量中,然后再用元素X连接它。最后我将它存储在原始列表L中。
如果有人可以检查一下,我会非常感激,因为我真的想要在Prolog中掌握concat的概念。
谢谢!
答案 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的回答已经显示了所需的正确模式,我将避免在此重复。