Prolog,我想从列表中获取 2 个不同的值,并将所有其他值获取到另一个列表

Prolog, I want to get 2 different values from list and all the others to another list

假设我有 list(A,X,Y,R),我想从 A 中获得 XY 两个不同的值,而所有其他值 A值转到 R.

我该怎么做?

例子

?- list([],X,Y,R). false.
?- list([1],X,Y,R). false.
?- list([1,2],X,Y,R). X=1, Y=2, R=[];
X=2, Y=1, R=[].
?- list([1,1],X,Y,R). X=1, Y=1, R=[];
X=1, Y=1, R=[].
?- list([1,2,3],X,Y,R). X=1, Y=2, R=[3];
X=1, Y=3, R=[2];
X=2, Y=1, R=[3];
X=2, Y=3, R=[1]; X=3, Y=1, R=[2]; X=3, Y=2, R=[1].

好的,这里有一个通用的解决方案。我已经在 SWI-prolog 中试过了,但如果有任何谓词对你不起作用,至少你可以寻找一个等价物:

list([A,B|T], X, Y, T) :- 
    permutation([A,B], [X, Y]).
list([A,B|T], X, Y, [D|R]) :- 
    permutation([C, D], [A,B]),
    list([C|T], X, Y, R).

细分:

  • 基本情况:XY 是任意顺序的前两个元素。 R 将是列表的尾部。
  • 递归情况:从前两个元素中选择一个 (D) 并在重试之前将其从列表中删除,然后将其添加到 R.

它通过了您提供的示例,尽管检索解决方案的顺序与您编写的顺序不同。