|
fakt('gleichseitig','alle Winkel 60'). fakt('alle Winkel 60','gleichseitig'). fakt('rechtwinklig','a²+b²=c²'). fakt('a²+b²=c²','rechtwinklig'). fakt('rechtwinklig','c*p=a²'). fakt('rechtwinklig','c*q=b²'). fakt('rechtwinklig','p*q=h²'). fakt('p*q=h²','Höhensatz'). fakt('gleiche Seiten','kongruent'). fakt('kongruent','gleiche Seite'). fakt('kongruent','2 gleiche Winkel'). fakt('kongruent','gleiche Winkel'). fakt('2 gleiche Winkel','ähnlich'). fakt('ähnlich','Seitenverhältnisse gleich'). fakt('ähnlich','3 gleiche Winkel'). fakt('gleiche Seite','2 gleiche Winkel','kongruent').
flg(A):-write(A),write(' => ').
zimp(B,Z,_):-fakt(B,Z),flg(B),wrt(Z).
imp(B,Z):-zimp(B,Z,0). |
Parameter: Bedingung, Folgerung
Organisation der Bildschirmausgabe
fakt()-Zugriff mit 2 Bedingungen, dann rekursiver Aufruf, Abbruch bei N>=10 |
Das Programm findet man unter logik.pl. Man kann mit ihm experimentieren oder es auch erweitern.
Es kann noch eine Endlosschleife entstehen, indem eine Umformung wieder rückgängig gemacht wird und bei einem erneuten Aufruf ein 2. Mal
durchgeführt wird usw. . Verhindert werden soll dies durch den Cut !.
Der Cut bewirkt, dass er beim Programmablauf nur von oben nach unten und von links nach rechts übersprungen werden kann, aber nicht umgekehrt. Eine
Klausel vor dem Cut kann prinzipiell nach dessen Überspringen nicht mehr erreicht werden.
|
einf(X+Y*X,U):-einf((1+Y)*X,U). einf(Y*X+X,U):-einf((1+Y)*X,U). einf(X+X,U):-einf(2*X,U). einf(Y*X+Z*X,U):-einf((Y+Z)*X,U). einf(X+Y,Z):-einf(X,U),einf(Y,V),integer(U),integer(V),Z is U+V. einf(X*Y,Z):-einf(X,U),einf(Y,V),integer(U),integer(V),Z is U*V. einf(X+Y,U+V):-einf(X,U),einf(Y,V). einf(X*Y,U*V):-einf(X,U),einf(Y,V). einf(0*_,0). einf(0+X,X):-!. einf(1*X,X):-!. einf(X,X):-!. |
X+Y*X=(1+Y)*X Y*X+X=(1+Y)*X X+X=2*X Y*X+Z*X=(Y+Z)*X Vereinfachen von X+Y zu U+V, Berechnen von U+V, falls X,Y Zahlen dsgl. X*Y Vereinfachung von X zu U, Y zu V dsgl. für X*Y 0*Term=0 0+X=X, Cut zur Verhinderung von Schleifen 1*X=X, Cut X Endergebnis, wenn keine weitere Umformung möglich, Cut |
Aufrufe erfolgen mit einf(TERM,E)., wobei als TERM ein math. Term, bestehend aus Zahlen und Variablen, eingegeben werden kann. Als Rechenoperationen kann man + und * verwenden. E ist dann der vereinfachte Term bzw. das Rechenergebnis.
Beispiele: einf(3*x+6*x,E). einf(3*(x+4)*(6+x),E). einf(3*(2+6)+7*(2+6),E).
Das Programm findet man unter term.pl.
Aufgabe: Man überprüfe, ob und, falls ja, wodurch die Regel Punkt- vor Strichrechnung realisiert ist. Man erweitere das Programm so, dass es bei Addition und Multiplikation gegebenenfalls Zahlen vertauscht. Vorsicht: Gefahr von Endlosschleifen!