Frage

ich lese http://cs.union.edu/~striegnk/learn-prolog-now/html/node.html#subsec.l1.kb1Aber ich habe Probleme, das folgende Prädikat auszuführen:

SICStus 4.0.1 (x86-win32-nt-4): Tue May 15 21:17:49 WEST 2007
| ?- woman(mia).
! Existence error in user:woman/1
! procedure user:woman/1 does not exist
! goal:  user:woman(mia)
| ?- 

Wenn ich sie andererseits in eine Datei schreibe und die Datei konsultieren kann, scheint es gut zu funktionieren ...

Darf ich nur Prädikate in einer Datei definieren, die sie später konsultieren, um sie zu konsultieren? Kann ich es nicht einfach im Herausgeber selbst tun?

War es hilfreich?

Lösung

Sie sollten eintreten woman(mia). in eine Datei, um sie als Tatsache zu behaupten. Wenn Sie es in den Dolmetscher schreiben, wird es als Abfrage genommen, nicht als Tatsache.

Von dem SWI Prolog FAQ:

Begriffe, die Sie am Toplevel eingeben, sind Prozesse als Abfragen, während Begriffe, die in einer Datei angezeigt werden, die in Prolog geladen wird, als eine Reihe von Regeln und Fakten verarbeitet werden. Wenn ein Text wie unten liest, ist dies eine Regel.

carnivore(X) :- animal(X), eats_meat(X).

Der Versuch, dies am Toplevel einzugeben, führt zu dem folgenden Fehler. Wieso den? Weil eine Regel ein Begriff ist :-( Kopf, Körper) und weil das Toplevel Begriffe als Abfragen interpretiert. Es gibt kein Prädikat mit dem Namen:- und zwei Argumenten.

?- carnivore(X) :- animal(X), eats_meat(X). ERROR: Undefined
procedure: (:-)/2 ERROR:   Rules must be loaded from a file ERROR:  
See FAQ at http://www.swi-prolog.org/FAQ/ToplevelMode.txt

Ist das nicht dumm? Nun, nein. Angenommen, wir haben einen Begriff Eats_meat (Rataplan). Wenn dies in einer Datei erscheint, heißt es, dass Rataplan Fleisch isst. Wenn es im Toplevel erscheint, wird Prolog aufgefordert, zu beweisen, ob Rataplan Fleisch isst.

Wenn ein Text liest

:- use_module(library(clpfd)).

Dies ist eine Richtlinie. Richtlinien ähneln den Anfragen, aber anstatt das Toplevel zu bitten, etwas zu tun, bitten sie den Compiler, etwas zu tun. Wie Regeln und Fakten gehören solche Begriffe in Dateien.

Anstatt in eine Datei zu schreiben, können Sie auch verwenden assert im Toplevel (wie später auch in den FAQ erläutert).

Andere Tipps

Es ist ein wenig nervig, in der Replikation Prädikate zu machen. Du könntest es tun

| ?- ['user'].
woman(mia).
^D

dh konsultieren Benutzereingaben oder

| ?- assertz(woman(mia)).

behaupten. Beide unangenehme IMO - es könnte einen besseren Weg geben, aber ich weiß es einfach nicht. Im Allgemeinen ist es einfacher, ein Skript zu verwenden.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top