HSG

Aktuelle Seite: HSG/Fächer/Informatik/Prolog

Aufgabe

Es soll die Potenzmenge einer gegebenen Menge ermittelt werden.

Lösung in Delphi - Quelltext und Ausgabe
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;

Delphi-Ausgabe potenzmenge.zip

Lösung in Prolog - Quelltext und Ausgabe
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]]

weiteres Beispiel

Baum des Pythagoras