Как получить ВСЕ комбинации с повторением элементов списка - пролог - PullRequest
0 голосов
/ 30 декабря 2018

Я пытаюсь получить все комбинации с повторением всех элементов в списке 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 голосов
/ 30 декабря 2018

Просмотр более высокого уровня:

combinations_( L, N, R) :-
    length( R, N),
    maplist( flip(member,L), R).

flip( P, L, X):- call(P, X, L).

Мы просто создаем список длиной N и заполняем его всеми элементами L один за другим.

Я впервые увидел flip на странице RosettaCode Zebra Puzzle .

0 голосов
/ 03 января 2019

Это работает в 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).
0 голосов
/ 30 декабря 2018

Это хорошее начало:

   ?- [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
   ?- 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...