/* say by Peter Schorn */
/* pure AI therefore keep away in case of trouble */
?-op(100,fx,not).
all(jeder).
all(jede).
all(jedes).


some(ein).
some(eine).
some(einen).


verb(ist).
verb(legt).
verb(hat).
verb(kann).
verb(muss).


question(welche).
question(welcher).
question(welches).


query(Head,Object,Property):-
  Clause=..[Head,Object,Property],
  Clause.


ask(Head,Object,Property):-
  S1=..[ist,Z,Object],
  S2=..[Head,Z,Property],
  S1,
  S2,
  writeln(Z),
  fail.


say([Verb,X,Y]):-
  verb(Verb),
  query(Verb,X,Y).

say([Verb,X,Some,Y]):-
  verb(Verb),
  some(Some),
  query(Verb,X,Y).

say([Verb,Some,X,Y]):-
  verb(Verb),
  some(Some),
  query(Verb,X,Y).

say([Verb,Some1,X,Some2,Y]):-
  verb(Verb),
  some(Some1),
  some(Some2),
  query(Verb,X,Y).

say([Question,X,Verb,Some,Y]):-
  question(Question),
  verb(Verb),
  some(Some),
  ask(Verb,X,Y).

say([Question,X,Verb,Y]):-
  question(Question),
  verb(Verb),
  ask(Verb,X,Y).

say([was,weisst,du,ueber,X]):-
  verb(Verb),
  query(Verb,X,Y),
  writeln(X,' ',Verb,' ',Y,'. '),
  fail.

say([Question,X,kennst,du]):-
  S=..[ist,Z,X],
  S,
  writeln(Z),
  fail.

/*       "Knowledge Representation in First Order Predicate Calculus"
         ------------------------------------------------------------        */

/*       Deutsch                              Prolog                         */
/* Jedes Lebewesen ist sterblich  */ ist(X,sterblich):-ist(X,lebewesen).
/* Jeder Mensch ist ein Lebewesen */ ist(X,lebewesen):-ist(X,mensch).
/* Socrates ist ein Mensch        */ ist(socrates,mensch).
/* Bernhard ist ein Mensch        */ ist(bernhard,mensch).
/* Peter ist ein Mensch           */ ist(peter,mensch).
/* Antoniette ist ein Huhn        */ ist(antoniette,huhn).
/* Berta ist ein Huhn             */ ist(berta,huhn).
/* Caesarine ist ein Huhn         */ ist(caesarine,huhn).
/* Hubert ist ein Hahn            */ ist(hubert,hahn).
/* Jeder Hahn ist ein Huhn        */ ist(X,huhn):-ist(X,hahn).
/* Jedes Huhn ist ein Vogel       */ ist(X,vogel):-ist(X,huhn).
/* Jeder Vogel hat Federn         */ hat(X,federn):-ist(X,vogel).
/* Jeder Vogel ist ein Lebewesen  */ ist(X,lebewesen):-ist(X,vogel).
/* Jeder Hahn kann kraehen        */ kann(X,kraehen):-ist(X,hahn).
/* Jeder Vogel kann fliegen       */ kann(X,fliegen):-ist(X,vogel).
/* Jedes Huhn legt Eier           */ legt(X,eier):-ist(X,huhn),not ist(X,hahn).
/* Jedes Lebewesen muss essen     */ muss(X,essen):-ist(X,lebewesen).
not X:-X,!,fail.
not X.
