?-op(60,fx,not).
?-op(100,xfx,-->).
?-op(40,xfx,\=).
?-op(30,xfx,tut).

/* logische Negation */
not X:-X,!,fail.
not _ .

/* logische Implikation */
X-->Y:-not X;Y.

/* Ungleichheit */
X\=X:-!,fail.
_\=_ .

/* Zuordnung */
X tut X.

taetigkeit(papeln).
taetigkeit(dullen).
taetigkeit(kekeln).
taetigkeit(blunten).


loesung(Knake,Prisi,Blunt,Dila):-

  /* Jeder tut etwas von dem, was hier genannt ist, und keine zwei tun  */
  /* dasselbe.                                                          */
  taetigkeit(Knake),
  taetigkeit(Prisi),Prisi\=Knake,
  taetigkeit(Blunt),Blunt\=Knake,Blunt\=Prisi,
  taetigkeit(Dila), Dila \=Knake,Dila \=Prisi,Dila\=Blunt,

  /* Wenn das Knake nicht papelt, dann dullt der Prisi nicht.           */
  not Knake tut papeln                   --> not Prisi tut dullen,

  /* Wenn der Blunt entweder dullt oder bluntet, dann papelt das Knake. */
  (Blunt tut dullen ; Blunt tut blunten) --> Knake tut papeln,

  /* Wenn der Prisi nicht kekelt dann bluntet der Blunt.                */
  not Prisi tut kekeln                   --> Blunt tut blunten,

  /* Wenn die Dila dullt, dann papelt der Blunt.                        */
  Dila tut dullen                        --> not Blunt tut papeln,

  /* Und wenn die Dila nicht papelt, dann papelt der Blunt.             */
  not Dila tut papeln                    --> Blunt tut papeln.

run:-
  writeln,writeln,
  writeln('(Logelei von Zweistein) Wenn das  Knake nicht papelt, dann dullt'),
  writeln('der  Prisi  nicht.  Wenn der Blunt  entweder dullt oder bluntet,'),
  writeln('dann papelt das Knake. Wenn der Prisi nicht kekelt, dann bluntet'),
  writeln('der Blunt. Wenn die Dila dullt, dann papelt der Blunt nicht. Und'),
  writeln('wenn die Dila nicht  papelt, dann  papelt  der  Blunt. Jeder tut'),
  writeln('etwas von dem,  was  hier  genannt ist,  und keine zwei tun das-'),
  writeln('selbe. Frage: Wer tut was?'),
  writeln,writeln,

  loesung(Knake,Prisi,Blunt,Dila),
  writeln('Das Knake tut ',Knake,'. '),
  writeln('Der Prisi tut ',Prisi,'. '),
  writeln('Der Blunt tut ',Blunt,'. '),
  writeln('Die Dila  tut ',Dila, '. '),
  writeln,
  fail.
run:-writeln('Das waren alle Loesungen.').


?-run.
