Задача: Построить все сочетания по n элементов заданного множества. Пример:
?-comb(2, [1, 2, 3], X).
X = [[1, 2], [1, 3], [2, 3]].
Написал такие процедуры:
comb(0, _, [[]]).
comb(N, [X|T], [X|Comb]) :- N > 0, N1 is N-1, comb(N1, T, Comb).
comb(N, [_|T], Comb) :- N > 0, comb(N, T, Comb).
Но они выводят просто подряд:
X = [1, 2]
X = [1, 3]
X = [2, 3]
А нужно это все внести в список. И я не могу понять, как это сделать Пытался перевести с haskell такой код:
comb _ [] _ = []
comb n (y:ys) len
| n >= len = [y:ys]
| n == 0 = [[]]
| otherwise = map (y:) (comb (n - 1) ys (len - 1)) ++ comb n ys (len - 1)
Но тоже ничего не получилось. Какое может быть решение данной задачи?
?- findall(X, comb(2, [1, 2, 3], X), Y).– extrn May 20 '20 at 23:34findall,bagoffиsetof– Cost May 23 '20 at 14:24