syllogismus("Barbara",   1).
syllogismus("Celarent",  1).
syllogismus("Darii",     1).
syllogismus("Ferio",     1).
syllogismus("Barbari",   1).
syllogismus("Celaront",  1). 
syllogismus("Camestres", 2).
syllogismus("Cesare",    2).
syllogismus("Festino",   2).
syllogismus("Camestros", 2).
syllogismus("Cesaro",    2).
syllogismus("Datisti",   3).
syllogismus("Disamis",   3).
syllogismus("Ferison",   3).
syllogismus("Darapti",   3).
syllogismus("Felapton",  3).
syllogismus("Calemes",   4).
syllogismus("Dimatis",   4).
syllogismus("Fresison",  4).
syllogismus("Bamalip",   4).
syllogismus("Calemos",   4).
syllogismus("Fesapo",    4).

unvollkommen(2).
unvollkommen(3).
unvollkommen(4).

vokal(X) :- member(X, "aeio").


vokale([], []).
vokale([Buchstabe|Rest], X) :-
    vokal(Buchstabe),vokale(Rest,Y), X=[Buchstabe|Y].
vokale([Buchstabe|Rest], X) :- 
    not(vokal(Buchstabe)), vokale(Rest, X).

 
zeile([S,A,P]) :- atom_char(a, A),
  writef("   Alle "), write(S), writef(" sind "), write(P), nl.
zeile([S,I,P]) :- atom_char(i, I),
  writef("   Einige "), write(S), writef(" sind "), write(P), nl.
zeile([S,E,P]) :- atom_char(e, E),
  writef("   Kein "), write(S), writef(" ist ein "), write(P), nl.
zeile([S,O,P]) :- atom_char(o, O),
  writef("   Einige "), write(S), writef(" sind nicht "), write(P), nl.
schreibe(X,Y,Z) :-
  zeile(X), zeile(Y),
  writef("---------------------------"),nl,
  zeile(Z), nl.
aeqschreibe(X,Y,Z) :-
  writef("Das ist richtig, wenn gilt:"), nl, schreibe(X, Y, Z).


vereinfache([[], X, Zeile], [[], X, Zeile]).
vereinfache([[M|Rest], X, Zeile], NEU) :- atom_char(m,M),
   append(Rest, "v",  Liste), vereinfache([Liste, X, Zeile], NEU).
vereinfache([[Buchstabe | Rest], X, Altezeile], NEU) :- 
   transformiere(Buchstabe, X, Y, Altezeile, Neuezeile), 
   vereinfache([Rest, Y, Neuezeile], NEU).
vereinfache([[Buchstabe], X, Altezeile], NEU) :- length(Buchstabe, 1),
   transformiere(Buchstabe, X, NEU, Altezeile, Neuezeile).


komplementaer(97, 105).  /* 97 <-> a, 105 <-> b */
komplementaer(105, 97).

transformiere(Buchstabe, X, X, A, B) :- vokal(Buchstabe),B is A+1.

transformiere(S, [[X,Y,Z],U,V], [[Z,Y,X],U,V], 1, 1) :- 
   atom_char(s,S), aeqschreibe([Z,Y,X],U,V).   
transformiere(S, [U,[X,Y,Z],V], [U,[Z,Y,X],V], 2, 2) :-
   atom_char(s,S), aeqschreibe(U,[Z,Y,X],V).
transformiere(S, [U,V,[X,Y,Z]], [U,V,[Z,Y,X]], 3, 3) :-
   atom_char(s,S), aeqschreibe(U,V,[Z,Y,X]).


transformiere(P, [[X,Y,Z],U,V], [[Z,W,X],U,V], 1, 1) :-
   atom_char(p,P), komplementaer(Y, W), aeqschreibe([Z,W,X],U,V).
transformiere(P, [U,[X,Y,Z],V], [U,[Z,W,X],V], 2, 2) :-
   atom_char(p,P), komplementaer(Y, W), aeqschreibe(U,[Z,W,X],V).
transformiere(P, [U,V,[X,Y,Z]], [U,V,[Z,W,X]], 3, 3) :-
   atom_char(p,P), komplementaer(Y, W), aeqschreibe(U,V,[Z,W,X]).
 
transformiere(V, [X,Y,Z], [Y,X,Z], Zeile, Zeile) :-
   atom_char(v,V), aeqschreibe(Y,X,Z).

transformiere(Sonstiges, X, X, Zeile, Zeile).

reduziere(S, 2, W) :- vokale(S, V), V=[X,Y,Z],
   initialisiere(S,[['P',X,'M'],['S',Y,'M'],['S',Z,'P']],W).
reduziere(S, 3, W) :- vokale(S, V), V=[X,Y,Z],
   initialisiere(S,[['M',X,'P'],['M',Y,'S'],['S',Z,'P']],W).
reduziere(S, 4, W) :- vokale(S, V), V=[X,Y,Z],
   initialisiere(S,[['P',X,'M'],['M',Y,'S'],['S',Z,'P']],W).

identifiziere(X, Name) :- X = [[M,A,P],[S,B,M],[S,C,P]], !,
   syllogismus(Name, 1), vokale(Name, [A,B,C]).

beweise(S, F) :- 
    reduziere(S, F, [_, X, _]), identifiziere(X, Name), 
    writef("Das ist der Syllogismus "),  writef(Name), 
    writef(" aus der ersten Figur."), nl, nl, nl, !, fail.

initialisiere(S, X, W) :- writef(S),
   writef(" ist der Syllogismus:"), nl, nl,
   X=[A,B,C], schreibe(A,B,C), 
   vereinfache([S, X, 0], W).


?-  unvollkommen(F), syllogismus(S,F), beweise(S,F), fail.





