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
中获得 X
和 Y
两个不同的值,而所有其他值 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).
细分:
- 基本情况:
X
和 Y
是任意顺序的前两个元素。 R
将是列表的尾部。
- 递归情况:从前两个元素中选择一个 (
D
) 并在重试之前将其从列表中删除,然后将其添加到 R
.
它通过了您提供的示例,尽管检索解决方案的顺序与您编写的顺序不同。
假设我有 list(A,X,Y,R)
,我想从 A
中获得 X
和 Y
两个不同的值,而所有其他值 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).
细分:
- 基本情况:
X
和Y
是任意顺序的前两个元素。R
将是列表的尾部。 - 递归情况:从前两个元素中选择一个 (
D
) 并在重试之前将其从列表中删除,然后将其添加到R
.
它通过了您提供的示例,尽管检索解决方案的顺序与您编写的顺序不同。