Assert in retract
Iz E-študij, proste zakladnice študentskega znanja
- Assert
- doda svojo vsebino v trenutno prologovo bazo znanja.
- asserta - na začetek
- assertz - na konec
- Retract
- pobriše vsebino iz baze znanja.
?- lepo. no ?- assert((lepo :- soncno)), assert(soncno). yes ?- lepo. yes yes ?- soncno. yes ?- asserta((lepo :- soncno)). yes ?- lepo. yes ?- retract(soncno). yes ?- lepo. no ?-
?- retract(otrok(X,Y)). X = metka Y = tone; X = tine Y = tone; no otrok(X,tone). no
Dodajanje dejstev
- Spreminjanje vrednosti
spremeni(Ime,Nova_vr) :- retract(vrednost(Ime,_)), assert(vrednost(Ime,Nova_vr)).
- Shranjevanje že izračunanih vrednosti
ni_pras(X) :- %ugotovi če število ni praštevilo - slaba verzija med(1,X,N), med(1,X,M), X is M*N. med(Min,Max,X) :- X is Min+1, X < Max. med(Min,Max,X) :- Min1 is Min + 1, Min1 < Max - 1, med(Min1,Max,X).
?- med(1,4,X). X = 2; X = 3; no
ni_pras_ucinkovito(X) :- %izboljšana verzija med(1,X,N), med(1,X,M), X is M*N,!, asserta(ni_pras_ucinkovito(X)). %doda rešitev na začetek programa ni_pras_ucinkovito(X) :- asserta((ni_pras_ucinkovito(X) :- !,fail)), %doda negativno rešitev !, fail. %da dobimo končni odgovor "no"
- Shranjevanje rezultatov v seznam
Procedura zberi shrani podatke v podatek().
podatek(a). podatek(b). podatek(c). podatek(konec). %konec baze podatkov ?- zberi(S). S = [c,b,a].
[] [a] [b,a] [c,b,a]
zberi(Seznam):- zberi1(Seznam,[]). zberi1(Seznam,Rtenutni) :- retract(podatek(Podatek)), (Podatek = konec, ! , Seznam = Trenutni; zberi1 (Seznam, [Podatek|Trenutni])).
- findall(X,Cilji,Seznam)
zbere v Seznam vse vrednosti X, za katere so Cilji izpolnjeni
findall(X,Cilji,S) :- asserta(podatek(konec)), call(Cilji), asserta(podatek(X)), fail. findall(_,_,S) :- zberi(S). ?- Cilji(X). X = X1; X = X2; X = X3; no
findall(X,Cilji(X),S). S = [X1,X2,X3].