Looking for prolog Keywords? Try Ask4Keywords

Prolog LanguageErste Schritte mit Prolog Language


Bemerkungen

Implementierungen

  1. SWI-Prolog (kostenlos)
    • Umgesetzt in
  2. SICStus (kommerziell)
  3. YAP (kostenlos)
  4. GNU Prolog (kostenlos)
  5. XSB (kostenlos)
  6. B (kommerziell)
  7. IF (kommerziell)
  8. Ciao (kostenlos)
  9. Minerva (gewerblich)
  10. ECLiPSe-CLP (kostenlos)
  11. Jekejeke Prolog (gewerblich)
  12. Prolog IV
  13. Ertragsprolog (kostenlos)
  14. Visual Prolog (kommerziell)

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. ZB X , 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 und Y ist X ein Kind von Y wenn Y ein Vater von X oder Y eine Mutter von X .

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 und Y die Beziehung child_of zwischen X und Y wenn die Beziehung father_child zwischen Y und X oder die Beziehung mother_child zwischen Y und X .

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.

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ählen ppa: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 Befehlszeile swipl