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)
-
- database
- bekanntesIntegral(term,term,term)
-
- include "SIMPLE.PRO"
-
- /****************************************************************************/
- /* 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(Res,var(X),Ein) :-
- bound(Ein), bekanntesIntegral(Res,var(X),Ein), !.
- 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 bound(B) 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
- ! AND
- stammf_ableit(U,Nach,U_Strich) AND
- stammf_ableit(V,Nach,V_Strich).
- stammf_ableit(minus(U,V),Nach,minus(U_Strich,V_Strich)) IF
- ! AND
- stammf_ableit(U,Nach,U_Strich) AND
- stammf_ableit(V,Nach,V_Strich).
- stammf_ableit(mal(U,V),Nach,plus(mal(U,V_Strich),mal(U_Strich,V))) IF
- ! AND
- stammf_ableit(U,Nach,U_Strich) AND
- stammf_ableit(V,Nach,V_Strich).
- stammf_ableit(div(U,V),Nach,div(minus(mal(U_Strich,V),
- mal(U,V_Strich)), mal(V,V))) IF
- ! AND
- stammf_ableit(U,Nach,U_Strich) AND
- stammf_ableit(V,Nach,V_Strich).
-
- /******************************/
- /* Fuer Integration */
- /******************************/
-
- stammf_ableit(mal(nconst(X),U),Nach,mal(nconst(X),U_Strich)) IF
- ! AND stammf_ableit(U,Nach,U_Strich).
- stammf_ableit(mal(nconst(X),U),Nach,mal(U_Strich,nconst(X))) IF
- ! AND stammf_ableit(U,Nach,U_Strich).
- stammf_ableit(mal(const(X),U),Nach,mal(const(X),U_Strich)) IF
- ! AND stammf_ableit(U,Nach,U_Strich).
- stammf_ableit(mal(const(X),U),Nach,mal(U_Strich,const(X))) IF
- ! AND stammf_ableit(U,Nach,U_Strich).
- 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 ! AND stammf_ableit(Arg,Nach,Arg_Abl).
- stammf_ableit(npot(Arg,nconst(X)),Nach,
- mal(Arg_Abl,mal(nconst(X),npot(Arg,nconst(X_minus_1))))) IF
- ! AND X_minus_1 = X - 1 AND stammf_ableit(Arg,Nach,Arg_Abl).
- stammf_ableit(npot(Arg,X),Nach,
- mal(Arg_Abl,mal(X,npot(Arg,minus(X,nconst(1)))))) IF
- ! AND stammf_ableit(Arg,Nach,Arg_Abl).
- 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
- ! AND stammf_ableit(Arg,Nach,ArgAbl).
- stammf_ableit(funk(sqrt,Arg),Nach,
- mal(ArgAbl,div(nconst(0.5),funk(sqrt,Arg)))) IF
- ! AND stammf_ableit(Arg,Nach,ArgAbl).
- stammf_ableit(funk(exp,Arg),Nach,mal(Arg_Abl,funk(exp,Arg))) IF
- ! AND stammf_ableit(Arg,Nach,Arg_Abl).
- stammf_ableit(funk(sin,Arg),Nach,mal(Arg_Abl,funk(cos,Arg))) IF
- ! AND stammf_ableit(Arg,Nach,Arg_Abl).
- stammf_ableit(funk(cos,Arg),Nach,mal(Arg_Abl,mal(nconst(-1),
- funk(sin,Arg)))) IF
- ! AND stammf_ableit(Arg,Nach,Arg_Abl).
- stammf_ableit(funk(ln,Arg),Nach,mal(Arg_Abl,div(nconst(1),Arg))) IF
- ! AND stammf_ableit(Arg,Nach,Arg_Abl).
-
- /******************************/
- /* Und wieder die Integration */
- /******************************/
- 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(sin,Arg),ArgAbl),Nach,funk(cos,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 !.
-
- /****** 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 !.
-
-
-
-
- include "PARSER.PRO"
-
-
- /****************************************************************************/
- /** Das Hauptprogramm **/
- /****************************************************************************/
-
- predicates
- ableite(STRING,TokenListe,STRING)
- integ(STRING,TokenListe,STRING)
- start
- start2
- 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.
- /* Database abfragen */
- integ(FunkStr,VarListe,Nach) :-
- nl,nl, parse(FunkStr,VarListe,FL), vereinfache(FL,FLV),
- bekanntesIntegral(SF,var(Nach),FLV), !,
- parse(Stammf,[],SF),
- write(" Stammfunktion: "), write(Stammf),nl,
- write(">> Taste druecken <<"),readchar(_),
- nl,nl,nl.
- /* Ansonsten Database ergaenzen */
- integ(FunkStr,VarListe,Nach) :-
- nl,nl, parse(FunkStr,VarListe,FL), vereinfache(FL,FLV),
- stammf_ableit(SF,var(Nach),FLV),
- vereinfache(SF,SFV), !, assertz(bekanntesIntegral(SFV,var(Nach),FLV)),
- !,
- parse(Stammf,[],SFV),
- write(" Stammfunktion: "), write(Stammf),nl,
- write(">> Taste druecken <<"),readchar(_),
- nl,nl,nl.
-
-
- start :-
- consult("INTEGRAL.TAB"), start2.
-
- start2 :-
- 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), !, start2.
- start2 :-
- write("## FEHLER: Integraltabelle in Datei INTEGRAL.TAB fehlt ! ##").
-
- option('q') :- save("INTEGRAL.TAB"), exit.
- option('Q') :- option('q'), !.
-
- 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 !.
-
-