%% Einfache Komposita- und Derivationsanalyse
%% (c) Gerold Schneider
%% Aufrufsbeispiel: analyse("reisendendienst",_).

%% fźr ListenprŠdikate (wie z.B. append/3 und member/2)
:- use_module(library(lists)).

%% Anfragewrapper fźr Return und Ausgabe aller Ergebnisse	
analyse(Word, Results) :-
	simple_comp(Word,_,_,_,Results),
	format("~s :",[Word]),  % print Gesamtwort 
	writelistback(Results), nl, % print eine Analyse
	fail. % suche weitere Analysen
analyse(_,_). %last catchall => immer YES als Ausgabe

%% (END)FALL 1: Wort in Lexikon => Rekursionsabbruch
simple_comp(Word,_,_,Analyses,FinalAnalyses) :-
	lex(Word), % im Lexikon ?
	append([Word],Analyses,FinalAnalyses). % Einsammeln
	
%% FALL 2: Trenne vorderstes Wort ab, Rekursion
simple_comp(Word,First,Rest,Analyses,FA) :-
	append(First, Rest, Word), % Trenne Kandidaten ab
	lex(First), % Kandidat im Lexikon ?
	append([First],Analyses,NewAnalyses), % Einsammeln
	simple_comp(Rest,_,_,NewAnalyses,FA). % Rekursion
	
%% FALL 3: Fugenlaute eliminieren
simple_comp(WordFuge,Fuge,Word,Analyses,FA) :-
	append(Fuge,Word,WordFuge), % Fugenlaut abtrennen
	member(Fuge, ["s","n","en"]), % erlaubte Fuge ?
	simple_comp(Word,_,_,Analyses,FA). % Rekursion

%% Microlex	
lex("wirt").
lex("haus").
lex("frau").
lex("herr").
lex("schild").
lex("kršte").
lex("bier").
lex("reise").
lex("reisende").
lex("ende").
lex("reis").
lex("dienst").
lex("tran").
lex("sport").
lex("trans").
lex("port").
lex("abt").
lex("ei").
lex("lungen"). % plural - Vollformenlex
lex("abtei").
lex("abteilungen"). % plural
lex("gen").
lex("eigen").
lex("tum").
lex("heit").
lex("keit").
lex("er").

%%HilfsprŠdikate
	
writelist([]).
writelist([F|R]) :-
	nonvar(F),
	format(" ~s",[F]),
	writelist(R).
	
writelistback([]).
writelistback([F|R]) :-
	nonvar(F),
	writelistback(R),
	format(" ~s",[F]).
