home *** CD-ROM | disk | FTP | other *** search
Prolog Source | 1987-06-10 | 15.6 KB | 321 lines |
- /****************************************************************************/
- /** PARSER **/
- /** **/
- /** PREDIKAT: parse(STRING,TokenListe,term) **/
- /** VORAUSSETZUNGEN: DOMAIN term **/
- /** Uebersetzt einen Funktionsterm in einem String in eine Baumnotation **/
- /** Tokenliste enthaelt die gewuenschten Variablen **/
- /****************************************************************************/
-
- domains
- TokenListe = STRING*
-
- predicates
- replace(Term,TokenListe,Term) /* Tauscht Pseudovariablen
- gegen Konstanten aus */
- zaehle_Token(TokenListe,STRING,INTEGER) /* Vorkommen eines Zeich. zaehlen */
- member(STRING,TokenListe) /* Zeichen in Liste enthalten ? */
- richtiger_Term(TokenListe)
- entferne_Leerzeichen(STRING,STRING)
- string_tokenliste(STRING,TokenListe) /* Wandelt String in Tokenliste um */
- aeussere_Klammern(TokenListe,TokenListe,TokenListe) /* Entfernt aeussere
- Klammern und gibt Argument und Rest hinter Klammer zurueck.
- Benutzt rechte_Klammer */
- rechte_Klammer(TokenListe,INTEGER,TokenListe,TokenListe)
- ordne_vorne(TokenListe,TokenListe) /* Fuehrende - und + beruecksichtigen */
- tokenliste_term(TokenListe,term) /* Wandelt Tokenliste in Term um */
- verknuepf(term,STRING,term,term) /* Verkn. zwei Terme ueber einen Funktor */
- append(TokenListe,TokenListe,TokenListe) /* Verkettet Listen */
- parse(STRING,TokenListe,term) /* parsed einen String zu einen Term */
- split_in_two(TokenListe,TokenListe,TokenListe)
- /* Teilt eine Tokenliste an einem Komma in zwei Listen auf */
-
- /* Die folgenden Pred. pruefen, ob ein Zeichen ein bestimmter Operator ist */
- ist_Strichop(STRING)
- ist_Punktop(STRING)
- ist_Op(STRING)
- ist_Klammer(String)
-
- /* Diese pruefen die Zugehoerigkeit von Funktoren zu bestimmten Gruppen */
- ist_Strichfunk(term)
- ist_Punktfunk(term)
- ist_dual_funk(term) /* Funktor mit zwei Argumenten */
-
- /* Aufspaltung in Teile die nur mit Punkt- bzw. Strichliste */
- split_in_P_Liste(TokenListe,term)
- split_in_S_Liste(TokenListe,term)
- ist_iso_term(TokenListe) /* Abgeschlossener Term ? */
-
-
- clauses
- parse(S,VL,T) IF
- bound(S) AND entferne_leerzeichen(S,NS), string_tokenliste(NS,TL),
- ordne_vorne(TL,NTL), tokenliste_term(NTL,TT) AND replace(TT,VL,T) AND !.
- parse(S,_,T) IF
- free(S) AND tokenliste_term(TL,T) AND string_tokenliste(S,TL) AND !.
-
- replace(var(A),VarListe,var(A)) IF member(A,VarListe) AND !.
- replace(var(A),_,const(A)) IF !.
- replace(nconst(A),_,nconst(A)) IF !.
- replace(plus(A,B),VarListe,plus(AN,BN)) IF
- replace(A,VarListe,AN) AND replace(B,VarListe,BN) AND !.
- replace(minus(A,B),VarListe,minus(AN,BN)) IF
- replace(A,VarListe,AN) AND replace(B,VarListe,BN) AND !.
- replace(mal(A,B),VarListe,mal(AN,BN)) IF
- replace(A,VarListe,AN) AND replace(B,VarListe,BN) AND !.
- replace(div(A,B),VarListe,div(AN,BN)) IF
- replace(A,VarListe,AN) AND replace(B,VarListe,BN) AND !.
- replace(funk(N,Arg),VarListe,funk(N,ArgN)) IF
- replace(Arg,VarListe,ArgN) AND !.
- replace(npot(A,B),VarListe,npot(AN,BN)) IF
- replace(A,VarListe,AN) AND replace(B,VarListe,BN) AND !.
-
- /* anstaendiger Term ? */
- tokenliste_term(TokenListe,_) :-
- BOUND(TokenListe) AND NOT(richtiger_Term(TokenListe)) AND ! AND FAIL.
-
- /* atomare Terme parsen */
- tokenliste_term([Token],nconst(X)) :- bound(Token), str_real(Token,X) AND !.
- tokenliste_term([Token],nconst(X)) :- bound(X), str_real(Token,X) AND !.
- tokenliste_term([Token],var(Token)) :- bound(Token), isname(Token) AND !.
- tokenliste_term([Token],const(Token)) :- bound(Token), isname(Token) AND !.
-
- /* Vorne ein bisschen ordnen */
- tokenliste_term(["-",Atom],Res) :-
- BOUND(Atom) AND concat("-",Atom,Arg),
- tokenliste_term([Arg],Res) AND !.
-
- /* Klammerterme parsen: Endstaendig oder in Funktionen */
- tokenliste_term(["("|T],Res) IF
- BOUND(T) AND aeussere_Klammern(["("|T],NArg,[]) AND
- tokenliste_term(NArg,Res) AND !.
- tokenliste_term(["("|T],Res) IF
- BOUND(T) AND aeussere_Klammern(["("|T],NArg,[Op|Rest]) AND
- string_tokenliste(Str1,["("|NArg]) AND concat(Str1,")",Str2) AND
- tokenliste_term([Str2,Op|Rest],Res) AND !.
-
- /* Funktionen parsen: endstaendig oder in Term */
- tokenliste_term([Name,"("|Arg_u_Klamm],funk(Name,FunkArg)) IF
- BOUND(Name) AND BOUND(Arg_u_Klamm) AND
- member(Name,[sqr,sqrt,arctan,arcsin,arccos,tan,sin,cos,ln,exp]),
- aeussere_Klammern(["("|Arg_u_Klamm],Arg,[]) AND
- tokenliste_term(Arg,FunkArg) AND !.
- tokenliste_term([Name,"("|Arg_u_Klamm],Res) IF
- BOUND(Name) AND BOUND(Arg_u_Klamm) AND
- member(Name,[sqr,sqrt,arctan,arcsin,arccos,tan,sin,cos,ln,exp]),
- aeussere_Klammern(["("|Arg_u_Klamm],Arg,Rest) AND
- string_tokenliste(Str1,[Name,"("|Arg]) AND concat(Str1,")",Str2) AND
- tokenliste_term([Str2|Rest],Res) AND !.
-
- /* Potenzen analog Funktionen */
- tokenliste_term([pot,"("|Arg_u_Klamm],npot(FunkArg1,FunkArg2)) IF
- BOUND(Arg_u_Klamm),
- aeussere_Klammern(["("|Arg_u_Klamm],Arg,[]), split_in_two(Arg,Arg1,Arg2),
- tokenliste_term(Arg1,FunkArg1), tokenliste_term(Arg2,FunkArg2) AND !.
- tokenliste_term([pot,"("|Arg_u_Klamm],Res) IF
- BOUND(Arg_u_Klamm),
- aeussere_Klammern(["("|Arg_u_Klamm],Arg,Rest),
- string_tokenliste(Str1,[pot,"("|Arg]) AND concat(Str1,")",Str2) AND
- tokenliste_term([Str2|Rest],Res) AND !.
-
- /* Aufspaltung in Punktrechnungs- und Strichrechnungsterme */
- tokenliste_term(L,Res) IF BOUND(L) AND split_in_P_Liste(L,Res) AND !.
- tokenliste_term(L,Res) IF BOUND(L) AND split_in_S_Liste(L,Res) AND !.
-
- /************************************************/
- /* Und hier die Klauseln fuer rechts ---> links */
- /************************************************/
-
- tokenliste_term(FunkTerm,funk(FName,FunkArg)) IF /*****/
- BOUND(FunkArg) AND BOUND(FNAME) AND tokenliste_term(NFunkArg,FunkArg),
- append([FName,"("],NFunkArg,Res1), append(Res1,[")"],FunkTerm) AND !.
- tokenliste_term(FunkTerm,npot(Basis,Exp)) IF /*****/
- BOUND(Basis) AND BOUND(Exp) AND tokenliste_term(Term1,Basis),
- tokenliste_term(Term2,Exp), append([pot,"("],Term1,Res1),
- append(Res1,[","|Term2],Res2), append(Res2,[")"],FunkTerm) AND !.
- tokenliste_term(XL,minus(nconst(0),X)) IF tokenliste_term(XL,X) AND !.
-
- /* Division durch nicht geschlossenen Term */
- tokenliste_term(StrL,div(A,B)) IF
- BOUND(A) AND BOUND(B) AND not(ist_Strichfunk(A)) AND ist_dual_Funk(B)
- AND tokenliste_term(AL,A) AND tokenliste_term(BL,B) AND
- append(AL,["/","("|BL],L1) AND append(L1,[")"],StrL) AND !.
-
- /* Punktrechnung mit Strichrechnung verknuepft */
- tokenliste_term(StrL,div(A,B)) IF
- BOUND(A) AND BOUND(B) AND ist_Strichfunk(A) AND ist_Strichfunk(B) AND
- tokenliste_term(AL,A) AND tokenliste_term(BL,B)
- AND append(["("|AL],[")","/","("|BL],L1)
- AND append(L1,[")"],StrL) AND !.
- tokenliste_term(StrL,mal(A,B)) IF
- BOUND(A) AND BOUND(B) AND ist_Strichfunk(A) AND ist_Strichfunk(B) AND
- tokenliste_term(AL,A) AND tokenliste_term(BL,B) AND
- append(["("|AL],[")","*","("|BL],L1) AND append(L1,[")"],StrL) AND !.
-
- /* Punktrechnung mit einem Strichrechnungsterm verknuepft */
- tokenliste_term(StrL,div(A,B)) IF
- BOUND(A) AND BOUND(B) AND ist_Strichfunk(A) AND tokenliste_term(AL,A)
- AND tokenliste_term(BL,B) AND append(["("|AL],[")","/"|BL],StrL) AND !.
- tokenliste_term(StrL,mal(A,B)) IF
- BOUND(A) AND BOUND(B) AND ist_Strichfunk(A)
- AND tokenliste_term(AL,A) AND tokenliste_term(BL,B)
- AND append(["("|AL],[")","*"|BL],StrL) AND !.
- tokenliste_term(StrL,mal(A,B)) IF
- BOUND(A) AND BOUND(B) AND ist_Strichfunk(B)
- AND tokenliste_term(AL,A) AND tokenliste_term(BL,B)
- AND append(AL,["*","("|BL],StrL1) AND
- append(StrL1,[")"],StrL) AND !.
-
- /* Division durch geschlossenen Term */
- tokenliste_term(StrL,div(A,B)) IF
- BOUND(A) AND BOUND(B) AND tokenliste_term(AL,A)
- AND tokenliste_term(BL,B) AND append(AL,["/"|BL],StrL) AND !.
-
- /* Minus Strichrechnungsterm */
- tokenliste_term(StrL,minus(A,B)) IF
- BOUND(A) AND BOUND(B) AND ist_Strichfunk(B)
- AND tokenliste_term(AL,A) AND tokenliste_term(BL,B)
- AND append(AL,[" - ","("|BL],L1) AND append(L1,[")"],StrL) AND !.
-
- /* Minus anderen Term */
- tokenliste_term(StrL,minus(A,B)) IF
- BOUND(A) AND BOUND(B) AND tokenliste_term(AL,A) AND
- tokenliste_term(BL,B) AND append(AL,[" - "|BL],StrL) AND !.
-
- /* Allgemeine Faelle */
- tokenliste_term(StrL,plus(A,B)) IF
- BOUND(A) AND BOUND(B) AND tokenliste_term(AL,A)
- AND tokenliste_term(BL,B) AND append(AL,[" + "|BL],StrL) AND !.
- tokenliste_term(StrL,mal(A,B)) IF
- BOUND(A) AND BOUND(B) AND tokenliste_term(AL,A)
- AND tokenliste_term(BL,B) AND append(AL,["*"|BL],StrL) AND !.
- tokenliste_term(StrL,div(A,B)) IF
- BOUND(A) AND BOUND(B) AND tokenliste_term(AL,A)
- AND tokenliste_term(BL,B) AND append(AL,["/"|BL],StrL) AND !.
-
- verknuepf(Term1,"+",Term2,plus(Term1,Term2)) IF !.
- verknuepf(Term1,"-",Term2,minus(Term1,Term2)) IF !.
- verknuepf(Term1,"*",Term2,mal(Term1,Term2)) IF !.
- verknuepf(Term1,"/",Term2,div(Term1,Term2)) IF !.
-
- append([],List,List) IF !.
- append([X|L1], List2, [X|L3]) IF append(L1,List2,L3).
-
- split_in_two([","|T],[],T) IF !.
- split_in_two([H|T],[H|N1],N2) IF split_in_two(T,N1,N2) AND !.
-
- ist_Strichop(" + "). ist_Strichop("-").
- ist_Punktop("*"). ist_Punktop("/").
- ist_Op(Op) IF ist_Strichop(Op) AND ! OR ist_Punktop(OP) AND !.
-
- ist_Strichfunk(plus(_,_)). ist_Strichfunk(minus(_,_)).
-
- ist_Punktfunk(mal(_,_)). ist_Punktfunk(div(_,_)).
-
- ist_dual_funk(Funktor) IF
- ist_Strichfunk(Funktor) AND ! OR ist_Punktfunk(Funktor) AND !.
-
- /* Dokumentation der Termaufspaltung im Begleitartikel */
- split_in_P_Liste([Front,Op,Last],Res) IF
- ist_Punktop(Op) AND string_tokenliste(Front,FrontL) AND
- tokenliste_term(FrontL,FrontT) AND tokenliste_term([Last],LastT) AND
- verknuepf(FrontT,Op,LastT,Res) AND !.
- split_in_P_Liste([Front,Op|Tail],Res) IF
- ist_Punktop(Op) AND ist_iso_term(Tail) AND string_tokenliste(Front,FrontL)
- AND tokenliste_term(FrontL,FrontT) AND tokenliste_term(Tail,TailT)
- AND verknuepf(FrontT,Op,TailT,Res) AND !.
- split_in_P_Liste([Front,"+",Third|Tail],Res) IF
- string_tokenliste(Front,FrontL) AND tokenliste_term(FrontL,FrontT) AND
- tokenliste_term([Third|Tail],TailT) AND verknuepf(FrontT,"+",TailT,Res)
- AND !.
- split_in_P_Liste([Front,"-",Third|Tail],Res) IF
- string_tokenliste(Front,FrontL) AND tokenliste_term(FrontL,FrontT) AND
- tokenliste_term([Third|Tail],TailT) AND NOT(ist_Strichfunk(TailT)) AND
- verknuepf(FrontT,"-",TailT,Res) AND !.
- split_in_P_Liste([Front,Op,Third|Tail],Res) IF
- ist_Op(Op) AND bound(Third) AND not(ist_Klammer(Third)) AND
- not(member(Third,[sqr,sqrt,arctan,arcsin,arccos,tan,sin,cos,ln,exp,pot]))
- AND string_tokenliste(NFront,[Front,Op,Third]) AND
- tokenliste_term([NFront|Tail],Res) AND !.
- split_in_P_Liste([Front,Op,Third|Tail],Res) IF
- ist_Op(Op) AND bound(Third) AND
- member(Third,[sqr,sqrt,arctan,arcsin,arccos,tan,sin,cos,ln,exp,pot]) AND
- aeussere_Klammern(Tail,Arg,Rest) AND
- string_Tokenliste(Front1,[Front,Op,Third,"("|Arg]) AND
- concat(Front1,")",NFront) AND tokenliste_term([NFront|Rest],Res) AND !.
- split_in_P_Liste([Front,Op,Third|Tail],Res) IF
- ist_Op(Op) AND bound(Third) AND ist_Klammer(Third) AND
- aeussere_Klammern([Third|Tail],Arg,Rest),
- string_tokenliste(Str1,[Front,Op,Third|Arg]), concat(Str1,")",NFront),
- tokenliste_term([NFront|Rest],Res) AND !.
- split_in_P_Liste([Front,Op,Tail],Res) IF
- ist_Op(Op) AND string_tokenliste(Front,FrontL) AND
- tokenliste_term(FrontL,FrontT) AND tokenliste_term([Tail],TailT) AND
- verknuepf(FrontT,Op,TailT,Res) AND !.
-
- split_in_S_Liste([Front,Op,Last],Res) IF
- ist_Strichop(Op) AND string_tokenliste(Front,FrontL) AND
- split_in_S_Liste(FrontL,FrontT) AND tokenliste_term([Last],LastT) AND
- verknuepf(FrontT,Op,LastT,Res) AND !.
- split_in_S_Liste([Front,Op|Tail],Res) IF
- ist_Strichop(Op) AND ist_iso_term(Tail)
- AND string_tokenliste(Front,FrontL) AND tokenliste_term(FrontL,FrontT)
- AND tokenliste_term(Tail,TailT) AND verknuepf(FrontT,Op,TailT,Res) AND !.
- split_in_S_Liste([Front,Op,Third|Tail],Res) IF
- ist_Op(Op) AND bound(Third) AND not(ist_Klammer(Third)) AND
- string_tokenliste(NFront,[Front,Op,Third]) AND
- tokenliste_term([NFront|Tail],Res) AND !.
-
- ist_iso_term(["("|T]) IF BOUND(T) AND aeussere_Klammern(["("|T],_,[]) AND !.
- ist_iso_term([Name,"("|Arg_u_Klamm]) IF
- BOUND(Name) AND BOUND(Arg_u_Klamm) AND
- member(Name,[sqr,sqrt,arctan,arcsin,arccos,tan,sin,cos,ln,exp]),
- aeussere_Klammern(["("|Arg_u_Klamm],_,[]) AND !.
- ist_iso_term([pot,"("|Arg_u_Klamm]) IF
- BOUND(Arg_u_Klamm), aeussere_Klammern(["("|Arg_u_Klamm],_,[]) AND !.
- ist_Klammer("("). ist_Klammer(")").
-
- entferne_Leerzeichen(E_String,A_String) :-
- fronttoken(E_String,Token,Rest) AND /* Token vorhanden ?! */
- entferne_Leerzeichen(Rest,A_Rest), concat(Token,A_Rest,A_String) AND !.
- entferne_Leerzeichen(_,"") IF !.
-
- richtiger_Term(TokenListe) :- /* Anzahl oeffnender Klammern
- = schliessender ? */
- zaehle_Token(TokenListe,"(",Anzahl) AND
- zaehle_Token(TokenListe,")",Anzahl) AND !.
-
- zaehle_Token([],_,0) IF !.
- zaehle_Token([Token|RestList],Token,Aus) IF
- zaehle_Token(RestList,Token,Aus1), Aus = Aus1 + 1 AND !.
- zaehle_Token([_|Tail],Token,Aus) IF zaehle_Token(Tail,Token,Aus) AND !.
-
- String_TokenListe("",[]) :- !.
- String_TokenListe(Str,[H|T]) :-
- BOUND(Str) AND fronttoken(Str,H,Rest)
- AND String_TokenListe(Rest,T) AND !.
- String_TokenListe(Str,[H|T]) :-
- BOUND(H) AND BOUND(T) AND String_TokenListe(Rest,T) AND
- fronttoken(Str,H,Rest) AND !.
-
- aeussere_Klammern(["("|T],NT,Rest) IF ! AND rechte_Klammer(T,1,NT,Rest).
- aeussere_Klammern(A,A,[]).
-
- rechte_Klammer(X,0,[],X) IF !.
- rechte_Klammer(X,0,[],Y) IF ! AND X = Y. /* Faile falls X <> Y */
- rechte_Klammer([")"|T],1,[],T) :- BOUND(T) AND !.
- rechte_Klammer(["("|T],Zaehler,["("|NT],Rest) IF ! AND
- Zaehler_1 = Zaehler + 1 AND rechte_Klammer(T,Zaehler_1,NT,Rest).
- rechte_Klammer([")"|T],Zaehler,[")"|NT],Rest) IF ! AND
- Zaehler_1 = Zaehler - 1 AND rechte_Klammer(T,Zaehler_1,NT,Rest).
- rechte_Klammer([H|T],Zaehler,[H|NT],Rest) IF ! AND
- bound(H) AND rechte_Klammer(T,Zaehler,NT,Rest).
-
- ordne_vorne(["+"|T],T) :- !.
- ordne_vorne(["-"|T],["0","-"|T]) :- !.
- ordne_vorne(A,A).
-
- member(X,[X|_]).
- member(X,[_|L]) :- member(X,L).
-
-