如何获得列表元素重复的所有组合-Prolog

时间:2018-12-30 03:57:47

标签: prolog

我正在尝试通过重复列表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.

3 个答案:

答案 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
   ?-