Пролог-предикат 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).
Другие вопросы по тегам