7. All-Antwort-Prädikate
Das folgende Programm verwendet die Technik der "Scheitern-getriebenen
Schleife", um alle Antworten zu einer Anfrage zu generieren und zu sammeln.
Dabei werden die Systemprädikate asserta und retract
verwendet, um die Zwischenergebnisse zu speichern:
42
?- dynamic(puffer/1).
alle(_, _, _) :- retract( puffer(_) ),
fail.
alle(X, Anfrage_X, _) :- Anfrage_X,
asserta( puffer(X) ),
fail.
alle(_, _, L) :- sammeln([], L).
sammeln(L1, L2) :- retract( puffer(X) ), !, sammeln([X|L1], L2).
sammeln(L, L).
member(M, [M|_]).
member(M, [_|R]) :- member(M, R).
Die folgende Sitzung bezieht sich auf Programm
P42:
:- alle(X, member(X, [a,b,c,c,d]), L).
X = X
L = [a, b, c, c, d]
yes.
:- alle(X, member(X, []), L).
X = X
L = []
yes.
:-
Das folgende Programm berechnet Mengen, d.h. erkennt mehrfache Vorkommen
des gleichen Elements:
43
:- dynamic(puffer/1).
menge(_, _, _) :- retract( puffer(_) ),
fail.
menge(X, Anfrage_X, _) :- Anfrage_X,
not puffer(X),
asserta( puffer(X) ),
fail.
menge(_, _, L) :- sammeln([], L).
sammeln(L1, L2) :- retract( puffer(X) ), !, sammeln([X|L1], L2).
sammeln(L, L).
member(M, [M|_]).
member(M, [_|R]) :- member(M, R).
Die folgende Sitzung bezieht sich auf Programm
P43:
:- menge(X, member(X, [a,b,c,c,c,d]), L).
X = X
L = [a, b, c, d]
yes.
:- menge(X, member(X, [5,5,2,2,6,3]), L).
X = X
L = [5, 2, 6, 3]
yes.
:-
Es stellen sich aber einige Schwierigkeiten:
:- [user].
mitarbeiter(norbert).
mitarbeiter(marion).
mitarbeiter(slim).
mitarbeiter(tim).
spricht(norbert, franzoesisch).
spricht(slim, franzoesisch).
spricht(X, deutsch).
yes.
:- alle(X, spricht(X, _), L).
X = X
L = [norbert, slim, X]
yes.
:- menge(X, spricht(X, _), L).
X = X
L = [norbert, slim]
yes.
:-
Offenbar, hängt das Ergebnis des Aufrufes
menge(X, spricht(X, _), L).
von der Reihenfolge der Definition für
spricht ab, wie die
folgende Sitzung zeigt:
:- [user].
spricht(X, deutsch).
spricht(norbert, franzoesisch).
spricht(slim, franzoesisch).
yes.
:- alle(X, spricht(X, _), L).
X = X
L = [X, norbert, slim]
yes.
:- menge(X, spricht(X, _), L).
X = X
L = [X]
yes.
:-
zum Seitenanfang
:-und die unterschiedliche Bedeutung der Kommata::-( p(X), (q(X,Y), r(Y)) )ist ein PROLOG-Term mit zwei Argumenten, die durch das Komma nachp(X)getrennt werden. Das zweite Argument ist die Konjunktion vonq(X,Y)mitr(Y). Das Komma nachq(X,Y)ist der Operator für die Konjunktion. Die Konjunktionq(X,Y), r(Y)muß hier geklammert werden, weil andernfallsq(X,Y)als zweites undr(Y)als drittes Argument von:-behandelt würde.