Prolog Grundlagen

Grundlagen der Prolog Syntax. Fakten, Prädikate, Atome, Konstanten



Fakten
Fakten beschreiben Aussagen, die wahr sind. Sie haben die Form einer Prädikatsaussage pred( arg1, arg2, ..., argn ). Dabei stehen arg1, arg2, ..., argn für n Konstante, und pred für den Namen eines Prädikats. Alle Fakten zum selben Prädikat stellen eine Relation dar.

Konstanten
Konstanten sind symbolische Namen für konkrete Objekte einer Problemwelt.

Prädikate
Prädikate beschreibt eine Beziehung zwischen den Objekten, den Argumenten des Prädikats. Prädikate heißen n-stellig (n=0,1,2,...) Prädikate, wenn diese n Argumente besitzten. Jedes Prädikat ist durch seinen Namen und seine Wertigkeit n eindeutig bestimmt (Schreibweise: pred/n).

Datenbasis
Die Gesamtheit aller Fakten bildet eine Datenbasis

/*
* Fakt zum (einstelligen) Prädikat tiere/1
*/

tier( hund ).
tier( katze ).
tier( maus).
Syntax
Jeder Fakt muss durch einen Punkt abgeschlossen werden.

Zwischen Prädikatsname und öffnender Klammer ( darf kein Leerzeichen stehen.

Prädikatsnamen müssen (Prolog-)Atome sein:

Atome sind entweder Zeichenfolgen, die mit einem Kleinbuchstaben beginnen müssen und ansonsten aus beliebigen
Buchstaben, Ziffern oder dem Unterstreichungszeichen _ bestehen dürfen (Beispiele: diesIstEinAtom, auch_das_ist_erlaubt ) oder in Hochkommata eingerahmte beliebige Zeichenfolgen (Beispiel: 'c:\Eigene Dateien\LogProg') oder (fast 1) beliebige Folgen, die aus dem Zeichenvorrat # $ & * + - / : < = > ? @ \ ^ ~
gebildet werden.

Beispiel: &&#?


Konstante sind entweder Atome (Beispiele: lach_doch_mal, wurst )
oder ganze Zahlen (Beispiel: -963)
oder Gleitpunktzahlen (Beispiele: 2.0, -6.53e-36)
oder Strings (Beispiele: `Das ist ein String`, `Preis inkl. 17% MwSt.: 20,00 ?`).

Unterschied zwischen Atom und String
Ein Atom wird intern als Pointer in einer Symboltabelle repräsentiert ("Dictionary"). Vergleiche zwischen zwei Atomen laufen daher gehr schnell ab.

Ein String wird als Array (Liste) von einzelnen Zeichen im ASCII-Code repräsentiert. Dadurch entsteht ein hoher Speicherbedarf. Der Vergleich zweier Strings erfolgt Zeichen für Zeichen und ist deshalb zeitaufwändiger. Strings werden meist nur für die Ein- oder Ausgabe von Texten von/auf Dateien oder Peripheriegeräte verwendet.
Numerische Vergleichsoperatoren
X=:=Y (numerisch gleich)
X=\=Y (numerisch ungleich)
X Y>Y (X größer Y)
X= X>=Y (X größer geich Y)

/*
* Numerische Vergleichsoperatoren
*/

% numerisch gleich
X =:= Y

% numerisch ungleich
X =\= Y

% X kleiener Y
X < Y

% X größer Y
Y > Y

% X kleiner gleich Y
X =< Y

% X größer geich Y
X >= Y
/*
* Vergleich und Zuweisung von Zeichenketten
*/

% unifizierbar (Zuweisung )
X = Y

% nicht unifizierbar
X \= Y

% identisch (Vergleich)
X == Y

% nicht identisch mit (Vergleich)
X \== Y
/*
* Grundrechenoperationen
*/

% Addition
X + Y

% Subtraktion
X - Y

% Multiplikation
X * Y

% ganzzahlige Division
X // Y

% Rest einer ganzzahlige Division
X mod Y

% normale Division
X / Y

% Numerische Zweisung
% Das Ergebnis einer Rechenoperation muss immer einer Variablen
% übergeben werden
X is Y
X is Y + Z
/*
* Wichtige Standardprädikate
*/

% append/3
% Fügt zwei Listen zusammen
append( Liste1, Liste2, Ergebnis ).

% assert/1
% Erstellt am Ende einer Datenbasis neues dynamisches Prädikat
assert( prädikat(wert1, wert2) ).

% listing/0
% Gibt alle dynamischen Prädikate aus
listing.

% retract/1
% Löscht das erste dynamische Prädikat
retract( prädikat(wert1, wert2) ).

% retractall/1
% Löscht alle dynamischen Prädikate der verlangten Gattung
retractall( prädikatenKopf ).

% member/3
% Gibt die Position aus, an der das zu suchende Wort in der Liste steht
member( Suche, [wert1, wert2, wert3], Ausgabe ).

% repeat/0
% Prädikat trifft immer zu
% Prädikat für Backtracking an Anfang stellen
repeat.

% fail/0
% Prädikat ist immer ungültig
% Prädikat an den Schluß stellen, um Backtracking zu erzwingen
fail.

% \+()
% Not-Prädikat trifft zu, wenn "not" fehlschlägt
\+( not ).

% read/1
% Liest den Eingabestrom und speichert das Ergebnis in Input ab
read( Input ).

% write/1
% Schreibt in den Ausgabestrom
write( `Der Ausgabetext` ).
write( DieAusgabeVariable )

% !
% Cut bricht Backtracking ab
!.

% sort/2
% Sortiert eine Liste
sort( [hund, katze, maus] ).

% string_char/2
% Liefert den ASCII-Code aller Zeichen in einer Liste
string_chars( affe, N ). % Ergebnis an N übergeben
string_chars( affe, [97, 102, 102, 101]). % Vergleich