Programmierung in Prolog
1. Grundfuktionen
| Funktion | SWI-Prolog | GNU-Prolog |
|---|---|---|
| Das Programm MyKnowledge.pl laden. | consult('MyKnowledge.pl'). | 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. 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! |
3. 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
4. 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.
5. 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).
6. forall
7. 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)).
8. Entwurfsmuster
OAW-Trippel
oaw(Objekt, Attribut, Wert).
Skript Seite 14
vwz(Linguistische_Variable, Linguistischer_Wert, Zugehoerigkeitswert).