Prolog如何在列表函数中交换两个元素?

时间:2013-05-30 14:13:59

标签: list prolog swap

我需要Prolog中的一个函数:swapcouple(L, L1)

swapcouple([a,b,c,d,e], M) - >输出M=[b,a,d,c,e]

swapcouple([a,b,c,d], M) - >输出M=[b,a,d,c]

2 个答案:

答案 0 :(得分:2)

(您尝试了什么?)这是一个有效的定义:

swapcouple([a,b,c,d,e], M) :- M=[b,a,d,c,e].    
swapcouple([a,b,c,d], M) :- M=[b,a,d,c].

继续抽象。例如,

swapcouple([A,B,C,D,E], M) :- M=[B,A,D,C,E].    
swapcouple([A,B,C,D], M) :- M=[B,A,D,C].
你知道我要去哪里吗? [A,B,C,D,E] = [A,B | R]其中R = [C,D,E]。我们可以使用它吗?

swapcouple([A,B|R], M) :- R=[C,D,E], M=[B,A|S], S=[D,C,E].

右?这是至关重要的一点。 R=[C,D,E], S=[D,C,E]swapcouple(R,S)相同,不是吗?

swapcouple([A,B|R], M) :- M=[B,A|S], swapcouple(R,S).

假设 swapcouple做了广告宣传的内容,我们可以在需要时使用它。在这里,你有自己的recursive程序(好吧,谓词)。它甚至是tail recursive modulo cons,更加时尚和有趣。

那里缺少更多边缘案例。我很肯定你可以完成它。

答案 1 :(得分:1)

实施很难比这更直接:

list_swappedcouples([],[]).
list_swappedcouples([A],[A]).
list_swappedcouples([A,B|Xs],[B,A|Ys]) :-
   list_swappedcouples(Xs,Ys).

以下是您的示例查询:

?- list_swappedcouples([a,b,c,d,e],Ls).
Ls = [b,a,d,c,e] ;                        % succeeds, but leaves behind choicepoint
false.

?- list_swappedcouples([a,b,c,d],Ls).
Ls = [b,a,d,c].                           % succeeds deterministically

编辑2015-06-03

我们可以利用第一个参数索引来改善决定论。

list_with_swapped_couples([],[]).
list_with_swapped_couples([X|Xs],Ys) :-
   list_prev_w_swapped_couples(Xs,X,Ys).

list_prev_w_swapped_couples([],X,[X]).
list_prev_w_swapped_couples([X1|Xs],X0,[X1,X0|Ys]) :-
   list_with_swapped_couples(Xs,Ys).

请注意,以下所有示例查询都会确定性地成功。

?- list_with_swapped_couples([],Xs).
Xs = [].

?- list_with_swapped_couples([1],Xs).
Xs = [1].

?- list_with_swapped_couples([1,2],Xs).
Xs = [2,1].

?- list_with_swapped_couples([1,2,3],Xs).
Xs = [2,1,3].

?- list_with_swapped_couples([1,2,3,4],Xs).
Xs = [2,1,4,3].

?- list_with_swapped_couples([1,2,3,4,5],Xs).
Xs = [2,1,4,3,5].