Я пытаюсь создать код, который генерирует все подмножества набора для заказа. То есть, вызов subset([1,2,3], X)
должен генерироватьДлина заказанных подмножеств?
X = [];
X = [1];
X = [2];
X = [3];
X = [1,2];
X = [1,3];
X = [2,3];
X = [1,2,3].
Внутренний порядок не все, что важно, только что наименьшие подмножества перечислены первые (т.е. я не волнует, если предшествует [1 [2,3] , 2], только 1, [2] и [3] до [2,3]).
-
Я пробовал два подхода до сих пор. Сначала я попытался сделать предикат сам ...
subset([], []).
subset(List, []).
subset(List, [N]) :-
member(N, List).
subset(List, [N|Rest]) :-
!,
nth0(I, List, N),
findall(E, (nth0(J, List, E), J > I), NewList),
subset2(NewList, Rest).
... но он даже не подходит для работы по назначению. Во-вторых, я попробовал сделать poweret (используя this subset predicate) и заказать с list_to_ord_set/2, но я не мог заставить его работать.
Помощь?
Вам не нужно вырезать, если вы используете 'assign ([], []).' Вместо вашего первого правила? Если вы хотите избавиться от последней оценки, которая выводит «ложь» по какой-то причине, вы можете просто поменять порядок второго и третьего правил 'assign'. Он меняет порядок, но все еще действует в соответствии с тем, что хочет OP. – Fatalize
@Fatalize: разрез необходим, чтобы избежать дублирования решений, и anon var принимает подсписки Xs – CapelliC
Я не понимаю. Я получаю точные результаты с этими изменениями. Учтите, чтобы предоставить пример, который требует разреза и анонимную переменную? – Fatalize