在 Prolog 中交换列表的最后两个元素

Bil*_*ter 6 list prolog

我一直在尝试编写一个程序来比较两个相同的列表,除了列表 2 的最后两个元素顺序相反,即 [4,5,6] 和 [4,6,5],并且返回最后两个已交换的元素。

例如:

SwapLastTwo([4, 5, 6] , [ 4, 6, 5], X).
Run Code Online (Sandbox Code Playgroud)

应该返回

X = [6, 5]
Run Code Online (Sandbox Code Playgroud)

到目前为止我的代码如下所示:

lastTwoReversed([Z,A|T],[_,Y,X]) :-reverse([Z,A|T],[Y,X|_]).
Run Code Online (Sandbox Code Playgroud)

到目前为止,我的谓词仅接受两个参数并检查是否相同,但列表 2 的最后两个元素顺序相反true,如果满足条件则返回

我不知道如何修改我的谓词以将 theX作为其第三个参数并入并使其返回交换的元素。

sla*_*ago 5

尝试这个:

lastTwoReversed(L1, L2, [X1,X2]) :-
    reverse(L1, [X1,X2|Rest]),
    reverse(L2, [X2,X1|Rest]).
Run Code Online (Sandbox Code Playgroud)

请注意,通过在两个子目标中使用变量Rest,您可以确定列表必须相同,但最后两项(已交换)除外。

例子:

?- lastTwoReversed([1,2,3,4,5,6], [1,2,3,4,6,5], R).
R = [6, 5].

?- lastTwoReversed([1,2,3,4,5,6], [1,2,3,6,5], R).
false.

?- lastTwoReversed([1,2,3,4,5,6], [1,2,3,4,5,6], R).
false.
Run Code Online (Sandbox Code Playgroud)