home *** CD-ROM | disk | FTP | other *** search
- code = 2900
- /****************************************************************************/
- /*Wichtiger Hinweis: Stackgroesse vor Programmlauf mit Setup-Menue so gross */
- /* wie moeglich einstellen !!!! */
- /****************************************************************************/
-
- /****************************************************************************/
- /** DEFINITION DER "WELT" **/
- /****************************************************************************/
-
- /* Erstmal erzaehlen wir ihm, wie mathematische Terme aussehen koennen, */
- /* wobei dieser Datentyp rekursiv ist. Siehe z.B. Grundrechenarten */
- domains
- term = /* atomare Groessen : symbolische Konstanten,
- numerische Konstanten
- und Variablen */
- const(STRING); nconst(REAL); var(STRING);
-
- /* Funktionen */
- funk(STRING,term);
- /* Grundrechenarten */
- plus(term,term); minus(term,term); mal(term,term); div(term,term);
- /* Potenzen mit konstantem Exponenten */
- npot(term,term)
-
- /* Hiernach wird abgeleitet */
- nach = var(STRING)
-
- /****************************************************************************/
- /* "VEREINFACHER" */
- /* */
- /* PREDIKAT: vereinfache(term,term) */
- /* VORAUSSETZUNGEN: DOMAIN term */
- /* Vereinfacht terme in der Baumnotation */
- /****************************************************************************/
- /* STEHT AUS DEKLARATIONSGRUENDEN VOR DEM ABLEITER/INTEGRATOR */
- predicates
- vereinfache(term,term)
- vereinfache1(term,term,term,INTEGER,INTEGER)
- vereinfache2(term,term)
- eq(term,term)
-
- clauses
- vereinfache(Term1,Term2) IF
- vereinfache2(Term1,Res) AND vereinfache1(Term1,Res,Term2,0,3) AND !.
- vereinfache1(LastTerm,NewTerm,ResTerm,Counter,End) IF
- Counter < End AND not(eq(LastTerm,NewTerm)) AND
- vereinfache2(NewTerm,Res) AND Counter1 = Counter + 1 AND
- vereinfache1(NewTerm,Res,ResTerm,Counter1,End) AND !.
- vereinfache1(_,Term,Term,_,_) IF !.
-
- /* Addition von numerischen Konstanten */
- vereinfache2(plus(nconst(A),nconst(B)),nconst(AB)) IF AB = A+B AND !.
- vereinfache2(minus(nconst(A),nconst(B)),nconst(AB)) IF AB = A-B AND !.
-
- /*hier folgen diverse Vereinfachungen */
- vereinfache2(mal(nconst(0),_),nconst(0)) IF !.
- vereinfache2(mal(_,nconst(0)),nconst(0)) IF !.
- vereinfache2(div(nconst(0),_),nconst(0)) IF !.
- vereinfache2(mal(nconst(1),A),AV) IF vereinfache2(A,AV) AND !.
- vereinfache2(mal(A,nconst(1)),AV) IF vereinfache2(A,AV) AND !.
- vereinfache2(div(X,nconst(1)),XV) IF vereinfache2(X,XV) AND !.
- vereinfache2(div(X,nconst(-1)),XV) IF
- vereinfache2(mal(nconst(-1),X),XV) AND !.
- vereinfache2(plus(nconst(0),A),AV) IF vereinfache2(A,AV) AND !.
- vereinfache2(plus(A,nconst(0)),AV) IF vereinfache2(A,AV) AND !.
- vereinfache2(minus(A,nconst(0)),AV) IF vereinfache2(A,AV) AND !.
- vereinfache2(minus(nconst(0),A),AV) IF
- vereinfache2(mal(nconst(-1),A),AV) AND !.
- vereinfache2(npot(_,nconst(0)),nconst(1)) IF !.
- vereinfache2(funk(exp,nconst(0)),nconst(1)) IF !.
- vereinfache2(npot(Arg,nconst(1)),ArgV) IF vereinfache2(Arg,ArgV) AND !.
- vereinfache2(npot(Arg,nconst(-1)),div(nconst(1),ArgV)) IF
- vereinfache2(Arg,ArgV) AND !.
- vereinfache2(npot(nconst(0),_),nconst(0)) IF !.
- vereinfache2(npot(A,nconst(2)),funk(sqr,AV)) IF vereinfache2(A,AV) AND !.
- vereinfache2(npot(nconst(1),_),nconst(1)) IF !.
- vereinfache2(npot(nconst(A),nconst(B)),nconst(C)) IF
- D = ln(A), E = D*B, C=exp(E) AND !.
- vereinfache2(npot(npot(X,A),B),npot(XV,mal(A,B))) IF
- vereinfache2(X,XV) AND !.
- vereinfache2(mal(A,B),npot(AV,nconst(2))) IF
- vereinfache2(A,AV) AND vereinfache2(B,BV) AND AV = BV AND !.
- vereinfache2(mal(A,npot(B,N)),npot(AV,plus(nconst(1),N))) IF
- vereinfache2(A,AV) AND vereinfache2(B,BV) AND AV = BV AND !.
- vereinfache2(mal(npot(B,N),A),npot(AV,plus(nconst(1),N))) IF
- vereinfache2(A,AV) AND vereinfache2(B,BV) AND AV = BV AND !.
- vereinfache2(div(A,npot(B,N)),div(nconst(1),
- npot(AV,plus(nconst(1),N)))) IF
- vereinfache2(A,AV) AND vereinfache2(B,BV) AND AV = BV AND !.
- vereinfache2(div(npot(B,N),A),npot(AV,minus(N,nconst(1)))) IF
- vereinfache2(A,AV) AND vereinfache2(B,BV) AND AV = BV AND !.
- vereinfache2(div(A,B),nconst(1)) IF
- vereinfache2(A,AV) AND vereinfache2(B,BV) AND AV = BV AND !.
- vereinfache2(minus(A,B),nconst(0)) IF
- vereinfache2(A,AV) AND vereinfache2(B,BV) AND AV = BV AND !.
-
- /* Ein bisschen sortieren */
- vereinfache2(mal(nconst(A),mal(nconst(B),C)),R) IF
- vereinfache2(mal(nconst(A),nconst(B)),AB) AND vereinfache2(C,CV) AND
- vereinfache2(mal(AB,CV),Res) AND R = Res AND !.
- vereinfache2(mal(nconst(A),mal(B,nconst(C))),R) IF
- vereinfache2(mal(nconst(A),nconst(C)),AC) AND vereinfache2(B,BV) AND
- vereinfache2(mal(AC,BV),Res) AND R = Res AND !.
- vereinfache2(mal(A,mal(nconst(B),nconst(C))),R) IF
- vereinfache2(mal(nconst(B),nconst(C)),BC) AND vereinfache2(A,AV) AND
- vereinfache2(mal(AV,BC),Res) AND R = Res AND !.
-
- /* Zusammenziehen von Termen */
- vereinfache2(npot(Basis,Exp),npot(BasisV,ExpV)) IF
- vereinfache2(Basis,BasisV) AND vereinfache2(Exp,ExpV) AND !.
- vereinfache2(mal(nconst(A),nconst(B)),nconst(AB)) IF AB = A * B AND !.
- vereinfache2(plus(A,B),mal(nconst(2),AV)) IF
- vereinfache2(A,AV) and vereinfache2(B,BV) AND AV = BV AND !.
- vereinfache2(plus(A,mal(N,B)),mal(plus(nconst(1),N),AV)) IF
- vereinfache2(A,AV) and vereinfache2(B,BV) AND AV = BV AND !.
- vereinfache2(plus(mal(N,B),A),mal(plus(nconst(1),N),AV)) IF
- vereinfache2(A,AV) and vereinfache2(B,BV) AND AV = BV AND !.
- vereinfache2(minus(A,mal(N,B)),mal(plus(nconst(1),N),AV)) IF
- vereinfache2(A,AV) and vereinfache2(B,BV) AND AV = BV AND !.
- vereinfache2(minus(mal(N,B),A),mal(minus(N,nconst(1)),AV)) IF
- vereinfache2(A,AV) and vereinfache2(B,BV) AND AV = BV AND !.
-
- /* Noch ein bisschen sortieren */
- vereinfache2(plus(A,plus(B,C)),plus(Res1,C)) IF
- vereinfache2(plus(A,B),Res1) AND !.
- vereinfache2(plus(A,plus(B,C)),plus(Res1,B)) IF
- vereinfache2(plus(A,C),Res1) AND !.
- vereinfache2(plus(plus(B,C),A),plus(Res1,C)) IF
- vereinfache2(plus(A,B),Res1) AND !.
- vereinfache2(plus(plus(B,C),A),plus(Res1,B)) IF
- vereinfache2(plus(A,C),Res1) AND !.
- vereinfache2(mal(A,nconst(X)),mal(nconst(X),AV)) IF
- vereinfache2(A,AV) AND !.
- vereinfache2(mal(A,mal(nconst(X),B)),mal(nconst(X),mal(AV,BV))) IF
- vereinfache2(A,AV) AND vereinfache2(B,BV) AND !.
-
- /* Allgemeine Faelle */
- vereinfache2(div(A,B),div(AV,BV)) IF
- vereinfache2(A,AV) and vereinfache2(B,BV) AND !.
- vereinfache2(plus(A,B),plus(AV,BV)) IF
- vereinfache2(A,AV) and vereinfache2(B,BV) AND !.
- vereinfache2(minus(A,B),minus(AV,BV)) IF
- vereinfache2(A,AV) and vereinfache2(B,BV) AND !.
- vereinfache2(mal(A,B),mal(AV,BV)) IF
- vereinfache2(A,AV) and vereinfache2(B,BV) AND !.
-
- vereinfache2(A,A) :- !. /* Terminiere */
-
- eq(Term,Term).
-
-
- /****************************************************************************/
- /* ABLEITER/INTEGRATOR */
- /* */
- /* PREDIKAT: stammf_ableit(term,nach,term) */
- /* VORAUSSETZUNGEN : DOMAINS term,nach */
- /* Bildet, je nachdem in welcher Richtung es angewendet wird, die Ableitung */
- /* oder Stammfunktion eines terms in der Baumnotation */
- /****************************************************************************/
-
- predicates
- stammf_ableit(term,nach,term)
- part_I(term,nach,term)
-
- clauses
- /* Hier bringen wir ihm Ableitungen und Stammfunktionen bei. Die Regeln */
- /* die nur geschrieben wurden, um die Richtung Ableitung --> Stamm- */
- /* funktion abzudecken, sind mit /*****/ gekennzeichnet. */
-
- /* Konstanten */
- stammf_ableit(const(A),_,nconst(0)) IF bound(A) AND !.
- stammf_ableit(const(const),_,nconst(0)) IF !. /*****/
- stammf_ableit(nconst(A),_,nconst(0)) IF bound(A) AND !.
- /* Variablen */
- stammf_ableit(var(Name),var(Name),nconst(1)) IF !.
- stammf_ableit(var(A),var(B),nconst(0)) IF bound(A) AND A <> B AND !.
- stammf_ableit(mal(const(C),var(A)),var(A),const(C)) IF /*****/
- bound(C) AND !.
- stammf_ableit(mal(nconst(C),var(A)),var(A),nconst(C)) IF /*****/
- bound(C) AND !.
- /* Zweistellige Operatoren */
- stammf_ableit(plus(U,V),Nach,plus(U_Strich,V_Strich)) IF
- stammf_ableit(U,Nach,U_Strich) AND
- stammf_ableit(V,Nach,V_Strich) AND !.
- stammf_ableit(minus(U,V),Nach,minus(U_Strich,V_Strich)) IF
- stammf_ableit(U,Nach,U_Strich) AND
- stammf_ableit(V,Nach,V_Strich) AND !.
- stammf_ableit(mal(U,V),Nach,plus(mal(U,V_Strich),mal(U_Strich,V))) IF
- stammf_ableit(U,Nach,U_Strich) AND
- stammf_ableit(V,Nach,V_Strich) AND !.
- stammf_ableit(div(U,V),Nach,div(minus(mal(U_Strich,V),
- mal(U,V_Strich)), mal(V,V))) IF
- stammf_ableit(U,Nach,U_Strich) AND
- stammf_ableit(V,Nach,V_Strich) AND !.
-
- /******************************/
- /* Fuer Integration */
- /******************************/
-
- stammf_ableit(mal(nconst(X),U),Nach,mal(nconst(X),U_Strich)) IF
- stammf_ableit(U,Nach,U_Strich) AND !.
- stammf_ableit(mal(nconst(X),U),Nach,mal(U_Strich,nconst(X))) IF
- stammf_ableit(U,Nach,U_Strich) AND !.
- stammf_ableit(mal(const(X),U),Nach,mal(const(X),U_Strich)) IF
- stammf_ableit(U,Nach,U_Strich) AND !.
- stammf_ableit(mal(const(X),U),Nach,mal(U_Strich,const(X))) IF
- stammf_ableit(U,Nach,U_Strich) AND !.
- stammf_ableit(div(npot(var(X),nconst(2)),nconst(2)),var(X),var(X)) IF !.
-
- /* natuerliche Potenzen */
- stammf_ableit(npot(Arg,nconst(1)),Nach,Arg_Abl)
- IF FREE(Arg_Abl) AND stammf_ableit(Arg,Nach,Arg_Abl) AND !.
- stammf_ableit(npot(Arg,nconst(X)),Nach,
- mal(Arg_Abl,mal(nconst(X),npot(Arg,nconst(X_minus_1))))) IF
- X_minus_1 = X - 1 AND stammf_ableit(Arg,Nach,Arg_Abl) AND !.
- stammf_ableit(npot(Arg,X),Nach,
- mal(Arg_Abl,mal(X,npot(Arg,minus(X,nconst(1)))))) IF
- stammf_ableit(Arg,Nach,Arg_Abl) AND !.
- stammf_ableit(div(npot(var(X),plus(Exp,nconst(1))),Exp),var(X),
- npot(var(X),Exp)) IF !.
-
- /* Ableitung von Funktionen ---> innere mal aeussere Ableitung */
- stammf_ableit(funk(sqr,Arg),Nach,mal(mal(nconst(2),ArgAbl),Arg)) IF
- stammf_ableit(Arg,Nach,ArgAbl) AND !.
- stammf_ableit(funk(sqrt,Arg),Nach,
- mal(ArgAbl,div(nconst(0.5),funk(sqrt,Arg)))) IF
- stammf_ableit(Arg,Nach,ArgAbl) AND !.
- stammf_ableit(funk(exp,Arg),Nach,mal(Arg_Abl,funk(exp,Arg))) IF
- stammf_ableit(Arg,Nach,Arg_Abl) AND !.
- stammf_ableit(funk(sin,Arg),Nach,mal(Arg_Abl,funk(cos,Arg))) IF
- stammf_ableit(Arg,Nach,Arg_Abl) AND !.
- stammf_ableit(funk(cos,Arg),Nach,mal(Arg_Abl,mal(nconst(-1),
- funk(sin,Arg)))) IF
- stammf_ableit(Arg,Nach,Arg_Abl).
- stammf_ableit(funk(ln,Arg),Nach,mal(Arg_Abl,div(nconst(1),Arg))) IF
- stammf_ableit(Arg,Nach,Arg_Abl) AND !.
-
- /******************************/
- /* Und wieder die Integration */
- /******************************/
- stammf_ableit(div(funk(sin,Arg),ArgAbl),Nach,funk(cos,Arg)) IF
- stammf_ableit(Arg,Nach,ArgAbl) AND !.
- stammf_ableit(mal(nconst(-1),div(funk(cos,Arg),ArgAbl)),
- Nach,funk(sin,Arg)) IF
- stammf_ableit(Arg,Nach,ArgAbl) AND !.
- stammf_ableit(div(funk(exp,Arg),ArgAbl),Nach,funk(exp,Arg)) IF
- stammf_ableit(Arg,Nach,ArgAbl) AND !.
- stammf_ableit(div(npot(Arg,nconst(1.5)),mal(nconst(2),ArgAbl)),Nach,
- funk(sqrt,Arg)) IF
- stammf_ableit(Arg,Nach,ArgAbl) AND !.
- stammf_ableit(div(npot(Arg,nconst(3)),mal(nconst(3),ArgAbl)),Nach,
- funk(sqr,Arg)) IF
- stammf_ableit(Arg,Nach,ArgAbl) AND !.
- stammf_ableit(mal(nconst(X),div(funk(ln,Arg),ArgAbl)),Nach,
- div(nconst(X),Arg)) IF
- stammf_ableit(Arg,Nach,ArgAbl) AND !.
- stammf_ableit(mal(const(X),div(funk(ln,Arg),ArgAbl)),Nach,
- div(const(X),Arg)) IF
- stammf_ableit(Arg,Nach,ArgAbl) AND !.
-
- /***********************************************************************/
- /* Hierhin sollte man eine Haufen Integrale schreiben, um dem Programm */
- /* das Leben leichter zu machen !. */
- /***********************************************************************/
-
- stammf_ableit(div(funk(sqr,funk(sin,Arg)),mal(nconst(2),ArgAbl)),Nach,
- mal(funk(sin,Arg),funk(cos,Arg))) IF
- stammf_ableit(Arg,Nach,ArgAbl) AND !.
- stammf_ableit(div(funk(sqr,funk(sin,Arg)),mal(nconst(2),ArgAbl)),Nach,
- mal(funk(cos,Arg),funk(sin,Arg))) IF
- stammf_ableit(Arg,Nach,ArgAbl) AND !.
-
- /****** PARTIELLE INTEGRATION ******/
- stammf_ableit(Res,Nach,mal(A,B)) IF part_I(mal(A,B),Nach,Res) AND !.
-
- part_I(mal(U,V_Strich),Nach,minus(mal(U,V),I)) IF
- stammf_ableit(V,Nach,V_Strich) AND stammf_ableit(U,Nach,U_Strich) AND
- vereinfache(mal(V,U_Strich),Res1) AND stammf_ableit(I,Nach,Res1) AND !.
- part_I(mal(V_Strich,U),Nach,minus(mal(U,V),I)) IF
- stammf_ableit(V,Nach,V_Strich) AND stammf_ableit(U,Nach,U_Strich) AND
- vereinfache(mal(V,U_Strich),Res1) AND stammf_ableit(I,Nach,Res1) AND !.
-
-
- /****************************************************************************/
- /** 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).
-
-
-
-
- /****************************************************************************/
- /** Das Hauptprogramm **/
- /****************************************************************************/
-
- predicates
- ableite(STRING,TokenListe,STRING)
- integ(STRING,TokenListe,STRING)
- start
- option(CHAR)
-
- GOAL START.
-
- clauses
- ableite(FunkStr,VarListe,Nach) :-
- nl, nl, parse(FunkStr,VarListe,FL), vereinfache(FL,FLV),
- stammf_ableit(FLV,var(Nach),AblL), vereinfache(AblL,AblV),
- parse(Ableitung,[],AblV), nl, nl,
- write(" Ableitung: "), write(Ableitung),nl,
- write(">> Taste druecken <<"),readchar(_),
- nl,nl,nl.
- integ(FunkStr,VarListe,Nach) :-
- nl,nl, parse(FunkStr,VarListe,FL), vereinfache(FL,FLV),
- stammf_ableit(SF,var(Nach),FLV),
- vereinfache(SF,SFV), parse(Stammf,[],SFV),
- write(" Stammfunktion: "), write(Stammf),nl,
- write(">> Taste druecken <<"),readchar(_),
- nl,nl,nl.
-
- start :-
- makewindow(1,7,112,"NEWTON - Integration und Differenzierung",0,0,25,80),
- clearwindow, nl, nl ,nl,
- write(" A)bleiten I)ntegrieren V)ereinfachen Q)uit"), nl, nl,
- write(" Ihre Wahl : "), readchar(Wahl), nl, nl,
- option(Wahl), start.
-
- option('q') :- exit.
- option('Q') :- exit.
-
- option('a') :-
- write(" Ihr Funktionsterm ? : "), readln(Str), nl,
- write(" Die gewuenschten Variablen ? (Durch Leerzeichen trennen) :"),
- readln(VarStr), nl, string_tokenliste(VarStr,VarL),
- write(" Nach welcher Variable ableiten ? : "), readln(DieVar), nl,
- ableite(Str,VarL,DieVar) AND !.
- option('A') :- option('a') AND !.
- option('i') :-
- write(" Ihr Funktionsterm ? : "), readln(Str), nl,
- write(" Die gewuenschten Variablen ? (Durch Leerzeichen trennen) :"),
- readln(VarStr), nl, string_tokenliste(VarStr,VarL),
- write(" Nach welcher Variable integrieren ? : "), readln(DieVar), nl,
- integ(Str,VarL,DieVar) AND !.
- option('I') :- option('i') AND !.
- option('v') :-
- write(" Ihr Funktionsterm ? : "), readln(Str), nl,
- parse(Str,[],Term), vereinfache(Term,Term2), parse(NStr,[],Term2),
- write(" Vereinfachter Term : "), write(NStr), nl, nl,
- write(">> Taste druecken <<"), readchar(_) AND !.
- option('V') :- option('v') AND !.
-
- option(_) :-
- write(">>>> Berechnung nicht moeglich oder Fehler bei Eingabe <<<<"),
- nl, write(">> Taste druecken <<"), readchar(_)
- AND !.
-
-
-