% Beispielgrammatik mit Ausgabe der Syntaxbaueme     SS 2001, Prolog, H.Leiss
% ----------------------------------------------
%
% Jede Katergorie, cat, der Grammtik erhaelt ein (Ausgabe-)Argument:
%
%    cat(Baum)
%
% Die bisherigen Regeln der Form
%
%    cat --> cat1, cat2, cat3
%
% werden so uebersetzt, dass bei der linken Kategorie ein Syntaxbaum
% (als Prolog-Term) ausgegeben wird, der aus den Baeumen der rechten
% Kategorien zusammengesetzt wird, z.B.
%
%    cat(Baum) --> cat1(Baum1), cat2(Baum2), cat3(Baum3),
%                  { Baum = cat(Baum1,Baum2,Baum3) }. 
%
% Dasselbe koennen wir auch so angeben, dass der erzeugte Baum
% im Kopf der linken Kategorie angegeben wird:
% 
%    cat(cat(Baum1,Baum2,Baum3)) --> cat1(Baum1), cat2(Baum2), cat3(Baum3).
%        

s(S) --> np(NP), vp(VP), ['.'],
             {S = s(NP, VP)}.
np(NP) --> det(Det), n(N),
	     {NP = np(Det,N)}.

vp(vp(vtr(V),NP)) --> v(vtr(V)), np(NP).
vp(vp(vitr(V))) --> v(vitr(V)).

vp(FVG) --> fvg(FVG).
fvg(FVG) --> [bringt], np(NP), [zum,'Absturz'],
	     {FVG = vp(fv(bringt_zum_Absturz),NP)}.

det(Det) --> [der], {Det = det(der)}.
det(Det) --> [das], {Det = det(das)}.

n(n('Programmierer')) --> ['Programmierer'].
n(n('Programm')) --> ['Programm'].

v(vitr(steht)) --> [steht].
v(vtr(schrieb)) --> [schrieb].
v(vitr(schrieb)) --> [schrieb].


% Eingabe an der Konsole:

parse :-
	ensure_loaded('tokenizer.pro'),  % ggf. '<Pfadname>/tokenizer.pro'
	ensure_loaded('dottree.pro'),    % die Version mit eing. drawTree
	write(user,'Gib einen grammatisch korrekten Ausdruck ein! '),
	write(user,'(Eingabe mit einem Punkt beenden!)\n'),
	read_sentence(user,Sentence,[]),
	stringToAtoms(Sentence,Atomlist),
	(parse(Atomlist,Baum) ->
	    write(user,'Das war korrekt. '),
	    displayTree(Baum)
	; write(user,'Das war irgendwie nicht korrekt. ')),
	write(user,'Danke, das war alles.').


parse(Atome,Baum) :-
	s(Baum,Atome,[]).      % Der Satz endet mit dem Punkt am Ende.
parse(Atome,Baum) :-
	np(Baum,Atome,['.']).  % Der Endpunkt ist nicht Teil der NP.
parse(Atome,Baum) :-
	vp(Baum,Atome,['.']).
parse(Atome,Baum) :-
	n(Baum,Atome,['.']).
parse(Atome,Baum) :-
	v(Baum,Atome,['.']).
parse(Atome,Baum) :-
	det(Baum,Atome,['.']).

