A   set   is a collection (container) of certain values,
without any particular order, and no repeated values.

It corresponds with a finite set in mathematics.

A set can be implemented as an associative array (partial mapping)
in which the value of each key-value pair is ignored.

Given a set S, the power set (or powerset) of S, written P(S), or 2S, is the set of all subsets of S.



Task

By using a library or built-in set type, or by defining a set type with necessary operations, write a function with a set S as input that yields the power set 2S of S.



For example, the power set of     {1,2,3,4}     is

 {{}, {1}, {2}, {1,2}, {3}, {1,3}, {2,3}, {1,2,3}, {4}, {1,4}, {2,4}, {1,2,4}, {3,4}, {1,3,4}, {2,3,4}, {1,2,3,4}}.
For a set which contains n elements, the corresponding power set has 2n elements, including the edge cases of empty set.


The power set of the empty set is the set which contains itself (20 = 1):


 





P




{\displaystyle {\mathcal {P}}}

(



∅


{\displaystyle \varnothing }

) = { 



∅


{\displaystyle \varnothing }

 }

And the power set of the set which contains only the empty set, has two subsets, the empty set and the set which contains the empty set (21 = 2):


 





P




{\displaystyle {\mathcal {P}}}

({



∅


{\displaystyle \varnothing }

}) = { 



∅


{\displaystyle \varnothing }

, { 



∅


{\displaystyle \varnothing }

 } }


Extra credit:  Demonstrate that your language supports these last two powersets.




 
options mprint mlogic symbolgen source source2;
 
%macro SubSets (FieldCount = );
data _NULL_;
	Fields = &FieldCount;
	SubSets = 2**Fields;
	call symput ("NumSubSets", SubSets);
run;
 
%put &NumSubSets;
 
data inital;
	%do j = 1 %to &FieldCount;
		F&j. = 1;
	%end;
run;
 
data SubSets;
	set inital;
	RowCount =_n_;
	call symput("SetCount",RowCount);
run;
 
%put SetCount ;
 
%do %while (&SetCount < &NumSubSets);
 
data loop;
	%do j=1 %to &FieldCount;
		if rand('GAUSSIAN') > rand('GAUSSIAN') then F&j. = 1;
	%end;
 
data SubSets_  ;
set SubSets loop;
run;
 
proc sort data=SubSets_  nodupkey;
	by F1 - F&FieldCount.;
run;
 
data Subsets;
	set SubSets_;
	RowCount =_n_;
run;
 
proc sql noprint;
	select max(RowCount) into :SetCount
	from SubSets;
quit;
run; 
 
%end;
%Mend SubSets;
 