not_mem ber powodzeniem
// to notmember zakończy się
not_member(X, L) member(X, L), fail //jeżeli member zakończy się powodzeniem, to predykat fail spowoduje niepowodzenie dla not_member
not_member(X, L) member(X, L), !, fail //Teraz zabezpieczamy, żeby nie wykonało się przy nawrocie wejście w gałąź, która spowoduje zwrócenie prawdy i błąd.
Ostatecznie:
not_member(X, L) member(X, L), !, fail. not_member(_, _).
Dla dowolnego predykatu P:
not(P) call(P), !, fail. // meta próg ramowa nie, wartość zmiennej staje się celem. not(P).
W nowszej wersji można sobie napisać po prawej stronie samą zmienną i automatycznie zostanie to obsłużone.
Przy takim zapisie, wywołanie not(member(...)). Da się te nawiasy jakoś opuścić - na przyszłych zajęciach.
9. Wykład 9:
Punkt wyjścia do projektu - książka Bratki.
Bazy danych - ciąg dalszy:
Uzyskanie listy wszystkich wyników z bazy danych klientów (uzyskanie widoku zamówień dla klienta):
suma_zam(Klient, Suma) :-findall(W, zamowienie(_,_,W,Klient), Lista wartosci), sumuj_liste(Lista_wartosci, Suma).
sumuj_liste([], 0).
sumuj_liste([X|R], S) :- sumuj_liste(R, SI), S is Sl+X.
Zbiorczy termin dla procedur i faktów w PROLOGu to klauzula (clause).
Do dostępu do baz danych jest używany podzbiór PROLOGu bez struktur - DATALOG.
Subtelności dotyczące wprowadzania do bazy danych:
Przez klauzulę typu 'jest':
jest_klient(klient(...))
jest_zamówienie(zamowienie(...))
[WTF?! Dlaczego on tego nie może prosto wytłumaczyć...]