我正在尝试在prolog中编写一个程序,如果L1 = [1,2,3]且L2 = [4,5,6]则L3 = [1,4,2,5,3,6]
所以shuffle([1,2,3],[4,5,6],[1,4,2,5,3,6])
到目前为止,我有这个:
shuffle([X],[Y],[X,Y]).
shuffle([X|Xs],[Y|Ys],_) :- shuffle(Xs,Ys,Z), shuffle(X,Y,Z).
这是我第一次尝试编写prolog代码,所以我仍然试图围绕语法,规则和所有内容。
我理解逻辑,我只是不确定如何实现它,所以任何帮助将不胜感激!
谢谢!
编辑:我已经弄清楚了。如果有人感兴趣,这是解决方案:
shuffle([X],[Y],[X,Y]).
shuffle([X|Xs],[Y|Ys],[Z1,Z2|Zs]) :- shuffle([X],[Y],[Z1,Z2]),shuffle(Xs,Ys,Zs).
答案 0 :(得分:20)
shuffle([], B, B).
shuffle([H|A], B, [H|S]) :- shuffle(B, A, S).
在这类问题中,通常困难的部分不是Prolog,而是确定解决它的最简单的递归关系。
答案 1 :(得分:1)
以下是简单的解决方案:
shuffle([], [], []).
shuffle([X|Xs], [Y|Ys], [X,Y|Zs]) :-
shuffle(Xs,Ys,Zs).
将其概括为处理不等长度的列表是将基本案例改为:
shuffle(Xs, [], Xs).
shuffle([], Ys, Ys).
虽然这可能会产生重复的解决方案。如果您不介意谓词是“单向的”,那么可以使用cut来修复这些。
(虽然我仍然认为你应该拨打flatzip
或interlace
而不是shuffle
。)