我需要 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]
(你试过什么?)这是一个有效的定义:
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
做了广告宣传的事情,我们可以在需要时使用它。在这里,您有了自己的递归过程(嗯,谓词)。它甚至是尾递归模 cons,这更加时髦和有趣。
那里缺少更多的边缘情况。我很肯定你可以完成它。
几乎没有比这更直接的实现了:
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].