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.