将2个列表连接起来,第三个列表包含2个列表中元素的每个不同顺序

时间:2019-12-29 21:26:38

标签: list prolog

所以我有2个列表,连接起来后应该返回一个如下所示的列表

| ?-concat([a,b,c],[1,2,3,4],X)。

X = [a,b,c,1,2,3,4];

X = [a,b,1,c,2,3,4];

X = [a,b,1,2,c,3,4];

X = [a,b,1,2,3,c,4];

X = [a,b,1,2,3,4,c];

...

所以我写了这段代码来回答这个问题:

concat([], Y, Y).
concat([E|X], Y, [E|Z]) :- concat(X,Y,Z).
   concat(X, Y, [Y|X]).

但我将其作为输出

?-concat([a,b,c],[1,2,3,4],X)。

X = [a,b,c,1,2,3,4];

X = [a,b,c,[1,2,3,4]];

X = [a,b,[1,2,3,4],c];

X = [a,[1,2,3,4],b,c];

X = [[1、2、3、4],a,b,c]。

我是Prolog的新手,所以我不确定自己的错在哪里,我们将不胜感激

1 个答案:

答案 0 :(得分:0)

您的问题在第三行:

concat(X, Y, [Y|X]).

[Y|X]不是Y的所有元素的列表,其后是X的所有元素,它是一个列表,其第一个元素是列表Y,并且那么其余元素就是X的元素。

我下面的代码如下:

concat([], [], []).
concat([E|X], Y, [E|Z]) :- concat(X,Y,Z).
concat(X, [F|Y], [F|Z]) :- concat(X,Y,Z).

您拥有concat([], Y, Y).的第一行效果很好,但我认为我的方法更简洁,更对称,这是归纳法的基础。