====== Rez & negacija ====== - Rez (''!'') * preprečuje vračanje (//backtracking//) * primer * ''parent(thomas, X), parent(X, Y)'' * ''parent(thomas, X), parent(X, Y), !'' * ''parent(thomas, X), !, parent(X, Y)'' * ''!, parent(thomas, X), parent(X, Y)'' * v ''min/2'' uporabimo rez, da se izognemo pogoju v drugi rekurzivni veji * skupaj naredimo ''count/3'' - Negacija * negacija kot neuspeh (//negation-as-failure//) * ''not(P) :- P, !, fail ; true.'' * uporabimo lahko tudi operator ''\+'' * predpostavka zaprtega sveta (//closed-world assumption//) * ''not(female(xy))'' * spremenljivke pod negacijo ne dobijo vrednosti * ''\+ female(X), parent(thomas, X)'' * ''parent(thomas, X), \+ female(X)'' - Naloge * ''union(A, B, U)'' * ''U'' = ''A'' ∪ ''B'' * ''intersect(A, B, I)'' * ''I'' = ''A'' ∩ ''B'' * ''diff(A, B, D)'' * ''D'' = ''A'' - ''B'' * ''is_superset/2'' * ''A'' ⊇ ''B'' * ''is_subset(A, B)'' * ''A'' ⊆ ''B'' * ''subset/2'' * generiraj vse podmnožice * ''powerset/2'' * razloži ''findall/3''