home *** CD-ROM | disk | FTP | other *** search
Prolog Source | 1987-06-23 | 5.0 KB | 126 lines |
- /****************************************************************************/
- /* "VEREINFACHER" */
- /* */
- /* PREDIKAT: vereinfache(term,term) */
- /* VORAUSSETZUNGEN: DOMAIN term */
- /* Vereinfacht terme in der Baumnotation */
- /****************************************************************************/
- /* STEHT AUS DEKLARATIONSGRUENDEN VOR DEM ABLEITER/INTEGRATOR */
-
-
- predicates
- vereinfache(term,term)
- vereinfacheOperation(term,term)
- separiereDualTerm(term,term,term)
- konstruiereDualTerm(term,term,term,term)
- atomarerTerm(term).
- rotiereBaum(term,term)
- sortiereArgs(term,term,term,term)
- rotOp(term)
- eqOp(term,term)
- istNConst(term)
-
- /* Zusammenziehen von Termen */
- include "ZUZIEH.PRO"
-
- clauses
-
- /* Terme vereinfachen */
- vereinfache(A,A) :-
- atomarerTerm(A) AND !.
- vereinfache(A,AV) :-
- vereinfacheOperation(A,AV), !.
- vereinfache(A,AV) :-
- zusammenziehen(A,AZ), !, vereinfache(AZ,AV).
- vereinfache(A,AV) :-
- rotiereBaum(A,AR),
- separiereDualTerm(AR,A1,A2),
- vereinfache(A1,A1V), vereinfache(A2,A2V),
- konstruiereDualTerm(A,A1V,A2V,NA),
- vereinfacheOperation(NA,AV) AND !.
- vereinfache(A,AV) :-
- rotiereBaum(A,AR),
- separiereDualTerm(AR,A1,A2),
- vereinfache(A1,A1V), vereinfache(A2,A2V),
- konstruiereDualTerm(A,A1V,A2V,AV).
- vereinfache(funk(Name,Arg),funk(Name,ArgV)) :-
- vereinfache(Arg,ArgV), !.
- vereinfache(npot(Basis,Exp),npot(BasisV,ExpV)) :-
- vereinfache(Basis,BasisV), vereinfache(Exp,ExpV), !.
-
-
- /* Operatoren, bei denen Baumrotationen sinnvoll sind */
- rotOp(mal(_,_)). rotOp(plus(_,_)).
-
- /* "Rotieren" des Baum */
- rotiereBaum(A,A) :-
- atomarerTerm(A), !.
- rotiereBaum(funk(Name,Arg),funk(Name,ArgRot)) :-
- rotiereBaum(Arg,ArgRot), !.
- rotiereBaum(npot(Basis,Exp),npot(BasisRot,ExpRot)) :-
- rotiereBaum(Basis,BasisRot), rotiereBaum(Exp,ExpRot), !.
- rotiereBaum(A,Arot) :-
- rotOp(A), separiereDualTerm(A,A1,A2), eqOp(A,A1),
- sortiereArgs(A1,A2,NA1,NA2), konstruiereDualTerm(A,NA1,NA2,Arot) AND !.
- rotiereBaum(A,Arot) :-
- rotOp(A), separiereDualTerm(A,A1,A2), eqOp(A,A2),
- sortiereArgs(A1,A2,NA1,NA2) AND konstruiereDualTerm(A,NA1,NA2,Arot), !.
- rotiereBaum(A,Arot) :-
- separiereDualTerm(A,A1,A2) AND !
- AND rotiereBaum(A1,A1rot), rotiereBaum(A2,A2rot),
- konstruiereDualTerm(A,A1rot,A2rot,Arot).
-
- sortiereArgs(nconst(X),Op,N1,N2) :-
- separiereDualTerm(Op,A1,A2), atomarerTerm(A1), not(istNConst(A1)),
- konstruiereDualTerm(Op,nconst(X),A2,N2), !,
- N1 = A1.
- sortiereArgs(nconst(X),Op,N1,N2) :-
- separiereDualTerm(Op,A1,A2), atomarerTerm(A2), not(istNConst(A2)),
- konstruiereDualTerm(Op,nconst(X),A1,N2), !,
- N1 = A2.
- sortiereArgs(A,nconst(X),C,D) :-
- not(istNConst(A)), ! , sortiereArgs(nconst(X),A,C,D).
- sortiereArgs(X,Op,X,Op) :-
- separiereDualTerm(Op,nconst(_),nconst(_)).
-
- /* Simple Vereinfachungen */
- vereinfacheOperation(plus(nconst(A),nconst(B)),nconst(AB)) IF
- ! AND AB = A+B.
- vereinfacheOperation(minus(nconst(A),nconst(B)),nconst(AB)) IF
- ! AND AB = A-B.
- vereinfacheOperation(mal(nconst(A),nconst(B)),nconst(AB)) IF
- ! AND AB = A*B.
- vereinfacheOperation(mal(nconst(0),_),nconst(0)) IF !.
- vereinfacheOperation(mal(_,nconst(0)),nconst(0)) IF !.
- vereinfacheOperation(mal(nconst(1),A),A) IF !.
- vereinfacheOperation(mal(A,nconst(1)),A) IF !.
- vereinfacheOperation(div(nconst(0),_),nconst(0)) IF !.
- vereinfacheOperation(div(A,nconst(1)),A) IF !.
- vereinfacheOperation(funk(exp,nconst(0)),nconst(1)) IF !.
- vereinfacheOperation(npot(_,nconst(0)),nconst(1)) IF !.
- vereinfacheOperation(npot(nconst(0),_),nconst(0)) IF !.
- vereinfacheOperation(npot(nconst(1),_),nconst(1)) IF !.
- vereinfacheOperation(npot(nconst(A),nconst(B)),nconst(C)) IF
- A > 0 AND ! AND D = ln(A), E = D*B, C=exp(E).
-
-
- /* Argumente aus Funktor herausloesen */
- separiereDualTerm(plus(A,B),A,B). separiereDualTerm(minus(A,B),A,B).
- separiereDualTerm(mal(A,B),A,B). separiereDualTerm(div(A,B),A,B).
-
- /* Argumente in Funktor einfuegen */
- konstruiereDualTerm(plus(_,_),A,B,plus(A,B)).
- konstruiereDualTerm(minus(_,_),A,B,minus(A,B)).
- konstruiereDualTerm(mal(_,_),A,B,mal(A,B)).
- konstruiereDualTerm(div(_,_),A,B,div(A,B)).
-
- atomarerTerm(var(_)). atomarerTerm(const(_)).
- atomarerTerm(nconst(_)).
-
- eqOp(plus(_,_),plus(_,_)). eqOp(minus(_,_),minus(_,_)).
- eqOp(mal(_,_),mal(_,_)). eqOp(minus(_,_),minus(_,_)).
-
- istNConst(nconst(_)).
-
-
-