Prolog Language Tutorial
Erste Schritte mit Prolog Language
Suche…
Bemerkungen
Implementierungen
- SWI-Prolog (kostenlos) swi-prolog
- Umgesetzt in c
- SICStus (kommerziell) sicstus-prolog
- YAP (kostenlos) yap
- GNU Prolog (kostenlos) Gnu-Prolog
- XSB (kostenlos) xsb
- B (kommerziell) b-prolog
- IF (kommerziell)
- Ciao (kostenlos)
- Minerva (gewerblich)
- ECLiPSe-CLP (kostenlos) Eclipse-CLP
- Jekejeke Prolog (gewerblich)
- Prolog IV
- Ertragsprolog (kostenlos)
- Implementiert in c # , Javascript und Phyton
- Visual Prolog (kommerziell) Visual-Prolog
Installation oder Setup
SWI-Prolog
Windows und Mac:
- Laden Sie SWI-Prolog auf der offiziellen Website herunter
- Einfach installieren, indem Sie den Anweisungen des Installationsprogramms folgen.
Linux (PPA):
Fügen Sie PPA
ppa:swi-prolog/stable
zu den Softwarequellen Ihres Systems hinzu (Entwickler wählenppa:swi-prolog/devel
):Öffnen Sie ein Terminal (Strg + Alt + T) und geben Sie
sudo add-apt-repository ppa:swi-prolog/stable
:sudo add-apt-repository ppa:swi-prolog/stable
Aktualisieren Sie anschließend die Paketinformationen:
sudo apt-get update
Installieren Sie nun SWI-Prolog über den Paketmanager:
sudo apt-get install swi-prolog
Sie können SWI-Prolog jetzt mit Command
swipl
über die Befehlszeileswipl
anhängen / 3
append([], Bs, Bs).
append([A|As], Bs, [A|Cs]) :-
append(As, Bs, Cs).
append/3
ist eine der bekanntesten Prolog-Beziehungen. Sie definiert eine Beziehung zwischen drei Argumenten und ist wahr, wenn das dritte Argument eine Liste ist, die die Verkettung der Listen angibt, die im ersten und zweiten Argument angegeben sind.
append/3
kann, wie es für guten Prolog-Code typisch ist, in verschiedene Richtungen verwendet werden:
Hängen Sie zwei vollständig oder teilweise instanziierte Listen an:
?- A = [1, 2, 3], B=[4, 5, 6], append(A, B, Y) Output: A = [1, 2, 3], B = [4, 5, 6], Y = [1, 2, 3, 4, 5, 6].
Überprüfen Sie, ob die Beziehung für drei vollständig instanziierte Listen wahr ist:
?- A = [1, 2, 3], B = [4, 5], C = [1, 2, 3, 4, 5, 6], append(A, B, C) Output: false
Generiere alle Möglichkeiten, um zwei Listen an eine bestimmte Liste anzuhängen:
?- append(A, B, [1, 2, 3, 4]). Output: A = [], B = [1, 2, 3, 4] ; A = [1], B = [2, 3, 4] ; A = [1, 2], B = [3, 4] ; A = [1, 2, 3], B = [4] ; A = [1, 2, 3, 4], B = [] ; false.
CLP (FD) -Einschränkungen
CLP (FD) -Einschränkungen werden von allen ernsthaften Prolog-Implementierungen bereitgestellt. Sie erlauben uns, auf reinste Weise über ganze Zahlen zu denken.
?- X #= 1 + 2.
X = 3.
?- 5 #= Y + 2.
Y = 3.
Datenbankprogrammierung
Prolog kategorisiert alles in:
- Atome - Eine beliebige Folge von Zeichen, die nicht mit einem Großbuchstaben beginnen. ZB -
a
,b
,okay
- Zahlen - Es gibt keine spezielle Syntax für Zahlen. Es ist keine Deklaration erforderlich. ZB
1
,22
,35.8
- Variablen - Eine Zeichenfolge, die mit einem Großbuchstaben oder Unterstrich (
_
) beginnt. ZBX
,Y
,Abc
,AA
- Komplexe Begriffe - Sie bestehen aus einem Funktor und einer Folge von Argumenten . Der Name eines komplexen Begriffs ist immer ein Atom, während Argumente entweder Atome oder Variablen sein können. ZB
father(john,doe)
,relative(a)
,mother(X,Y)
.
Eine Logikdatenbank enthält eine Reihe von Fakten und Regeln .
Ein komplexer Begriff mit nur Atomen als Argumenten wird Fakt genannt, während ein komplexer Begriff mit Variablen als Argumente als Regel bezeichnet wird.
Beispiel für Fakten in Prolog:
father_child(fred, susan).
mother_child(hillary, joe).
Beispiel für eine Regel in Prolog:
child_of(X,Y):-
father_child(Y,X)
;
mother_child(Y,X).
Beachten Sie, dass die ;
hier ist wie der Operator or
in anderen Sprachen.
Prolog ist eine deklarative Sprache und Sie können diese Datenbank wie folgt lesen:
Fred ist der Vater von Susan
Hillary ist die Mutter von Joe.
Für alle
X
undY
istX
ein Kind vonY
wennY
ein Vater vonX
oderY
eine Mutter vonX
.
In der Tat, eine endliche Menge von Fakten und Regeln oder bildet als Logikprogramm.
Die Verwendung eines solchen Programms wird durch Abfragen demonstriert. Mit Abfragen können Sie Informationen aus einem Logikprogramm abrufen.
Um die Datenbank in den Interpreter zu laden (vorausgesetzt, Sie haben die Datenbank in dem Verzeichnis gespeichert, in dem Sie den Interpreter ausführen), geben Sie einfach Folgendes ein:
?- [nameofdatabase].
Ersetzen des nameofdatabase
der nameofdatabase
durch den tatsächlichen Dateinamen (Beachten Sie, dass wir hier die Erweiterung .pl
für den Dateinamen ausschließen).
Beispiel für Abfragen im Interpreter für das obige Programm und die Ergebnisse:
?- child_of(susan,fred).
true
?- child_of(joe,hillary).
true
?- child_of(fred,susan).
false
?- child_of(susan,hillary).
false
?- child_of(susan,X).
X = fred
?- child_of(X,Y).
X = susan,
Y = fred ;
X = joe,
Y = hillary.
Die obigen Fragen und ihre Antworten können wie folgt gelesen werden:
Ist Susan ein Kind von Fred? - wahr
Ist Joe ein Kind von Hillary? - wahr
ist Fred ein Kind von Susan? - falsch
Ist Susan ein Kind von Hillary? - falsch
von wem ist susan ein kind? - Fred
So programmieren wir Logik in Prolog. Ein Logikprogramm ist formeller: eine Menge von Axiomen oder Regeln, die Beziehungen (auch als Prädikate bezeichnet) zwischen Objekten definieren. Eine alternative Möglichkeit, die obige Datenbank auf eine formalere Logik zu interpretieren, ist:
Die Beziehung zwischen Vater und
father_child
zwischen Fred und Susan
Die Beziehung zwischen Mutter und
mother_child
zwischen Hillary und Joe
Für alle
X
undY
die Beziehungchild_of
zwischenX
undY
wenn die Beziehungfather_child
zwischenY
undX
oder die Beziehungmother_child
zwischenY
undX
.
Hallo Welt
Hallo, Welt im interaktiven Dolmetscher
"Hallo, Welt!" Drucken im Prolog-Interpreter (hier verwenden wir swipl
, die Shell für SWI Prolog):
$ swipl
<...banner...>
?- write('Hello, World!'), nl.
?-
Ist die Systemaufforderung: Gibt an, dass das System für den Benutzer bereit ist, eine Folge von Zielen (dh eine Abfrage ) einzugeben, die mit einem beendet werden muss .
(Punkt).
Hier write('Hello World!'), nl
die Abfrage write('Hello World!'), nl
hat zwei Ziele:
-
write('Hello World!')
:'Hello World!'
muss angezeigt werden und (,
) - Eine neue Zeile (
nl
) muss folgen.
write/1
(das /1
wird verwendet, um anzuzeigen, dass das Prädikat ein Argument enthält) und nl/0
sind eingebaute Prädikate (die Definition wird im Voraus vom Prolog-System bereitgestellt). Eingebaute Prädikate bieten Funktionen, die nicht durch reine Prolog-Definitionen erhalten werden können, oder um den Programmierer davon abzuhalten, sie definieren zu müssen.
Die Ausgabe:
Hallo Welt!
Ja
endet mit yes
was bedeutet, dass die Abfrage erfolgreich war. In einigen Systemen wird true
anstelle von yes
gedruckt.
Hallo Welt aus einer Datei
Öffnen Sie eine neue Datei mit dem Namen hello_world.pl
und fügen Sie den folgenden Text ein:
:- initialization hello_world, halt.
hello_world :-
write('Hello, World!'), nl.
Die initialization
gibt an, dass das Ziel hello_world, halt
aufgerufen werden soll, wenn die Datei geladen wird. halt
das Programm.
Diese Datei kann dann von Ihrer ausführbaren Prolog-Datei ausgeführt werden. Die genauen Flags hängen vom Prolog-System ab. Wenn Sie SWI Prolog verwenden:
$ swipl -q -l hello_world.pl
Dies erzeugt eine Ausgabe Hello, World!
. Das Flag -q
unterdrückt das Banner, das normalerweise angezeigt wird, wenn Sie run swipl
. Das -l
gibt eine zu -l
Datei an.