修改一个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].
非常感谢任何建议!
答案 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([],[]).
简单易懂,但可能效率低于传统实施(尽管操作原理完全相同;阅读评论)已经提出过。