0

我需要 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]

4

2 回答 2

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做了广告宣传的事情,我们可以在需要时使用它。在这里,您有了自己的递归过程(嗯,谓词)。它甚至是尾递归模 cons,这更加时髦和有趣。

那里缺少更多的边缘情况。我很肯定你可以完成它。

于 2013-05-30T14:20:57.227 回答
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].
于 2015-04-30T17:38:11.263 回答