Probleme, Differenzen & Sonstiges


[ Zum Seminar "Programmierkonzepte und Programmiersprachen" ][ Zum Inhalt ][ Literaturverzeichnis und Internetquellen ]

Übersicht:



Der Cut !


Der Cut wird zumeist verwendet wenn der einmalige Erfolg einer Funktion erwünscht ist und nicht alle Lösungen die möglich sind.
Der Programmierer teil damit PROLOG mit, welche der vorherigen Wahlmöglichkeiten beim Backtracking nicht noch einmal berücksichtigt werden müssen.
Das System wird dabei an alle Ziele gebunden, die seit dem Aufruf des Vorgängerziels bis zum Cut gemacht wurden. Alternativen werden außer Acht gelassen, gesetzt Werte sind "fixiert".
Der Cut fungiert also wie ein "Zaun", der nur in eine Richtung überquert werden kann.
Ein Beispiel:
F :- A,B,C,!,D,E,F.
Konnten die Bedingungen A, B und C erfüllt werden, so sind diese Werte mit den gefundenen Lösungen fest belegt.
Kann nun D nicht erfüllt werden, so findet kein Backtracking (in dem versucht wird C neu zu belegen) statt.

Der Cut kann entscheiden ob Programm läuft oder nicht, bzw. dessen Effizienz verbessern, muss aber wohlüberlegt positioniert werden.Denn wenn Cuts eingesetzt werden um ein korrektes Verhalten für Ziele zu sichern besteht keine Garantie, dass auch weiterhin sinnvolle Ergebnisse (für eine andere Form) geliefert werden.

Da der Cut kein reines logisches Element ist, wird er von den strengen logischen Programmieren verpönt und ist nur etwas für "PROLOG-Hacker". (Ein Beispiel ist
hier zu finden)



Die "Verneinung"


Da PROLOG nicht zwischen „Nichtanwendbarkeit“ und Negation unterscheidet, ist eine "Negation" nur begrenzt funktionell.
Das fail entspricht ‚Scheitern‘ einer Klausel.(zum Beispiel gehts
hier entlang)
Wie das oben verlinke Beispiel zeigt, ist oft eine Kombination mit dem Cut vonnöten. Das not und das fail sind beides wie der Cut keine logischen Elemente und somit in einigen Regionen nur zähneknirschend geduldet, in einigen anderen herzhaft geliebt und ausgiebig genutzt.



Der Occur-Check


PROLOG testet bei der Unifizierung von Variablen durch Terme nicht, ob diese selbst darin vorkommen.
Diese kann wie im Anschluss aufgezeigt zu Endlosrekursionen führen.
Gegeben ist folgende Regel:
own_successor :- X = successor(X).
Stellt man nun die Anfrage
?- own_successor(X).
führt dieses zu
X = successor(successor(successor(successor(successor(successor(successor(successor(successor(successor(successor(successor(successor(successor(successor (successor(successor(successor(successor(successor(successor(successor(successor(successor(successor(successor (successor(successor(successor(successor(successor(successor(successor( . . .



Resumée


PROLOG realisiert
Kowalskis Definition und den Grundgedanken der logischen Programmierung.
Wie jedoch an den Beispielen zu sehen ist, ist keine 100%-ige Trennung möglich. Wie der Resolutions- und Unifikationsalgorithmus arbeiten und Lösungen gefunden werden hängt mit von der Struktur der Wissensbasis ab.

Des weitern werden nicht-logische Komponenten wie der Cut zuhilfe genommen, die auch einen grossen Einfluss auf oben genannte Löungsstrategien haben.

Von den Anhängern der strengen Typisierung wird kritisiert dass in PROLOG keine explizite Typüberprüfung von Variablen durchgeführt wird.

Da es keine Dokumentationsrichtlinien und Strukturen zur Modularisierung gibt gelten (besonders grössere) PROLOG-Programme (und hierbei besonders für Anfänger) als schwer lesbar und unübersichtlich.

Auch die hochgelobte "Mehrfachverwendung" von Datenbasen nicht immer möglich. Anfragen lassen sich nicht immer in allen Variationen stellen (siehe mod-Beispiel).

Als letzter Kritikpunkt sei noch bemerkt, dass die Horn-Klauseln (mit denen PROLOG arbeitet) eine Untermenge von Klauseln sind, ergo keine Normalform darstellen und ihr Aussagekraft somit eingeschränkt ist.


[ Zum Seminar "Programmierkonzepte und Programmiersprachen" ][ Zum Inhalt ][ Seitenanfang ][ Literaturverzeichnis und Internetquellen ]