我正在尝试通过重复列表L中的所有元素来获取所有组合。这些元素需要在大小为N的列表中返回。 (L,N,CWR)。
预期结果将是这样的:
?-([red,blue,green], 2 , X).
X = [red, red] ;
X = [red, blue] ;
X = [red, green] ;
X = [blue, blue] ;
X = [blue, green] ;
X = [blue, red] ;
X = [green, green] ;
X = [green, blue] ;
X = [green, red] ;
false.
答案 0 :(得分:1)
进行更高级别的查看:
combinations_( L, N, R) :-
length( R, N),
maplist( flip(member,L), R).
flip( P, L, X):- call(P, X, L).
我们只创建一个长度为N
的列表,并依次填充L
的所有元素。
我首先在RosettaCode的Zebra Puzzle page上看到了flip
。
答案 1 :(得分:0)
这在SWI-Prolog中有效:
all_combos(_, 0, []).
all_combos(L, N, [H|T]) :-
length([H|T], N),
N1 is N - 1,
member(H, L),
all_combos(L, N1, T).
答案 2 :(得分:-3)
这是一个好的开始:
?- [user] .
% consulting user_input...
:- op(2'1,'yfx','of') .
(
_yO_ of _Xs_
)
:-
(
(
[] = _Xs_ ;
)
;
(
[_yO_|_xS_] = _Xs_
)
;
(
[_|_xS_] = _Xs_ ,
_yO_ of _xS_
)
)
.
%^D%
% consulting user_query...
?-
_Xs_ = ['red','green','blue'] ,
_pO_ of _Xs_ ,
_qO_ of _Xs_ ,
Ys = [_pO_,_qO_] .
Ys = [red,red] ? ;
Ys = [red,green] ? ;
Ys = [red,blue] ? ;
Ys = [red,_qO_] ? ;
Ys = [green,red] ? ;
Ys = [green,green] ? ;
Ys = [green,blue] ? ;
Ys = [green,_qO_] ? ;
Ys = [blue,red] ? ;
Ys = [blue,green] ? ;
Ys = [blue,blue] ? ;
Ys = [blue,_qO_] ? ;
Ys = [_pO_,red] ? ;
Ys = [_pO_,green] ? ;
Ys = [_pO_,blue] ? ;
Ys = [_pO_,_qO_] ? ;
false
?-