1
2
3
4
5
6
7
8
9
10
11
12
13
|
PACKETabbildungDEFINES ABBILDUNG,abbildungsterme,abbildungsvariablen,abbildung,neueabbildung,adresse,variablenidentitaet,vergleichsfunktion,aufloesung,ergebnis,ergebnisvektor,result,ableitung,komplexefunktion,:=,+,-,*,/,O,newtonvorschrift,iterationsvorschrift,loeschebenannteabbildung,loeschetemporaereabbildung,loescheabbildung,ableitungsverbot,selektionshaltigetermliste:LETpisymbol="pi",allgemeinespotenzsymbol="**",speziellespotenzsymbol="^",multiplikationssymbol="*",divisionssymbol="/",verkettungssymbol="O",plussymbol="+",minussymbol="-",strichsymbol="'",kleinersymbol="<",kleinergleichsymbol="<=",ungleichsymbol="<>",gleichsymbol="=",groessergleichsymbol=">=",odersymbol="ODER",differenziersymbol="D",esymbol="e",sinussymbol="sin",cosinussymbol="cos",tangenssymbol="tan",cotangenssymbol="cot",arcussinussymbol="arcsin",arcuscosinussymbol="arccos",arcustangenssymbol="arctan",arcuscotangenssymbol="arccot",lnsymbol="ln",log2symbol="log2",log10symbol="log10",exponentialsymbol="exp",signumsymbol="sign",betragssymbol="abs",wurzelsymbol="wurzel",gaussklammersymbol="gauss",rundsymbol="rund",intsymbol="ganz",fracsymbol="frak",defaultfuervariablenindex=1,defaultfuerkomponentenindex=1;TYPE ABBILDUNG=STRUCT(LISTEvariablenliste,termliste);OP:=(ABBILDUNG VARlinks,ABBILDUNG CONSTrechts):CONCR(links):=CONCR(rechts)END OP:=;LISTE PROCabbildungsterme(ABBILDUNG CONSTf):f.termlisteEND PROCabbildungsterme;LISTE PROCabbildungsvariablen(ABBILDUNG CONSTf):f.variablenlisteEND PROCabbildungsvariablen;ABBILDUNG PROCabbildung(TERM CONSTterm):IF NOT(termISfunktionsdefinition)THENerrorstop(anwendungstext(1))END IF;funktion(neueliste(LISTENANFANG VARIABLENterm,LISTENENDE VARIABLENterm),neueliste(LISTENANFANG TERMEterm,LISTENENDE TERMEterm))END PROCabbildung;ABBILDUNG PROCabbildung(TEXT CONSTabbildungsname):TERM VAReintrag:=listenposition(eigenefunktionen,abbildungsname);IFeintrag=nilTHENeintrag:=listenposition(standardfunktionen,abbildungsname);IFeintrag=nilTHENerrorstop(anwendungstext(48))END IF;kopiertestandardfunktionELSEabbildung(DEFINITIONeintrag)END IF.kopiertestandardfunktion:TERM VARneuevariable:=newvariable(1,"x"),argument:=newterm(neuevariable),ausdruck:=newterm(newfunktionsauswertung(eintrag,newtermliste(argument,argument,1),defaultfuerkomponentenindex));neueabbildung(neueliste(neuevariable,neuevariable),neueliste(ausdruck,ausdruck))END PROCabbildung;ABBILDUNG PROCneueabbildung(LISTE CONSTvariablenliste,termliste):anhaengenantemporaerefunktionen(newtemporaerefunktion(newfunktionsdefinition(newvariablenliste(listenanfang(variablenliste),listenende(variablenliste),laenge(variablenliste)),newtermliste(listenanfang(termliste),listenende(termliste),laenge(termliste)))));funktion(variablenliste,termliste)END PROCneueabbildung;ABBILDUNG PROCfunktion(LISTE CONSTvariablen,terme):ABBILDUNG VARf;f.variablenliste:=variablen;f.termliste:=terme;fEND PROCfunktion;ABBILDUNG OP+(ABBILDUNG CONSTl,r):additivezusammenfassung(l,r,plussymbol)END OP+;ABBILDUNG OP-(ABBILDUNG CONSTl,r):additivezusammenfassung(l,r,minussymbol)END OP-;ABBILDUNG PROCadditivezusammenfassung(ABBILDUNG CONSTl,r,TEXT CONSTopsymbol):ueberpruefeparameter;bildeneueabbildung.ueberpruefeparameter:testeexistenz(l);testeexistenz(r);IFselektionshaltigetermliste(listenanfang(l.termliste))CORselektionshaltigetermliste(listenanfang(r.termliste))THENerrorstop(anwendungstext(204))END IF;IF NOTvariablenidentitaet(l,r)CORlaenge(l.termliste)<>laenge(r.termliste)THENerrorstop(anwendungstext(45))END IF.bildeneueabbildung:LISTE VARvariablen:=kopiedervariablenliste(l.variablenliste),terme:=neueliste(nil,nil);TERM VARlinkerterm:=listenanfang(l.termliste),rechterterm:=listenanfang(r.termliste);REPanhaengen(terme,newterm(newdyade(kopie(AUSDRUCKlinkerterm,variablen),kopie(AUSDRUCKrechterterm,variablen),opsymbol)));linkerterm:=nachfolger(linkerterm);rechterterm:=nachfolger(rechterterm)UNTILrechterterm=nilEND REP;loeschetemporaereabbildung(l);loeschetemporaereabbildung(r);neueabbildung(variablen,terme)END PROC
additivezusammenfassung;ABBILDUNG OP*(ABBILDUNG CONSTl,r):ueberpruefeparameter;bildeneueabbildung.ueberpruefeparameter:testeexistenz(l);testeexistenz(r);IFselektionshaltigetermliste(listenanfang(l.termliste))CORselektionshaltigetermliste(listenanfang(r.termliste))THENerrorstop(anwendungstext(204))END IF;IF NOTvariablenidentitaet(l,r)CORlaenge(l.termliste)<>laenge(r.termliste)THENerrorstop(anwendungstext(45))END IF.bildeneueabbildung:LISTE VARvariablen:=kopiedervariablenliste(l.variablenliste);TERM VARlinkerterm:=listenanfang(l.termliste),rechterterm:=listenanfang(r.termliste),neuerterm:=newdyade(kopie(AUSDRUCKlinkerterm,variablen),kopie(AUSDRUCKrechterterm,variablen),multiplikationssymbol);linkerterm:=nachfolger(linkerterm);WHILElinkerterm<>nilREPrechterterm:=nachfolger(rechterterm);neuerterm:=newdyade(neuerterm,newdyade(kopie(AUSDRUCKlinkerterm,variablen),kopie(AUSDRUCKrechterterm,variablen),multiplikationssymbol),plussymbol);linkerterm:=nachfolger(linkerterm);END REP;loeschetemporaereabbildung(l);loeschetemporaereabbildung(r);neuerterm:=newterm(neuerterm);neueabbildung(variablen,neueliste(neuerterm,neuerterm))END OP*;ABBILDUNG OP/(ABBILDUNG CONSTl,r):ueberpruefeparameter;bildeneueabbildung.ueberpruefeparameter:testeexistenz(l);testeexistenz(r);IFselektionshaltigetermliste(listenanfang(l.termliste))CORselektionshaltigetermliste(listenanfang(r.termliste))THENerrorstop(anwendungstext(204))END IF;IF NOTvariablenidentitaet(l,r)CORlaenge(l.termliste)<>1CORlaenge(r.termliste)<>1THENerrorstop(anwendungstext(45))END IF.bildeneueabbildung:LISTE VARvariablen:=kopiedervariablenliste(l.variablenliste);TERM VARergebnis:=newterm(newdyade(kopie(AUSDRUCKlistenanfang(l.termliste),variablen),kopie(AUSDRUCKlistenanfang(r.termliste),variablen),divisionssymbol));loeschetemporaereabbildung(l);loeschetemporaereabbildung(r);neueabbildung(variablen,neueliste(ergebnis,ergebnis))END OP/;ABBILDUNG OP O(ABBILDUNG CONSTl,r):ueberpruefeparameter;bildeneueabbildung;loeschetemporaereabbildungenundreicheneueabbildungnachaussen.ueberpruefeparameter:testeexistenz(l);testeexistenz(r);IFselektionshaltigetermliste(listenanfang(l.termliste))CORselektionshaltigetermliste(listenanfang(r.termliste))THENerrorstop(anwendungstext(204))END IF;IFlaenge(r.termliste)<>laenge(l.variablenliste)THENerrorstop(anwendungstext(45))END IF.bildeneueabbildung:initialisieredielistenderneuenabbildung;erzeugealletermederneuenabbildung.initialisieredielistenderneuenabbildung:LISTE VARvariablen:=kopiedervariablenliste(r.variablenliste),terme:=neueliste(nil,nil).erzeugealletermederneuenabbildung:INT VARtermzaehler;TERM VARlinkeadresse:=adresse(l),rechteadresse:=adresse(r);FORtermzaehlerFROM1UPTOlaenge(l.termliste)REPerzeugeeinentermEND REP.erzeugeeinenterm:LISTE VARargumente:=neueliste(nil,nil);erstelleargumentlistederfunktionsauswertung;anhaengen(terme,newterm(newfunktionsauswertung(linkeadresse,newtermliste(listenanfang(argumente),listenende(argumente),laenge(argumente)),termzaehler))).erstelleargumentlistederfunktionsauswertung:INT VARargumentzaehler;LISTE VARliste;IFebene=1THENanhaengen(argumente,newterm(kopie(AUSDRUCKlistenanfang(r.termliste),variablen)));FORargumentzaehlerFROM2UPTOlaenge(variablen)REPanhaengen(argumente,newterm(auswahl(variablen,argumentzaehler)))END REP ELSE FORargumentzaehlerFROM1UPTOlaenge(r.termliste)REPliste:=neueliste(nil,nil);erstelleargumentlistederinnerenfunktion;anhaengen(argumente,newterm(newfunktionsauswertung(rechteadresse,newtermliste(listenanfang(liste),listenende(liste),laenge(liste)),argumentzaehler)))END REP END IF.erstelleargumentlistederinnerenfunktion:INT VARi;FORiFROM1UPTOlaenge(r.variablenliste)REPanhaengen(liste,newterm(auswahl(r.variablenliste,i)))END REP.loeschetemporaereabbildungenundreicheneueabbildungnachaussen:ABBILDUNG VARscratchfunktion:=neueabbildung(variablen,terme),exportfunktion:=aufloesung(scratchfunktion);loescheabbildung(scratchfunktion);loeschetemporaereabbildung(l);loeschetemporaereabbildung(r);exportfunktionEND OP O;ABBILDUNG
OP+(ABBILDUNG CONSToperand):testeexistenz(operand);IFselektionshaltigetermliste(listenanfang(operand.termliste))THENerrorstop(anwendungstext(204))END IF;operandEND OP+;ABBILDUNG OP-(ABBILDUNG CONSToperand):testeexistenz(operand);IFselektionshaltigetermliste(listenanfang(operand.termliste))THENerrorstop(anwendungstext(204))END IF;bildeneueabbildung.bildeneueabbildung:LISTE VARvariablen:=kopiedervariablenliste(operand.variablenliste),terme:=neueliste(nil,nil);TERM VARlaufterm:=listenanfang(operand.termliste);REPanhaengen(terme,newterm(newmonade(kopie(AUSDRUCKlaufterm,variablen),minussymbol)));laufterm:=nachfolger(laufterm)UNTILlaufterm=nilEND REP;loeschetemporaereabbildung(operand);neueabbildung(variablen,terme)END OP-;ABBILDUNG PROCnewtonvorschrift(ABBILDUNG CONSTf,INT CONSTvarindex):testeparameter;bildenewtonvorschrift.testeparameter:enablestop;TERM CONSTfunktionsadresse:=adresse(f);IFfunktionsadresse=nilTHENerrorstop(anwendungstext(48))ELIFableitungsverbot(funktionsadresse)THENerrorstop(anwendungstext(56))ELIFvarindex<1CORvarindex>laenge(f.variablenliste)THENerrorstop(anwendungstext(53))END IF.bildenewtonvorschrift:ABBILDUNG VARtemp1:=aufloesung(f),temp2:=ableitung(temp1,1,varindex);LISTE VARneuevariablen:=kopiedervariablenliste(f.variablenliste);TERM VARneuerterm:=newterm(newdyade(auswahl(neuevariablen,varindex),newdyade(kopie(AUSDRUCKlistenanfang(temp1.termliste),neuevariablen),kopie(AUSDRUCKlistenanfang(temp2.termliste),neuevariablen),divisionssymbol),minussymbol));loeschetemporaereabbildung(temp1);loeschetemporaereabbildung(temp2);neueabbildung(neuevariablen,neueliste(neuerterm,neuerterm))END PROCnewtonvorschrift;ABBILDUNG PROCiterationsvorschrift(ABBILDUNG CONSTf,INT CONSTvarindex):testeparameter;bildeiterationsvorschrift.testeparameter:enablestop;TERM CONSTfunktionsadresse:=adresse(f);IFfunktionsadresse=nilTHENerrorstop(anwendungstext(48))ELIFvarindex<1CORvarindex>laenge(f.variablenliste)THENerrorstop(anwendungstext(53))END IF.bildeiterationsvorschrift:ABBILDUNG VARtemp1:=aufloesung(f);LISTE VARneuevariablen:=kopiedervariablenliste(f.variablenliste);TERM VARnt:=newterm(kopie(AUSDRUCKlistenanfang(temp1.termliste),neuevariablen));loeschetemporaereabbildung(temp1);neueabbildung(neuevariablen,neueliste(nt,nt))END PROCiterationsvorschrift;VECTOR PROCergebnis(ABBILDUNG CONSTf,VECTOR CONSTvariablenvektor):enablestop;testeexistenz(f);IFlaenge(f.variablenliste)<>length(variablenvektor)THENerrorstop(anwendungstext(45))END IF;ergebnisvektor(f.termliste,variablenvektor)END PROCergebnis;VECTOR PROCergebnisvektor(LISTE CONSTzuberechnendetermliste,VECTOR CONSTvariablenvektor):INT VARanzahlterme:=laenge(zuberechnendetermliste),i;VECTOR VARergebnisse:=vector(anzahlterme);TERM VARterm:=listenanfang(zuberechnendetermliste);FORiFROM1UPTOanzahltermeREPreplace(ergebnisse,i,result(AUSDRUCKterm,variablenvektor));term:=nachfolger(term)END REP;ergebnisseEND PROCergebnisvektor;REAL PROCresult(TERM CONSTterm,VECTOR CONSTvariablenvektor):TEXT VARoperationssymbol;TERM VARobjekt;enablestop;IFtermISvariableTHENvariablenvektorSUB(PLATZterm)ELIFtermISdyadischTHENwertderdyadeELIFtermISmonadischTHENwertdermonadeELIFtermISfunktionsauswertungTHENfunktionswertELIFtermISkonstanteTHEN WERTtermELSEselektierterwertEND IF.wertderdyade:REAL VARlinks:=result(LINKSterm,variablenvektor),rechts:=result(RECHTSterm,variablenvektor);operationssymbol:=OPERATIONterm;IFoperationssymbol=plussymbolTHENlinks+rechtsELIFoperationssymbol=minussymbolTHENlinks-rechtsELIFoperationssymbol=multiplikationssymbolTHENlinks*rechtsELIFoperationssymbol=divisionssymbolTHENlinks/rechtsELSE IFlinks=0.0CANDrechts=0.0THENerrorstop(anwendungstext(101))END IF;IFrechts<=32767.0CANDrechts>=-32768.0CANDreal(int(rechts))=rechtsTHENlinks**int(rechts)ELSElinks**rechtsEND IF END IF.wertdermonade:IF OPERATIONterm=minussymbolTHEN-result(OPERANDterm,variablenvektor)ELSEresult(OPERANDterm,variablenvektor)END IF.funktionswert:objekt:=ABBILDUNGSAUSDRUCKterm;IF NOT((objektISstandardfunktion)COR(objektIS
eigenefunktion))THENerrorstop(anwendungstext(14))END IF;IFobjektISstandardfunktionTHENwertderstandardfunktionELSEwertderselbstdefiniertenfunktionEND IF.wertderstandardfunktion:REAL VARargumentwert:=result(erstesargument(term),variablenvektor);operationssymbol:=NAMEobjekt;IFoperationssymbol=sinussymbolTHENsin(argumentwert)ELIFoperationssymbol=cosinussymbolTHENcos(argumentwert)ELIFoperationssymbol=tangenssymbolTHENtan(argumentwert)ELIFoperationssymbol=cotangenssymbolTHENcot(argumentwert)ELIFoperationssymbol=arcussinussymbolTHENarcsin(argumentwert)ELIFoperationssymbol=arcuscosinussymbolTHENarccos(argumentwert)ELIFoperationssymbol=arcustangenssymbolTHENarctan(argumentwert)ELIFoperationssymbol=arcuscotangenssymbolTHENarccot(argumentwert)ELIFoperationssymbol=lnsymbolTHENln(argumentwert)ELIFoperationssymbol=log2symbolTHENlog2(argumentwert)ELIFoperationssymbol=log10symbolTHENlog10(argumentwert)ELIFoperationssymbol=exponentialsymbolTHENexp(argumentwert)ELIFoperationssymbol=signumsymbolTHENreal(sign(argumentwert))ELIFoperationssymbol=wurzelsymbolTHENsqrt(argumentwert)ELIFoperationssymbol=gaussklammersymbolTHENgauss(argumentwert)ELIFoperationssymbol=rundsymbolTHENrund(argumentwert)ELIFoperationssymbol=intsymbolTHENganz(argumentwert)ELIFoperationssymbol=fracsymbolTHENfrak(argumentwert)ELSEabs(argumentwert)END IF.wertderselbstdefiniertenfunktion:result(ausgewaehlterfunktionsterm(term),ergebnisvektor(neueliste(LISTENANFANG ARGUMENTEterm,LISTENENDE ARGUMENTEterm),variablenvektor)).selektierterwert:TERM VARhilfsterm:=term;WHILE NOTcondition(BEDINGUNGhilfsterm,variablenvektor)REPhilfsterm:=ALTERNATIVEhilfsterm;IFhilfsterm=nilTHENerrorstop(anwendungstext(106))END IF END REP;result(AKTIONhilfsterm,variablenvektor)END PROCresult;BOOL PROCcondition(TERM CONSTterm,VECTOR CONSTwerte):TEXT VARoperationssymbol;BOOL VARlinks,rechts;REAL VARlinkerwert,rechterwert;IFtermISlogischedyadeTHENlinks:=condition(LINKSterm,werte);rechts:=condition(RECHTSterm,werte);IF OPERATIONterm=odersymbolTHENlinksCORrechtsELSElinksCANDrechtsEND IF ELSEoperationssymbol:=OPERATIONterm;linkerwert:=result(LINKSterm,werte);rechterwert:=result(RECHTSterm,werte);IFoperationssymbol=kleinersymbolTHENlinkerwert<rechterwertELIFoperationssymbol=kleinergleichsymbolTHENlinkerwert<=rechterwertELIFoperationssymbol=gleichsymbolTHENlinkerwert=rechterwertELIFoperationssymbol=ungleichsymbolTHENlinkerwert<>rechterwertELIFoperationssymbol=groessergleichsymbolTHENlinkerwert>=rechterwertELSElinkerwert>rechterwertEND IF END IF END PROCcondition;BOOL PROCkomplexefunktion(ABBILDUNG CONSTf):enablestop;testeexistenz(f);komplexeliste(listenanfang(f.termliste))END PROCkomplexefunktion;BOOL PROCkomplexeliste(TERM CONSTterm):komplexerterm(AUSDRUCKterm)COR((nachfolger(term)<>nil)CANDkomplexeliste(nachfolger(term)))END PROCkomplexeliste;BOOL PROCkomplexerterm(TERM CONSTterm):IF(termISdyadisch)COR(termISlogischedyade)COR(termISvergleich)THENkomplexerterm(LINKSterm)CORkomplexerterm(RECHTSterm)ELIF(termISmonadisch)THENkomplexerterm(OPERANDterm)ELIFtermISfunktionsauswertungTHEN((ABBILDUNGSAUSDRUCKterm)ISableitungsoperation)COR((ABBILDUNGSAUSDRUCKterm)ISabbildungsdyade)COR((ABBILDUNGSAUSDRUCKterm)ISabbildungsmonade)CORkomplexeliste(LISTENANFANG ARGUMENTEterm)COR(((ABBILDUNGSAUSDRUCKterm)ISeigenefunktion)CANDkomplexerterm(ausgewaehlterfunktionsterm(term)))ELIFtermISselektionTHENkomplexerterm(BEDINGUNGterm)CORkomplexerterm(AKTIONterm)CORkomplexerterm(ALTERNATIVEterm)ELSE FALSE END IF END PROCkomplexerterm;ABBILDUNG PROCableitung(ABBILDUNG CONSTf):ableitung(f,defaultfuerkomponentenindex,defaultfuervariablenindex)END PROCableitung;ABBILDUNG PROCableitung(ABBILDUNG CONSTf,INT CONSTkompindex,varindex):enablestop;ueberpruefedieaktuellenparameter;erzeugteableitung.ueberpruefedieaktuellenparameter:testeexistenz(f);IFkompindex>laenge(f.termliste)CORkompindex<1THENerrorstop(anwendungstext(42))ELIFvarindex>laenge(f.variablenliste)CORvarindex<1THENerrorstop(anwendungstext(53))END IF.erzeugteableitung:LISTE VARneuevariablen:=
kopiedervariablenliste(f.variablenliste);TERM VARabgeleiteterterm:=newterm(diff(abzuleitenderterm,varindex,neuevariablen));neueabbildung(neuevariablen,neueliste(abgeleiteterterm,abgeleiteterterm)).abzuleitenderterm:AUSDRUCKauswahl(f.termliste,kompindex)END PROCableitung;TERM PROCdiff(TERM CONSTterm,INT CONSTvariablenindex,LISTE CONSTvariablen):TERM VARzeiger,objekt;TEXT VARoperation;REAL VARwert;IFtermISselektionTHENerrorstop(anwendungstext(57))END IF;IFtermISvariableTHENableitungeinervariablenELIFtermISmonadischTHENabgeleitetermonadeELIFtermISkonstanteTHENableitungeinerkonstantenELIFtermISdyadischTHENabgeleitetedyadeELSEabgeleitetefunktionsauswertungEND IF.ableitungeinervariablen:IF PLATZterm=variablenindexTHENnewkonstante(1.0,"1")ELSEnewkonstante(0.0,"0")END IF.abgeleitetermonade:signreduce(diff(OPERANDterm,variablenindex,variablen),OPERATIONterm).ableitungeinerkonstanten:newkonstante(0.0,"0").abgeleitetedyade:TERM VARlinkeableitung:=diff(LINKSterm,variablenindex,variablen),rechteableitung;operation:=OPERATIONterm;IFoperation<>speziellespotenzsymbolTHENrechteableitung:=diff(RECHTSterm,variablenindex,variablen)END IF;IFoperation=plussymbolCORoperation=minussymbolTHENadditionsregelELIFoperation=multiplikationssymbolTHENmultiplikationsregelELIFoperation=divisionssymbolTHENdivisionsregelELIFoperation=allgemeinespotenzsymbolTHENallgemeinepotenzregelELSEspeziellepotenzregelEND IF.additionsregel:reduce(linkeableitung,rechteableitung,operation).multiplikationsregel:reduce(reduce(linkeableitung,rechtekopie,multiplikationssymbol),reduce(linkekopie,rechteableitung,multiplikationssymbol),plussymbol).divisionsregel:reduce(reduce(reduce(linkeableitung,rechtekopie,multiplikationssymbol),reduce(linkekopie,rechteableitung,multiplikationssymbol),minussymbol),reduce(rechtekopie,newkonstante(2.0,"2"),speziellespotenzsymbol),divisionssymbol).allgemeinepotenzregel:reduce(reduce(newkonstante(e,esymbol),reduce(rechtekopie,argumentterm,multiplikationssymbol),allgemeinespotenzsymbol),reduce(reduce(rechteableitung,argumentterm,multiplikationssymbol),reduce(reduce(rechtekopie,linkeableitung,multiplikationssymbol),linkekopie,divisionssymbol),plussymbol),multiplikationssymbol).argumentterm:IF(LINKStermISkonstante)CAND(NAME LINKSterm=esymbol)THENnewkonstante(1.0,"1")ELSEzeiger:=newterm(linkekopie);newfunktionsauswertung(listenposition(standardfunktionen,lnsymbol),newtermliste(zeiger,zeiger,1),defaultfuerkomponentenindex)END IF.speziellepotenzregel:IF(RECHTStermISkonstante)THENwert:=WERT RECHTStermELSE IF(OPERATION RECHTSterm=minussymbol)THENwert:=-WERT OPERAND RECHTStermELSEwert:=WERT OPERAND RECHTStermEND IF END IF;reduce(linkeableitung,reduce(newkonstante(wert,text(int(wert))),reduce(linkekopie,newkonstante(wert-1.0,text(int(wert-1.0))),speziellespotenzsymbol),multiplikationssymbol),multiplikationssymbol).linkekopie:kopie(LINKSterm,variablen).rechtekopie:kopie(RECHTSterm,variablen).abgeleitetefunktionsauswertung:INT VARlambda:=1,anzahlderargumente:=LAENGE ARGUMENTEterm;TERM VARkettenregel:=newkonstante(0.0,"0");FORlambdaFROM1UPTOanzahlderargumenteREPkettenregel:=reduce(kettenregel,reduce(aeussereableitung,innereableitung,multiplikationssymbol),plussymbol)END REP;kettenregel.innereableitung:diff(AUSDRUCK((ARGUMENTEterm)ELEMENTlambda),variablenindex,variablen).aeussereableitung:objekt:=ABBILDUNGSAUSDRUCKterm;IFobjektISstandardfunktionTHENstandardableitungELIF(objektISabbildungsdyade)COR(objektISabbildungsmonade)THENnewfunktionsauswertung(difffunktionsoperation(objekt),kopie(ARGUMENTEterm,variablen),KOMPONENTEterm)ELSEnewfunktionsauswertung(newableitungsoperation(abbildungskopie(objekt),lambda,KOMPONENTEterm,differenzieroperator),kopie(ARGUMENTEterm,variablen),KOMPONENTEterm)END IF.differenzieroperator:IFobjektISableitungsoperationTHEN OPERATIONobjektELIFtermanzahl(objekt)>1CORvariablenanzahl(objekt)>1THENdifferenziersymbolELSEstrichsymbolEND IF.standardableitung:operation:=NAMEobjekt;IFabschnittweisedefiniertefunktion(operation)THENerrorstop(
anwendungstext(56))END IF;IFoperation=sinussymbolTHENableitungdersinusfunktionELIFoperation=cosinussymbolTHENableitungdercosinusfunktionELIFoperation=tangenssymbolTHENableitungdertangensfunktionELIFoperation=cotangenssymbolTHENableitungdercotangensfunktionELIFoperation=arcussinussymbolTHENableitungderarcussinusfunktionELIFoperation=arcuscosinussymbolTHENableitungderarcuscosinusfunktionELIFoperation=arcustangenssymbolTHENableitungderarcustangensfunktionELIFoperation=arcuscotangenssymbolTHENableitungderarcuscotangensfunktionELIFoperation=lnsymbolTHENableitungderlnfunktionELIFoperation=log2symbolTHENableitungderlog2funktionELIFoperation=log10symbolTHENableitungderlog10funktionELIFoperation=wurzelsymbolTHENableitungderwurzelfunktionELSEableitungderexponentialfunktionEND IF.ableitungdersinusfunktion:newfunktionsauswertung(listenposition(standardfunktionen,cosinussymbol),kopie(ARGUMENTEterm,variablen),defaultfuerkomponentenindex).ableitungdercosinusfunktion:newmonade(newfunktionsauswertung(listenposition(standardfunktionen,sinussymbol),kopie(ARGUMENTEterm,variablen),defaultfuerkomponentenindex),minussymbol).ableitungdertangensfunktion:newdyade(newdyade(newfunktionsauswertung(listenposition(standardfunktionen,tangenssymbol),kopie(ARGUMENTEterm,variablen),defaultfuerkomponentenindex),newkonstante(2.0,"2"),speziellespotenzsymbol),newkonstante(1.0,"1"),plussymbol).ableitungdercotangensfunktion:newdyade(newkonstante(-1.0,"-1"),newdyade(newfunktionsauswertung(listenposition(standardfunktionen,sinussymbol),kopie(ARGUMENTEterm,variablen),defaultfuerkomponentenindex),newkonstante(2.0,"2"),speziellespotenzsymbol),divisionssymbol).ableitungderarcussinusfunktion:reduce(newkonstante(1.0,"1"),reduce(reduce(newkonstante(1.0,"1"),reduce(kopie(erstesargument(term),variablen),newkonstante(2.0,"2"),speziellespotenzsymbol),minussymbol),newkonstante(0.5,"0.5"),allgemeinespotenzsymbol),divisionssymbol).ableitungderarcuscosinusfunktion:signreduce(ableitungderarcussinusfunktion,minussymbol).ableitungderarcustangensfunktion:reduce(newkonstante(1.0,"1"),reduce(newkonstante(1.0,"1"),reduce(kopie(erstesargument(term),variablen),newkonstante(2.0,"2"),speziellespotenzsymbol),plussymbol),divisionssymbol).ableitungderarcuscotangensfunktion:signreduce(ableitungderarcustangensfunktion,minussymbol).ableitungderlnfunktion:reduce(newkonstante(1.0,"1"),kopie(erstesargument(term),variablen),divisionssymbol).ableitungderlog2funktion:zeiger:=newterm(newkonstante(2.0,"2"));reduce(newkonstante(1.0,"1"),reduce(kopie(erstesargument(term),variablen),newfunktionsauswertung(listenposition(standardfunktionen,lnsymbol),newtermliste(zeiger,zeiger,1),defaultfuerkomponentenindex),multiplikationssymbol),divisionssymbol).ableitungderlog10funktion:zeiger:=newterm(newkonstante(10.0,"10"));reduce(newkonstante(1.0,"1"),reduce(kopie(erstesargument(term),variablen),newfunktionsauswertung(listenposition(standardfunktionen,lnsymbol),newtermliste(zeiger,zeiger,1),defaultfuerkomponentenindex),multiplikationssymbol),divisionssymbol).ableitungderwurzelfunktion:newdyade(newkonstante(1.0,"1"),newdyade(newkonstante(2.0,"2"),newfunktionsauswertung(listenposition(standardfunktionen,wurzelsymbol),kopie(ARGUMENTEterm,variablen),defaultfuerkomponentenindex),multiplikationssymbol),divisionssymbol).ableitungderexponentialfunktion:newfunktionsauswertung(listenposition(standardfunktionen,exponentialsymbol),kopie(ARGUMENTEterm,variablen),defaultfuerkomponentenindex)END PROCdiff;TERM PROCdifffunktionsoperation(TERM CONSTterm):IFtermISabbildungsdyadeTHENabgeleiteterdyadischertermELIFtermISabbildungsmonadeTHENabgeleitetermonadischertermELSEeinfacheableitungEND IF.abgeleiteterdyadischerterm:TEXT VARoperation:=OPERATIONterm;IFoperation=plussymbolCORoperation=minussymbolTHENadditionsregelELIFoperation=multiplikationssymbolTHENmultiplikationsregelELIFoperation=divisionssymbolTHENdivisionsregelELSEkettenregelEND IF.additionsregel:newabbildungsdyade(difffunktionsoperation(LINKSterm),difffunktionsoperation(RECHTSterm),
operation).multiplikationsregel:newabbildungsdyade(newabbildungsdyade(difffunktionsoperation(LINKSterm),abbildungskopie(RECHTSterm),multiplikationssymbol),newabbildungsdyade(abbildungskopie(LINKSterm),difffunktionsoperation(RECHTSterm),multiplikationssymbol),plussymbol).divisionsregel:newabbildungsdyade(newabbildungsdyade(newabbildungsdyade(difffunktionsoperation(LINKSterm),abbildungskopie(RECHTSterm),multiplikationssymbol),newabbildungsdyade(abbildungskopie(LINKSterm),difffunktionsoperation(RECHTSterm),multiplikationssymbol),minussymbol),newabbildungsdyade(abbildungskopie(RECHTSterm),abbildungskopie(RECHTSterm),multiplikationssymbol),divisionssymbol).kettenregel:newabbildungsdyade(aeussereableitung,innereableitung,multiplikationssymbol).aeussereableitung:newabbildungsdyade(newableitungsoperation(abbildungskopie(LINKSterm),defaultfuervariablenindex,defaultfuerkomponentenindex,strichsymbol),abbildungskopie(RECHTSterm),verkettungssymbol).innereableitung:newableitungsoperation(abbildungskopie(RECHTSterm),defaultfuervariablenindex,defaultfuerkomponentenindex,strichsymbol).abgeleitetermonadischerterm:IF(OPERATIONterm=minussymbol)THENnewabbildungsmonade(difffunktionsoperation(OPERANDterm),minussymbol)ELSEdifffunktionsoperation(OPERANDterm)END IF.einfacheableitung:IFableitungsverbot(term)THENerrorstop(anwendungstext(56))END IF;newableitungsoperation(abbildungskopie(term),defaultfuervariablenindex,defaultfuerkomponentenindex,strichsymbol).END PROCdifffunktionsoperation;TERM PROCreduce(TERM CONSTl,r,TEXT CONSToperator):REAL VARwert;TERM VARlinks:=l,rechts:=r;IFlISdyadischTHENlinks:=reduce(LINKSl,RECHTSl,OPERATIONl);LOESCHElEND IF;IFrISdyadischTHENrechts:=reduce(LINKSr,RECHTSr,OPERATIONr);LOESCHErEND IF;IFoperator=plussymbolTHENvereinfachteadditionELIFoperator=minussymbolTHENvereinfachtesubtraktionELIFoperator=multiplikationssymbolTHENvereinfachtemultiplikationELIFoperator=divisionssymbolTHENvereinfachtedivisionELIFoperator=speziellespotenzsymbolTHENvereinfachtespeziellepotenzELSEvereinfachteallgemeinepotenzEND IF.vereinfachteaddition:IFidentischevordefiniertekonstanten(links,rechts)THEN LOESCHErechts;newdyade(newkonstante(2.0,"2"),links,multiplikationssymbol)ELIF(linksISkonstante)CAND(rechtsISkonstante)CAND NOTvordefiniertekonstante(links)CAND NOTvordefiniertekonstante(rechts)THENwert:=WERTlinks+WERTrechts;LOESCHElinks;LOESCHErechts;newkonstante(wert,text(wert))ELIFlinksIST0.0THEN LOESCHElinks;rechtsELIFrechtsIST0.0THEN LOESCHErechts;linksELIFidentischevariablen(links,rechts)THENnewdyade(newkonstante(2.0,"2"),links,multiplikationssymbol)ELIF(linksISmonadisch)CAND((OPERANDlinks)IST0.0)THENbeseitige(links);rechtsELIF(rechtsISmonadisch)CAND((OPERANDrechts)IST0.0)THENbeseitige(rechts);linksELSEnewdyade(links,rechts,operator)END IF.vereinfachtesubtraktion:IFidentischevordefiniertekonstanten(links,rechts)THEN LOESCHElinks;LOESCHErechts;newkonstante(0.0,"0")ELIF((linksISkonstante)CAND(rechtsISkonstante))CAND NOT(vordefiniertekonstante(links)CORvordefiniertekonstante(rechts))THENwert:=WERTlinks-WERTrechts;LOESCHElinks;LOESCHErechts;newkonstante(wert,text(wert))ELIFlinksIST0.0THEN LOESCHElinks;signreduce(rechts,minussymbol)ELIFrechtsIST0.0THEN LOESCHErechts;linksELIFidentischevariablen(links,rechts)THENnewkonstante(0.0,"0")ELIF(linksISmonadisch)CAND((OPERANDlinks)IST0.0)THENbeseitige(links);rechtsELIF(rechtsISmonadisch)CAND((OPERANDrechts)IST0.0)THENbeseitige(rechts);linksELSEnewdyade(links,rechts,operator)END IF.vereinfachtemultiplikation:TERM VARneuerterm;IFidentischevordefiniertekonstanten(links,rechts)THEN LOESCHElinks;newdyade(newkonstante(2.0,"2"),rechts,speziellespotenzsymbol)ELIF(linksISkonstante)CAND(rechtsISkonstante)CAND NOT(vordefiniertekonstante(links)CORvordefiniertekonstante(rechts))THENwert:=WERTlinks*WERTrechts;LOESCHElinks;LOESCHErechts;newkonstante(wert,text(wert))ELIFlinksIST0.0THENbeseitige(rechts);linksELIFlinksIST1.0THEN LOESCHElinks;rechtsELIFlinksIST-1.0THEN LOESCHElinks;signreduce(rechts,minussymbol)ELIF(linksIS
konstante)CAND NOTvordefiniertekonstante(links)CAND(rechtsISdyadisch)CAND(OPERATIONrechts=multiplikationssymbol)CAND(LINKSrechtsISkonstante)CAND NOTvordefiniertekonstante(LINKSrechts)THENwert:=WERTlinks*WERT LINKSrechts;LOESCHElinks;LOESCHE LINKSrechts;neuerterm:=reduce(newkonstante(wert,text(wert)),RECHTSrechts,multiplikationssymbol);LOESCHErechts;neuertermELIF(linksISkonstante)CAND NOTvordefiniertekonstante(links)CAND(rechtsISdyadisch)CAND(OPERATIONrechts=multiplikationssymbol)CAND(RECHTSrechtsISkonstante)CAND NOTvordefiniertekonstante(RECHTSrechts)THENwert:=WERTlinks*WERT RECHTSrechts;LOESCHElinks;LOESCHE RECHTSrechts;neuerterm:=reduce(newkonstante(wert,text(wert)),LINKSrechts,multiplikationssymbol);LOESCHErechts;neuertermELIFrechtsIST0.0THENbeseitige(links);rechtsELIFrechtsIST1.0THEN LOESCHErechts;linksELIFrechtsIST-1.0THEN LOESCHErechts;signreduce(links,minussymbol)ELIF(rechtsISkonstante)CAND NOTvordefiniertekonstante(rechts)CAND(linksISdyadisch)CAND(OPERATIONlinks=multiplikationssymbol)CAND(LINKSlinksISkonstante)CAND NOTvordefiniertekonstante(LINKSlinks)THENwert:=WERTrechts*WERT LINKSlinks;LOESCHErechts;LOESCHE LINKSlinks;neuerterm:=reduce(newkonstante(wert,text(wert)),RECHTSlinks,multiplikationssymbol);LOESCHElinks;neuertermELIF(rechtsISkonstante)CAND NOTvordefiniertekonstante(rechts)CAND(linksISdyadisch)CAND(OPERATIONlinks=multiplikationssymbol)CAND(RECHTSlinksISkonstante)CAND NOTvordefiniertekonstante(RECHTSlinks)THENwert:=WERTrechts*WERT RECHTSlinks;LOESCHErechts;LOESCHE RECHTSlinks;neuerterm:=reduce(newkonstante(wert,text(wert)),LINKSlinks,multiplikationssymbol);LOESCHElinks;neuertermELIF(linksISmonadisch)CAND((OPERANDlinks)IST0.0)THEN LOESCHElinks;beseitige(rechts);newkonstante(0.0,"0")ELIF(rechtsISmonadisch)CAND((OPERANDrechts)IST0.0)THENbeseitige(links);LOESCHErechts;newkonstante(0.0,"0")ELIF(linksISmonadisch)CAND((OPERANDlinks)IST1.0)THEN IF(OPERATIONlinks=minussymbol)THENbeseitige(links);signreduce(rechts,minussymbol)ELSEbeseitige(links);rechtsEND IF ELIF(rechtsISmonadisch)CAND((OPERANDrechts)IST1.0)THEN IF(OPERATIONrechts=minussymbol)THENbeseitige(rechts);signreduce(links,minussymbol)ELSEbeseitige(rechts);linksEND IF ELIF(linksISmonadisch)CAND(rechtsISmonadisch)THEN IF(OPERATIONlinks)=(OPERATIONrechts)THENnewdyade(OPERANDlinks,OPERANDrechts,multiplikationssymbol)ELSEnewmonade(newdyade(OPERANDlinks,OPERANDrechts,multiplikationssymbol),minussymbol)END IF ELIFidentischevariablen(links,rechts)THENnewdyade(links,newkonstante(2.0,"2"),speziellespotenzsymbol)ELSEnewdyade(links,rechts,operator)END IF.vereinfachtedivision:IFlinksIST0.0THENbeseitige(rechts);linksELIFrechtsIST1.0THEN LOESCHErechts;linksELIFrechtsIST-1.0THEN LOESCHErechts;signreduce(links,minussymbol)ELIF(linksISmonadisch)CAND((OPERANDlinks)IST0.0)THENbeseitige(links);beseitige(rechts);newkonstante(0.0,"0")ELIF(rechtsISmonadisch)CAND((OPERANDrechts)IST1.0)THEN IF(OPERATIONrechts=minussymbol)THENbeseitige(rechts);signreduce(links,minussymbol)ELSEbeseitige(rechts);linksEND IF ELIF(linksISmonadisch)CAND(rechtsISmonadisch)THEN IF(OPERATIONlinks)=(OPERATIONrechts)THENnewdyade(OPERANDlinks,OPERANDrechts,divisionssymbol)ELSEnewmonade(newdyade(OPERANDlinks,OPERANDrechts,divisionssymbol),minussymbol)END IF ELIFidentischevariablen(links,rechts)THENnewkonstante(1.0,"1")ELSEnewdyade(links,rechts,operator)END IF.vereinfachteallgemeinepotenz:IFrechtsistganzzahlCAND(linksISkonstante)CAND NOTvordefiniertekonstante(links)THENwert:=WERTlinks**WERTrechts;LOESCHElinks;LOESCHErechts;newkonstante(wert,text(wert))ELIFlinksIST1.0THEN LOESCHElinks;beseitige(rechts);newkonstante(1.0,"1")ELIFrechtsIST0.0THENbeseitige(links);LOESCHErechts;newkonstante(1.0,"1")ELIFrechtsIST1.0THEN LOESCHErechts;linksELIF(linksISmonadisch)CAND((OPERANDlinks)IST0.0)THENbeseitige(links);beseitige(rechts);newkonstante(0.0,"0")ELIF(rechtsISmonadisch)CAND((OPERANDrechts)IST0.0)THENbeseitige(links);beseitige(rechts);newkonstante(1.0,"1")ELSEnewdyade(links,rechts,operator)END IF.rechtsistganzzahl:(rechtsIS
konstante)CAND(floor(WERTrechts)=WERTrechts).vereinfachtespeziellepotenz:IFrechtsIST0.0THENbeseitige(links);LOESCHErechts;newkonstante(1.0,"1")ELIFrechtsIST1.0THEN LOESCHErechts;linksELIF(linksISkonstante)CAND NOTvordefiniertekonstante(links)CAND(rechtsISkonstante)CAND(real(int(WERTrechts))=WERTrechts)THENwert:=(WERTlinks)**int(WERTrechts);LOESCHElinks;LOESCHErechts;newkonstante(wert,text(wert))ELIFlinksIST1.0THEN LOESCHErechts;linksELIFlinksIST-1.0THEN IFwertvonrechtsistgeradeTHEN LOESCHElinks;LOESCHErechts;newkonstante(1.0,"1")ELSE LOESCHErechts;linksEND IF ELSEnewdyade(links,rechts,operator)END IF.wertvonrechtsistgerade:(rechtsISkonstante)CANDint(WERTrechts)MOD2=0.END PROCreduce;TERM PROCsignreduce(TERM CONSToperand,TEXT CONSToperator):TERM VARneuerterm;IFoperandISmonadischTHEN IFresultierendertermistnegativTHENneuerterm:=newmonade(OPERANDoperand,minussymbol);ELSEneuerterm:=OPERANDoperandEND IF;LOESCHEoperandELIFoperandIST0.0THENneuerterm:=operandELSEneuerterm:=newmonade(operand,operator)END IF;neuerterm.resultierendertermistnegativ:OPERATIONoperand<>operator.END PROCsignreduce;ABBILDUNG PROCaufloesung(ABBILDUNG CONSTf):enablestop;testeexistenz(f);loeseauf.loeseauf:LISTE VARneuevariablen:=kopiedervariablenliste(f.variablenliste);neueabbildung(neuevariablen,aufgeloestetermliste(listenanfang(f.termliste),neuevariablen))END PROCaufloesung;LISTE PROCaufgeloestetermliste(TERM CONSTtermlistenanfang,LISTE CONSTneuevariablen):LISTE VARneueterme:=neueliste(nil,nil);TERM VARlaufterm:=termlistenanfang;WHILElaufterm<>nilREPanhaengen(neueterme,newterm(aufloesendekopie(AUSDRUCKlaufterm,neuevariablen)));laufterm:=nachfolger(laufterm)END REP;neuetermeEND PROCaufgeloestetermliste;TERM PROCaufloesendekopie(TERM CONSTterm,LISTE CONSTvariablen):IFtermISvariableTHENauswahl(variablen,PLATZterm)ELIFtermISdyadischTHENreduce(aufloesendekopie(LINKSterm,variablen),aufloesendekopie(RECHTSterm,variablen),OPERATIONterm)ELIFtermISmonadischTHENsignreduce(aufloesendekopie(OPERANDterm,variablen),OPERATIONterm)ELIFtermISfunktionsauswertungTHENaufloesungderauswertungELIFtermISkonstanteTHENnewkonstante(WERTterm,NAMEterm)ELIFtermISselektionTHENnewselektion(aufloesendekopie(BEDINGUNGterm,variablen),aufloesendekopie(AKTIONterm,variablen),aufloesendekopie(ALTERNATIVEterm,variablen))ELIFtermISlogischedyadeTHENnewlogischedyade(aufloesendekopie(LINKSterm,variablen),aufloesendekopie(RECHTSterm,variablen),OPERATIONterm)ELIFtermISvergleichTHENnewvergleich(aufloesendekopie(LINKSterm,variablen),aufloesendekopie(RECHTSterm,variablen),OPERATIONterm)ELSEnilEND IF.aufloesungderauswertung:ABBILDUNG VARscratchfunktion;TERM VARobjekt;LISTE VARargumente:=aufgeloestetermliste(LISTENANFANG ARGUMENTEterm,variablen);IF(ABBILDUNGSAUSDRUCKterm)ISstandardfunktionTHENaufgeloestestandardfunktionELSEobjekt:=ersetzung(zuersetzenderterm,argumente,variablen);loeschetemporaereabbildung(scratchfunktion);loescheterme(listenanfang(argumente));objektEND IF.aufgeloestestandardfunktion:newfunktionsauswertung(ABBILDUNGSAUSDRUCKterm,newtermliste(listenanfang(argumente),listenende(argumente),1),defaultfuerkomponentenindex).zuersetzenderterm:IF(ABBILDUNGSAUSDRUCKterm)ISeigenefunktionTHENausgewaehlterfunktionsterm(term)ELSEscratchfunktion:=auswertung(ABBILDUNGSAUSDRUCKterm);AUSDRUCKlistenanfang(scratchfunktion.termliste)END IF END PROCaufloesendekopie;TERM PROCersetzung(TERM CONSTterm,LISTE CONSTargumentliste,variablen):IFtermISvariableTHENkopie(AUSDRUCKauswahl(argumentliste,PLATZterm),variablen)ELIFtermISdyadischTHENreduce(ersetzung(LINKSterm,argumentliste,variablen),ersetzung(RECHTSterm,argumentliste,variablen),OPERATIONterm)ELIFtermISmonadischTHENsignreduce(ersetzung(OPERANDterm,argumentliste,variablen),OPERATIONterm)ELIFtermISfunktionsauswertungTHENaufloesungderauswertungELIFtermISkonstanteTHENnewkonstante(WERTterm,NAMEterm)ELIFtermISselektionTHENnewselektion(ersetzung(BEDINGUNGterm,argumentliste,variablen),ersetzung(AKTIONterm,argumentliste,variablen),ersetzung(ALTERNATIVEterm,argumentliste,
variablen))ELIFtermISlogischedyadeTHENnewlogischedyade(ersetzung(LINKSterm,argumentliste,variablen),ersetzung(RECHTSterm,argumentliste,variablen),OPERATIONterm)ELIFtermISvergleichTHENnewvergleich(ersetzung(LINKSterm,argumentliste,variablen),ersetzung(RECHTSterm,argumentliste,variablen),OPERATIONterm)ELSEnilEND IF.aufloesungderauswertung:ABBILDUNG VARscratchfunktion;TERM VARobjekt;IF(ABBILDUNGSAUSDRUCKterm)ISstandardfunktionTHENaufgeloestestandardfunktionELSEobjekt:=ersetzung(zuersetzenderterm,ersetzteargumentliste,variablen);loeschetemporaereabbildung(scratchfunktion);loescheterme(listenanfang(argumente));objektEND IF.aufgeloestestandardfunktion:TERM VARargument:=newterm(ersetzung(erstesargument(term),argumentliste,variablen));newfunktionsauswertung(ABBILDUNGSAUSDRUCKterm,newtermliste(argument,argument,1),defaultfuerkomponentenindex).zuersetzenderterm:IF(ABBILDUNGSAUSDRUCKterm)ISeigenefunktionTHENausgewaehlterfunktionsterm(term)ELSEscratchfunktion:=auswertung(ABBILDUNGSAUSDRUCKterm);AUSDRUCKlistenanfang(scratchfunktion.termliste)END IF.ersetzteargumentliste:LISTE VARargumente:=neueliste(nil,nil);TERM VARlaufterm:=LISTENANFANG ARGUMENTEterm;WHILElaufterm<>nilREPanhaengen(argumente,newterm(ersetzung(AUSDRUCKlaufterm,argumentliste,variablen)));laufterm:=nachfolger(laufterm)END REP;argumenteEND PROCersetzung;PROCloeschebenannteabbildung(TEXT CONSTname):enablestop;IFlistenposition(eigenefunktionen,name)=nilTHENerrorstop(anwendungstext(48))END IF;loescheabbildung(abbildung(name))END PROCloeschebenannteabbildung;PROCloeschetemporaereabbildung(ABBILDUNG CONSTf):enablestop;IFadresse(f)IStemporaerefunktionTHENloescheabbildung(f)END IF END PROCloeschetemporaereabbildung;PROCloescheabbildung(ABBILDUNG CONSTf):enablestop;TERM VARdefinition,eintrag:=adresse(f);IF(eintragISeigenefunktion)COR(eintragIStemporaerefunktion)THENloescheterme(listenanfang(f.termliste));loeschevariablen(listenanfang(f.variablenliste));definition:=DEFINITIONeintrag;LOESCHE VARIABLENdefinition;LOESCHE TERMEdefinition;LOESCHEdefinition;IFeintragIStemporaerefunktionTHENentfernenaustemporaerenfunktionen(eintrag)ELSEentfernenauseigenenfunktionen(eintrag)END IF;LOESCHEeintragELSEerrorstop(anwendungstext(48))END IF END PROCloescheabbildung;PROCloescheterme(TERM CONSTtermlistenanfang):TERM VARloeschelement:=termlistenanfang,naechsteselement;WHILEloeschelement<>nilREPnaechsteselement:=nachfolger(loeschelement);beseitige(loeschelement);loeschelement:=naechsteselementEND REP END PROCloescheterme;PROCloeschevariablen(TERM CONSTvariablenlistenanfang):TERM VARloeschelement:=variablenlistenanfang,naechsteselement;WHILEloeschelement<>nilREPnaechsteselement:=nachfolger(loeschelement);LOESCHEloeschelement;loeschelement:=naechsteselementEND REP END PROCloeschevariablen;PROCbeseitige(TERM CONSTterm):IFtermISausdruckTHENbeseitige(AUSDRUCKterm)ELIF(termISdyadisch)COR(termISabbildungsdyade)COR(termISlogischedyade)COR(termISvergleich)THENbeseitige(LINKSterm);beseitige(RECHTSterm)ELIF(termISmonadisch)COR(termISabbildungsmonade)THENbeseitige(OPERANDterm);ELIFtermISfunktionsauswertungTHENbeseitige(ABBILDUNGSAUSDRUCKterm);loescheterme(LISTENANFANG ARGUMENTEterm);LOESCHE ARGUMENTEtermELIFtermISableitungsoperationTHENbeseitige(ABBILDUNGSAUSDRUCKterm)ELIFtermISselektionTHENbeseitige(BEDINGUNGterm);beseitige(AKTIONterm);IF(ALTERNATIVEterm)<>nilTHENbeseitige(ALTERNATIVEterm)END IF;ELIF NOT(termISkonstante)THEN LEAVEbeseitigeEND IF;LOESCHEtermEND PROCbeseitige;BOOL PROCableitungsverbot(TERM CONSTterm):IF(termISdyadisch)COR(termISabbildungsdyade)THENableitungsverbot(LINKSterm)CORableitungsverbot(RECHTSterm)ELIF(termISmonadisch)COR(termISabbildungsmonade)THENableitungsverbot(OPERANDterm)ELIFtermISstandardfunktionTHENabschnittweisedefiniertefunktion(NAMEterm)ELIF(termISeigenefunktion)COR(termIStemporaerefunktion)THENgetesteteliste(LISTENANFANG TERME DEFINITIONterm)ELIFtermISfunktionsauswertungTHENableitungsverbot(auswertungsobjekt)CORgetesteteliste(LISTENANFANG ARGUMENTEterm)ELIFtermIS
ableitungsoperationTHENableitungsverbot(ABBILDUNGSAUSDRUCKterm)ELSEtermISselektionEND IF.auswertungsobjekt:TERM VARobjekt:=ABBILDUNGSAUSDRUCKterm;IFobjektISeigenefunktionTHEN AUSDRUCK((TERME DEFINITIONobjekt)ELEMENT(KOMPONENTEterm))ELSEobjektEND IF END PROCableitungsverbot;BOOL PROCabschnittweisedefiniertefunktion(TEXT CONSTname):name=signumsymbolCORname=betragssymbolCORname=intsymbolCORname=gaussklammersymbolCORname=rundsymbolCORname=fracsymbolEND PROCabschnittweisedefiniertefunktion;BOOL PROCgetesteteliste(TERM CONSTlistenelement):IFlistenelement=nilTHEN FALSE ELSEableitungsverbot(AUSDRUCKlistenelement)CORgetesteteliste(nachfolger(listenelement))END IF END PROCgetesteteliste;BOOL PROCvariablenidentitaet(ABBILDUNG CONSTl,r):variablenidentitaet(l.variablenliste,r.variablenliste)END PROCvariablenidentitaet;ABBILDUNG PROCvergleichsfunktion(TERM CONSTterm):IF(termISstandardfunktion)COR(termISeigenefunktion)THENabbildung(NAMEterm)ELIFtermISabbildungsdyadeTHENvergleichsfunktion(LINKSterm)ELIFtermISabbildungsmonadeTHENvergleichsfunktion(OPERANDterm)ELSEvergleichsfunktion(ABBILDUNGSAUSDRUCKterm)END IF END PROCvergleichsfunktion;TERM PROCadresse(ABBILDUNG CONSTf):TERM VARvergleichsterm:=listenanfang(f.termliste),suchterm:=nil;durchforste(temporaerefunktionen,suchterm,vergleichsterm);IFsuchterm=nilTHENdurchforste(eigenefunktionen,suchterm,vergleichsterm)END IF;suchtermEND PROCadresse;PROCdurchforste(LISTE CONSTsuchliste,TERM VARsuchterm,TERM CONSTvergleichsterm):IFlaenge(suchliste)>0THENsuchterm:=listenanfang(suchliste);WHILE(suchterm<>nil)CAND NOTgefundenREPsuchterm:=nachfolger(suchterm)END REP;END IF.gefunden:vergleichsterm=LISTENANFANG TERME DEFINITIONsuchterm.END PROCdurchforste;PROCtesteexistenz(ABBILDUNG CONSTf):IFadresse(f)=nilTHENerrorstop(anwendungstext(48))END IF END PROCtesteexistenz;LISTE PROCkopiedervariablenliste(LISTE CONSToriginal):LISTE VARkopie:=neueliste(nil,nil);TERM VARlaufterm:=listenanfang(original);WHILElaufterm<>nilREPanhaengen(kopie,newvariable(PLATZlaufterm,NAMElaufterm));laufterm:=nachfolger(laufterm)END REP;kopieEND PROCkopiedervariablenliste;ABBILDUNG PROCauswertung(TERM CONSTterm):IF(termISstandardfunktion)COR(termISeigenefunktion)THENabbildung(NAMEterm)ELIFtermIStemporaerefunktionTHENabbildung(DEFINITIONterm)ELIFtermISabbildungsdyadeTHENausgewerteteabbildungsdyadeELIFtermISabbildungsmonadeTHENausgewerteterabbildungsmonadeELSEausgewerteteableitungsoperationEND IF.ausgewerteteabbildungsdyade:IF OPERATIONterm=plussymbolTHENauswertung(LINKSterm)+auswertung(RECHTSterm)ELIF OPERATIONterm=minussymbolTHENauswertung(LINKSterm)-auswertung(RECHTSterm)ELIF OPERATIONterm=multiplikationssymbolTHENauswertung(LINKSterm)*auswertung(RECHTSterm)ELIF OPERATIONterm=divisionssymbolTHENauswertung(LINKSterm)/auswertung(RECHTSterm)ELSEauswertung(LINKSterm)Oauswertung(RECHTSterm)END IF.ausgewerteterabbildungsmonade:IF OPERATIONterm=minussymbolTHEN-auswertung(OPERANDterm)ELSEauswertung(OPERANDterm)END IF.ausgewerteteableitungsoperation:ABBILDUNG VARloeschelement:=auswertung(ABBILDUNGSAUSDRUCKterm),neuefunktion:=ableitung(loeschelement,KOMPONENTEterm,INDEXterm);loeschetemporaereabbildung(loeschelement);neuefunktionEND PROCauswertung;TERM PROCkopie(TERM CONSTterm,LISTE CONSTvariablenliste):IFtermISvariableTHENauswahl(variablenliste,PLATZterm)ELIFtermIStermlisteTHENtermlistenkopie(term,variablenliste)ELIFtermISdyadischTHENnewdyade(kopie(LINKSterm,variablenliste),kopie(RECHTSterm,variablenliste),OPERATIONterm)ELIFtermISmonadischTHENnewmonade(kopie(OPERANDterm,variablenliste),OPERATIONterm)ELIFtermISfunktionsauswertungTHENnewfunktionsauswertung(abbildungskopie(ABBILDUNGSAUSDRUCKterm),kopie(ARGUMENTEterm,variablenliste),KOMPONENTEterm)ELIFtermISkonstanteTHENnewkonstante(WERTterm,NAMEterm)ELIFtermISselektionTHENnewselektion(kopie(BEDINGUNGterm,variablenliste),kopie(AKTIONterm,variablenliste),kopie(ALTERNATIVEterm,variablenliste))ELIFtermISlogischedyadeTHENnewlogischedyade(kopie(LINKSterm,variablenliste),kopie(RECHTSterm,variablenliste),
OPERATIONterm)ELIFtermISvergleichTHENnewvergleich(kopie(LINKSterm,variablenliste),kopie(RECHTSterm,variablenliste),OPERATIONterm)ELSEtermEND IF END PROCkopie;TERM PROCabbildungskopie(TERM CONSTterm):IFtermISabbildungsdyadeTHENnewabbildungsdyade(abbildungskopie(LINKSterm),abbildungskopie(RECHTSterm),OPERATIONterm)ELIFtermISabbildungsmonadeTHENnewabbildungsmonade(abbildungskopie(OPERANDterm),OPERATIONterm)ELIFtermISableitungsoperationTHENnewableitungsoperation(abbildungskopie(ABBILDUNGSAUSDRUCKterm),INDEXterm,KOMPONENTEterm,OPERATIONterm)ELSEtermEND IF END PROCabbildungskopie;TERM PROCtermlistenkopie(TERM CONSTterm,LISTE CONSTvariablenliste):LISTE VARausdruecke:=neueliste(nil,nil);TERM VARlaufterm:=LISTENANFANGterm;WHILElaufterm<>nilREPanhaengen(ausdruecke,newterm(kopie(AUSDRUCKlaufterm,variablenliste)));laufterm:=nachfolger(laufterm)END REP;newtermliste(listenanfang(ausdruecke),listenende(ausdruecke),laenge(ausdruecke))END PROCtermlistenkopie;TERM PROCausgewaehlterfunktionsterm(TERM CONSTterm):IF NOT(termISfunktionsauswertung)THENerrorstop(anwendungstext(1))END IF;AUSDRUCK((TERME DEFINITION ABBILDUNGSAUSDRUCKterm)ELEMENT(KOMPONENTEterm))END PROCausgewaehlterfunktionsterm;BOOL PROCidentischevordefiniertekonstanten(TERM CONSTl,r):vordefiniertekonstante(l)CANDvordefiniertekonstante(r)CAND NAMEl=NAMErEND PROCidentischevordefiniertekonstanten;BOOL PROCidentischevariablen(TERM CONSTl,r):(lISvariable)CAND(rISvariable)CAND(PLATZl=PLATZr)END PROCidentischevariablen;BOOL PROCvordefiniertekonstante(TERM CONSTpruefterm):(prueftermISkonstante)CAND((NAMEpruefterm=esymbol)COR(NAMEpruefterm=pisymbol))END PROCvordefiniertekonstante;BOOL PROCselektionshaltigetermliste(TERM CONSTt):IF NOT(tISausdruck)THENerrorstop(anwendungstext(203))END IF;TERM VARlauf:=t;WHILElauf<>nilREP IF(AUSDRUCKlauf)ISselektionTHEN LEAVEselektionshaltigetermlisteWITH TRUE END IF;lauf:=nachfolger(lauf)END REP;FALSE END PROCselektionshaltigetermliste;BOOL OP IST(TERM CONSTpruefterm,REAL CONSTpruefwert):(prueftermISkonstante)CAND(WERTpruefterm=pruefwert)END OP IST;TERM PROCerstesargument(TERM CONSTterm):AUSDRUCK LISTENANFANG ARGUMENTEtermEND PROCerstesargument;END PACKETabbildung
|