首页 > 解决方案 > Prolog,我想从列表中获取 2 个不同的值,并将所有其他值获取到另一个列表中

问题描述

假设我有并且list(A,X,Y,R)我想得到两个不同的值,并且所有其他值都转到.XYAAR

我怎么能这样做?

例子

?- 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].

标签: listprolog

解决方案


好的,这里你有一个通用的解决方案。我已经在 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).

分解:

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

它传递了您给出的示例,尽管解决方案的检索顺序与您编写的顺序不同。


推荐阅读