Prolog递归列表改组

时间:2018-05-08 17:07:22

标签: prolog

修改一个prolog考试并完成我们没有答案的过去的论文,我遇到了问题,我真的希望得到一些帮助!

问题: 编写一个谓词permute(Xs, Ys),它会对列表Xs的元素进行加扰,以获得加扰列表Ys。

查询?- permute([1,2,3], Ys).应该成功六次并给出以下答案:

Ys = [1,2,3]
Ys = [2,1,3]
Ys = [2,3,1]
Ys = [1,3,2]
Ys = [3,1,2]
Ys = [3,2,1]

虽然不一定按此顺序。

我们建议使用我们已经制作的谓词,到目前为止我有这个:

insert([], Y, [Y]).
insert([H|T], Y, [Y, H|T]).
insert([H|T], Y, [H|T2]) :- insert(T, Y, T2).

permute([], []).
permute([H|T], X) :- insert(T, H, X).

当我查询它时,我只得到我应该的一半,而且我无法改变列表的顺序。

?- permute([1,2,3], Ys).
Ys = [1,2,3],
Ys = [2,1,3],
Ys = [2,3,1].

非常感谢任何建议!

1 个答案:

答案 0 :(得分:0)

只是为了好玩,这里的解决方案完全基于append/3

permute(XX, [B|YY]) :-
    append(AA,[B|CC],XX),  % remove random element B from XX
    append(AA,CC,DD),      % DD is XX without B
    permute(DD,YY).        % permute DD into YY
permute([],[]).

简单易懂,但可能效率低于传统实施(尽管操作原理完全相同;阅读评论)已经提出过。