Revision [6991]
This is an old revision of PrologProgrammierung made by ToBo on 2008-12-09 23:16:47.
Programmierung in Prolog
1. Grundfuktionen
Funktion | SWI-Prolog | GNU-Prolog |
---|---|---|
Das Programm MyKnowledge.pl laden. | consult('MyKnowledge.pl'). | (prolog)consult('MyKnowledge'). |
Auflisten des Programms | listing. | wie SWI |
Hilfe aufrufen | help(help). | wie SWI |
UND-Verknüpfung, Konjunktion | tochter(K,E):-kind(K,E), weiblich(K). | wie SWI |
ODER-Verknüpfung, Disjunktion | mensch(K):-maennlich(K); weiblich(K). | wie SWI |
Implikation (wenn, dann) | ||
Beenden | halt. | wie SWI |
Reload all laoded files | make. | |
Die Arbeitsweise von Prolog verfolgen | trace. | |
Wie trace, mit graphischer Oberfläche | gtrace | |
Zeit ermitteln | time(<goal>). z.B. time(run). | Wird auch so angezeigt |
2. Spezielle Themen
3. Operatoren
Operator | Bezeichnung |
---|---|
X mod Y | Modulo |
X*Y | Multiplikation |
X/Y | Division |
X+Y | Addition |
X-Y | Subtraktion |
X^Y | Potenz |
X=:=Y | Test auf Äquivalenz der Werte der Terme A =:= B , A und B müssen initialisiert sein |
X=\=Y | Test auf Antivalenz der Werte der Terme A =\= B , A und B müssen initialisiert sein |
X is Y | Zuweisung A is B , B muss initialisiert sein, X is a nicht möglich, aber X is 1 |
X = Y | Äquivalenz, A = B, vergleich, wenn eines nicht initialisiert ist, dann Zuordnung |
Test auf Äquivalenz | |
\= | Test auf Antivalenz |
X>Y | größer |
X<Y | kleiner |
X>=Y | größer oder gleich |
X=<Y | kleiner oder gleich |
not(X) | Negation |
; | ODER-Verknüpfung |
, | UND-Verknüpfung |
:- | Implikation, wenn -> dann, aber nicht nur dann, wenn! |
4. Rekursion
Bei Rekursion muss der einfache Fall immer zuerst definiert werden. Das ist z.B. die Berechnung der Fakultät von 0 oder bei den Beispiel mit den Vorgesetzten, der direkte Vorgesetzte.
Vorgesetzter (direkt und indirekt)
vorgesetzte(V,M):- direkter_vorgesetzte(V,M).
vorgesetzte(V,M):- direkter_vorgesetzte(V,Z), vorgesetzte(Z,M).
vorgesetzte(V,M):- direkter_vorgesetzte(V,Z), vorgesetzte(Z,M).
Fakultät berechnen
25_fak.pl
Gibt Zahlen von 1 bis theoretisch Unendlich aus
5. Zahlenbereich
Gibt Zahlen von A bis E aus. between(A,E,Zahl). nicht in GNU-Prolog.
between(1,3,N).
Between aus SWI-Prolog nachbilden.
6. Summe aller Prädikate
zahl(1).
zahl(7).
zahl(-3).
summe([], 0).
summe([H|T], S):-summe(T, A), S is A + H.
run(S):-
findall(N, zahl(N), L),
summe(L, S).
zahl(7).
zahl(-3).
summe([], 0).
summe([H|T], S):-summe(T, A), S is A + H.
run(S):-
findall(N, zahl(N), L),
summe(L, S).
7. forall
8. Dynamisch Prädikate erzeugen
% feste Benutzerliste
user(marc).
user(thomas).
user(andreas).
% Nachträglich hinzugefügte User berücksichtigen
user(U):-duser(U), U \= 1.
% Benutzer hinzifügen und löschen
add(User):-not(user(User)), asserta(duser(User)).
del(User):-retract(duser(User)).
run:-reset.
reset:-abolish(duser,1),asserta(duser(1)).
user(marc).
user(thomas).
user(andreas).
% Nachträglich hinzugefügte User berücksichtigen
user(U):-duser(U), U \= 1.
% Benutzer hinzifügen und löschen
add(User):-not(user(User)), asserta(duser(User)).
del(User):-retract(duser(User)).
run:-reset.
reset:-abolish(duser,1),asserta(duser(1)).