Einführung in die Methoden der Künstlichen Intelligenz - Goethe ...
Einführung in die Methoden der Künstlichen Intelligenz - Goethe ...
Einführung in die Methoden der Künstlichen Intelligenz - Goethe ...
Erfolgreiche ePaper selbst erstellen
Machen Sie aus Ihren PDF Publikationen ein blätterbares Flipbook mit unserer einzigartigen Google optimierten e-Paper Software.
5 Logisches Programmieren<br />
mitteilung(X,normal) :- X < 4,!.<br />
mitteilung(X,w<strong>in</strong>dig) :- X < 8,!.<br />
mitteilung(X,stuermisch).<br />
Beachte: Diese Implementierung sollte man nicht mit direkten Werten für <strong>die</strong> Ausgabe<br />
aufrufen. Da z.B ?- mitteilung(3,w<strong>in</strong>dig) wahr wird. Im Gegensatz dazu ergibt<br />
?- mitteilung(3,Y), Y=w<strong>in</strong>dig. falsch.<br />
Es stimmt nun auch nicht mehr: Das Programm verhält sich mit Cuts genauso wie ohne<br />
Cuts. Denn: Wenn wir <strong>die</strong> Cuts weglassen, erhalten wir<br />
mitteilung(X,normal) :- X < 4.<br />
mitteilung(X,w<strong>in</strong>dig) :- X < 8.<br />
mitteilung(X,stuermisch).<br />
Nun ergibt <strong>die</strong> Anfrage ?- mitteilung(3,Y), Y=w<strong>in</strong>dig. als Ergebnis true!.<br />
Das Beispiel demonstriert, dass das Hantieren mit Cuts zu semantischen Problemen<br />
führt, d.h. <strong>die</strong> Bedeutung <strong>der</strong> Programme kann sich än<strong>der</strong>n. E<strong>in</strong>e gute Programmierregel<br />
ist es, Cuts nur dann e<strong>in</strong>zusetzen, wenn das Weglassen <strong>der</strong> Cuts <strong>die</strong> logische Bedeutung<br />
nicht än<strong>der</strong>t, da ansonsten <strong>die</strong> Verständlichkeit und Wartbarkeit <strong>der</strong> Programme schwieriger<br />
wird.<br />
Wir betrachten e<strong>in</strong>ige Beispiele zur Programmierung mit Cut:<br />
Beispiel 5.3.7. Die Berechnung des Maximums zweier Zahlen kann wiefolgt <strong>in</strong> Prolog implementiert<br />
werden:<br />
max(X,Y,X) :- X >= Y.<br />
max(X,Y,Y) :- Y < X.<br />
Mit Cut kann man <strong>die</strong>s umschreiben zu:<br />
max(X,Y,X) :- X >= Y,!.<br />
max(X,Y,Y).<br />
Allerd<strong>in</strong>gs sollte man <strong>die</strong>ses Prädikat nicht direkt mit dem Ergebniswert aufrufen, denn z.B.<br />
?- max(3,1,1). ergibt wahr. Man sollte es daher <strong>in</strong> <strong>der</strong> Form ?- max(3,1,Z), Z=3. verwenden.<br />
Beispiel 5.3.8. Wir haben bereits den Enthaltentest e<strong>in</strong>es Elements <strong>in</strong> e<strong>in</strong>er Liste programmiert:<br />
member(X,[X|_]).<br />
member(X,[_|Y]) :-<br />
member(X,Y).<br />
Mit Cut können wir <strong>die</strong>s effizienter programmieren als:<br />
Stand: 7. Januar 2013 178 M. Schmidt-Schauß & D. Sabel, Skript KI, WS 2012/13