Schlussketten

Spezielle Dreiecke

Das Programm kann bekannte Sätze zu Dreiecken zu Schlussketten kombinieren, so dass neue Zusammenhänge aufgedeckt werden. Die benutzten Sprachelemente und Verfahren sind bereits aus den vorausgehenden Lektionen bekannt.

Das Programm

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(' => ').
wrt(A):-write(A),nl.

zimp(B,Z,_):-fakt(B,Z),flg(B),wrt(Z).
zimp(B,Z,N):-N<10,fakt(D,Z),zimp(B,D,N+1),flg(B),flg(D),wrt(Z).
zimp(B,C,Z,_):-fakt(B,C,Z),flg(B+C),wrt(Z).
zimp(_,C,Z,N):-zimp(C,Z,N).
zimp(B,_,Z,N):-zimp(B,Z,N).
zimp(B,C,Z,N):-N<10,fakt(D,E,Z),
     zimp(B,C,D,N+1),zimp(B,C,E,N+2),
     wrt(Z),flg(B+C),wrt(D),flg(B+C),wrt(E),flg(D+E),.

imp(B,Z):-zimp(B,Z,0).
imp(B,C,Z):-zimp(B,C,Z,0).

Parameter: Bedingung, Folgerung

 
 
 
 
 
 
 
 
 
 
 
 
 
Parameter: 1.Bedingung, 2.Bedingung, Folgerung

Organisation der Bildschirmausgabe

 
fakt()-Zugriff mit 1 Bedingung, Ausgabe: Bedingung=>Folgerung
wie oben, dann rekursiver Aufruf, N<10 verhindert Endlosschleife
fakt-Zugriff mit 2 Bedingungen, Ausgabe. Bedingungen=>Folgerung
unnötige Bedingung forlassen

fakt()-Zugriff mit 2 Bedingungen, dann rekursiver Aufruf, Abbruch bei N>=10
 
 
 
 
Start von zimp mit 1 Bedingung
Start von zimp mit 2 Bedingungen


Startet man z.B. mit imp('rechtwinklig',F), so werden alle hier aufgeführten Aussagen aufgelistet, die für rechtwinklige Dreiecke gelten. Gibt man umgekehrt imp(B,'2 gleiche Winkel') ein, so erhält man alle Bedingungen, die zu zwei gleichen Winkeln im Dreieck führen, also Ähnlichkeit und schärfer Kongruenz. Es ist aber auch möglich, dass eine Schlusskette über mehrere Stufen entsteht, also deduktive Beweise, ein Teilgebiet der KI.

Das Programm findet man unter logik.pl. Man kann mit ihm experimentieren oder es auch erweitern.

Termumformungen

In der Mathematik ist es sinnvoll, Terme in einer anderen Form darzustellen. Dies lässt sich mit gewissen Einschränkungen auch durch ein Prolog-Programm durchführen. Es sollen hier nur das Assoziativ- und das Distributivgesetz angewandt werden, dazu einfache Rechenregeln. Beim Kommutativgesetz gibt es Probleme, die nicht einfach zu lösen sind.

Das Programm

Das Prädikat einf(T,E) enthält als Parameter T einen Term, der in den einzelnen Klauseln umgeformt wird, und als E das Endergebnis.
Termumformungen geschehen dadurch, dass links von :- als T ein Term vorgegeben wird, der dann bei einem erneuten Aufruf von einf() rechts von :- durch den umgeformten Term ersetzt wird. Erst zum Schluss wird E durch zahlenmäßiges Berechnen von T oder durch Kopieren von T bestimmt. Auf diese Weise enthält E den Endstand der Umformungen.

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!