Power set: Difference between revisions

Content added Content deleted
(→‎Logical (cut-free) Definition: symbolic operation etc)
(→‎Single-Functor Definition: simplified version is much faster)
Line 1,734: Line 1,734:


===Single-Functor Definition===
===Single-Functor Definition===
<lang Prolog>power_set(T, PS) :-
<lang Prolog>power_set( [], [[]]).
bagof(PS1, power_set(T, [], PS1), PS).
power_set( [X|Xs], PS) :-
power_set(Xs, PS1),

maplist( append([X]), PS1, PS2 ), % i.e. prepend X to each PS1
power_set(T, PS, PS1) :-
append(PS1, PS2, PS).</lang>
select(E, T, T1), !,
append(PS, [E], PST),
( PST = PS1; power_set(T1, PS, PS1); power_set(T1, PST, PS1)).

power_set([], [], []).
</lang>
Output :
Output :
<pre>
<pre> ?- power_set([1,2,3,4], L).
:- power_set([1,2,3,4,5,6,7,8], X), length(X,N), writeln(N).
L = [[1],[2],[3],[4],[],[3,4],[2,3],[2,4],[2,3,4],[1,2],[1,3],[1,4],[1,3,4],[1,2,3],[1,2,4],[1,2,3,4]].
256
</pre>
</pre>