我需要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]
答案 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
我们可以利用第一个参数索引来改善决定论。
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].