HSG |
|
Es soll die Potenzmenge einer gegebenen Menge ermittelt werden.
procedure TForm1.bPotenzmengeClick(Sender: TObject); type TMenge = set of char; TPMenge = array of TMenge; const M : TMenge = ['a','b','c','d']; var PM : TPMenge; i,n : integer; function MengeToString(M : TMenge) : string; var s : string; i : integer; begin s := '['; for i := 0 to 255 do if char(i) in M then s := s + char(i)+','; if M [] then s := copy(s,1,Length(s)-1); s := s + ']'; result := s; end; function erstesElement(M : TMenge) : char; var i : integer; gefunden : boolean; begin i := 0; gefunden := false; while (i < 255) and (not gefunden) do begin Inc(i); gefunden := (char(i) in M); end; result := char(i); end; procedure ermittelePotenzmenge(M : TMenge; var PM : TPMenge); var Element : char; R : TMenge; PM1 : TPMenge; n,i : integer; begin Element := erstesElement(M); if Element = char(255) then begin SetLength(PM,1); PM[0] := []; end else begin R := M-[Element]; ermittelePotenzmenge(R,PM1); n := Length(PM1); SetLength(PM,2*n); for i := 0 to n-1 do PM[i] := PM1[i]; for i := n to 2*n-1 do PM[i] := PM1[i-n]+[Element]; SetLength(PM1,0); end; end; begin ermittelePotenzmenge(M,PM); mAusgabe.Lines.Add('Menge = '+MengeToString(M)); mAusgabe.Lines.Add(' '); mAusgabe.Lines.Add('Potenzmenge enthält:'); mAusgabe.Lines.Add(' '); n := Length(PM); for i := 0 to n-1 do MAusgabe.Lines.Add(MengeToString(PM[i])); end;
powerset([],[[]]). powerset([E|R],PM):-powerset(R,PMohneE), findall([E|T],member(T,PMohneE),PMmitE), append(PMohneE,PMmitE,PM).
Lange Listen gibt SWI-Prolog gekürzt aus. Nach Eingabe von "w" sieht man die ganze Liste.
?- powerset([a,b,c,d],PM). PM = [[], [d], [c], [c, d], [b], [b, d], [b, c], [b|...], [...]|...] w[write] PM = [[], [d], [c], [c, d], [b], [b, d], [b, c], [b, c, d], [a], [a, d], [a, c], [a, c, d], [a, b], [a, b, d], [a, b, c], [a, b, c, d]]