Пролог-предикат powerset
Я хочу определить предикат powerset(X, P), который является истинным, когда P является powerset X. Должно работать независимо от того, заземлен или нет P.
1 ответ
Поскольку вы используете SICStus Prolog, вы можете использовать subseq0(+Sequence,?SubSequence) из библиотеки (списков), что "верно, когда SubSequence является подпоследовательностью Sequence, но может быть самой Sequence" (Цитата из руководства http://www.sics.se/sicstus/docs/4.0.2/html/sicstus/lib_002dlists.html).
?- setof(X, subseq0([a,b,c],X), Xs).
Xs = [[],[a],[a,b],[a,b,c],[a,c],[b],[b,c],[c]]
Если вам не разрешено использовать библиотечные предикаты, вы можете реализовать subseteq0, как объяснено в модификации набора параметров gnu Prolog, которую я привожу здесь для полноты (благодаря gusbro)
powerset([], []).
powerset([H|T], P) :- powerset(T,P).
powerset([H|T], [H|P]) :- powerset(T,P).