如何在Prolog中反向配对某些列表?

例如:

?- reversePairs([1,2,3,4,5,6,7,9], R).
R = [2,1,4,3,6,5,9,7].                     % expected answer


到目前为止,我已经编写了以下代码:

reversePairs([X,Y|Xs], ReversedList) :-
   reversePairs([X,Y|Xs], [], ReversedList).

reversePairs([], ReversedList, ReversedList).
reversePairs([X,Y|Xs], Accum, ReversedList) :-
   reversePairs(Xs, [X,Y|Accum], ReversedList).


我的代码给了我以下答案:

?- reversePairs([1,2,3,4,5,6,7,9], R).
R = [7,9,5,6,3,4,1,2].                     % observed answer


如何更正我的代码以获得我想要的答案?有什么建议吗?

最佳答案

简单地:

reversePairs([],[]).

reversePairs([X,Y|T], [Y,X|RT]) :-
    reversePairs(T, RT).


如果元素数为奇数,则此代码将失败。您想为这种情况做什么?

10-06 01:04