Basiert Prolog wirklich auf der Annahme einer geschlossenen Welt?
Unter der geschlossenen Welt Annahme ,
Was derzeit nicht als wahr bekannt ist, ist falsch
Die Semantik von Prolog soll oft der Annahme einer geschlossenen Welt folgen, zum Beispiel hier :
Prolog basiert auf der Closed-World-Annahme (CWA) - das heißt, wenn ein Satz nicht in der Faktendatenbank enthalten ist und nicht aus der Faktendatenbank abgeleitet werden kann, ist er nicht wahr.
Es verhält sich jedoch nicht ganz so. Unter CWA würde ich erwarten
?- a.
false.
Aber stattdessen bekomme ich in SWI-Prolog:
?- a.
ERROR: Undefined procedure: a/0 (DWIM could not correct goal)
Warum ist das so? Ist es falsch zu sagen, dass Prolog auf CWA basiert?
Antworten
Wenn im Kontext von Prolog von Closed-World Assumption (CWA) gesprochen wird, muss zwischen unbekannten Prädikaten und bekannten Prädikaten für das (Laufzeit-) System unterschieden werden. In beiden Fällen Prädikate mit oder ohne Klauseln.
Das Aufrufen eines unbekannten Prädikats führt standardmäßig zu einem Prädikat-Existenzfehler. Es gibt ein Standard-Flag, unknown
dessen Standardwert ist error
, das gesetzt werden kann fail
. Das gibt Ihnen das Verhalten, nach dem Sie anscheinend suchen. Trotzdem rate ich Ihnen dringend, das Flag auf dem Standardwert von zu halten error
, da es die Erkennung von Programmierprädikaten (z. B. Tippfehler in Prädikatnamen oder Arität) erleichtert.
Was macht ein Prädikat bekannt auf die Laufzeit? Prädikatanweisungen oder Prädikatklauseln. Das bekannteste Beispiel ist die dynamic/1
Richtlinie. Wenn Ihr Code nur aus folgendem Text besteht:
:- dynamic(foo/1).
Nach dem Kompilieren und Laden können Sie Folgendes erwarten:
?- foo(_).
no.
Andere Richtlinien haben jedoch den gleichen Effekt (z. B. multifile/1
und discontiguous/1
unter der Annahme, dass dies eine standardkonforme Prolog-Implementierung ist!).
Daher ist für bekannte Prädikate die Interpretation von CWA in Prolog einfach: Was wir nicht als wahr beweisen können, ist falsch. Dh Negation durch Versagen , was nicht dasselbe ist wie logische Negation . Der Name Prolog stammt aus der Programmierung in der Logik, aber Prolog möchte auch eine pragmatische und praktische Programmiersprache sein.
Was in Prolog fehlt (und z. B. von Logtalk bereitgestellt wird ), ist die Möglichkeit , ein Prädikat zu deklarieren, ohne gezwungen zu sein, es als dynamisch oder multifile zu deklarieren, oder ... oder Klauseln dafür bereitzustellen (siehe z . B. dieses Beispiel ). Dies bietet eine einfachere und klarere CWA-Semantik: Das Aufrufen eines deklarierten Prädikats ohne Klauseln schlägt fehl (ohne dass das problematische unknown
Flag durcheinander gebracht werden muss ). Das Aufrufen eines nicht deklarierten Prädikats löst einen Prädikat-Existenzfehler aus.
Hoffe das hilft. Die Suche nach Negation als Misserfolg sollte weitere Klarstellungen liefern.
Ihre Anfrage muss in der Sprache selbst sein, denn a
um ein Satz zu sein, a/0
muss er in der Sprache sein, dh als Prädikat definiert. Alle Nullprädikate in der Sprache sind Sätze. Sie können einen neuen Begriff nicht als Prädikat abfragen, ohne ihn zuvor der Sprache hinzuzufügen.
Für , a/1
wenn Sie es definieren wie a(b).
es in der Sprache ist, dann ist die Abfrage a(X), dif(X,b)
fehlschlagen , da das Prolog System keine anderen Begriffe nicht kennt , die es erfüllen und in der Nähe Welt vorausgesetzt , es gibt kein anderes.