2009-12-03 3 views
5

Ich bin neu in Prolog und ich habe bisher gelernt, wie man ein Prädikat in einer Datei definieren und den Interpreter ausführen, um es zu verwenden. Aber ich würde gerne wissen, ob es eine Möglichkeit gibt, das Prädikat an der? - Eingabeaufforderung zu definieren, damit ich nicht hin und her wechseln muss.Wie definiert man ein Prädikat in Prolog

so, wie ich es jetzt tue, ist wie diese

Datei defs.pl:

adjacent(1,2). 
adjacent(1,3). 

im Prolog-Interpreter:

?- consult('defs.pl'). 
% defs.pl compiled 0.00 sec, 122 bytes 
true. 
?- adjacent(1,2). 
true. 

EDIT vielleicht bedeuten, dass ich, wie zu definieren, Fakten Ich bin mir nicht sicher.

Antwort

9

können Sie das assert/1 Prädikat verwenden:

?- assert(adjacent(1,4)). 
true 

EDIT: By the way, das wird nicht funktionieren, wenn Sie versuchen, es in einer Datei definiert mit Prädikaten zu kombinieren. Definieren Sie also alle angrenzenden/2 Prädikate in Ihrer Datei, definieren Sie alle mit assert in der Befehlszeile.

Wenn Sie einige der Prädikate in der Datei, und andere mit assert definieren wollen, dann in der Datei angeben, die das Prädikat dynamisch ist:

% file contents 
:- dynamic(adjacent/2). 
adjacent(1,2). 
adjacent(1,3). 
4

Sie tun können

?- consult(user). 

oder

?- [user]. 

und gibt die Klauseln danach, beendet dann den Eingang mit dem Ende der Datei ch (Strg-D in Linux, könnte Strg-Z in MS-Windows sein). Dies entspricht dem Lesen einer Datei, siehe the documentation of consult/1.

assert/1 und retract/1 sind für Prädikate gedacht, die dynamisch vom Code geändert werden (d. H. Zum Speichern globaler Daten), nicht für normale Programmierung.

+0

Ich stimme zu, das ist wahrscheinlich, wofür sie entwickelt wurden, aber ich sehe das Problem nicht, diese (da sie verfügbar sind) zu verwenden, um Prolog schnell zu testen und zu lernen. Overhead sollte kein Problem sein. Während ich denke, dass Ihre Lösung sauberer ist, müssen Sie auch alle bereits definierten Prädikate erneut eingeben, wenn Sie mehr hinzufügen möchten. – catchmeifyoutry