/*
Összegzés adatbáziskezelési eljárások segítségével.

(Természetesen továbbra is lehet a hagyományos módon összegezni,
vagyis úgy, hogy az eljárás paraméterei közé felveszünk egy paramétert
az aktuális összeg, egyet pedig a végeredmény számára, de lehet, hogy valaki
könnyebben érti ezt a változatot. ) 

*/


/*Az alábbi megoldás ugyanúgy kezeli az adatbázist, mint a procedurális nyelvek
a rekeszeket.*/

start1:- retractall(ossz(_)), assert(ossz(0)), szamol.

szamol :- write('van még szám? i/n '), read(V), V = i, 
	write(' a szám értéke: '), read(Sz), 
	ossz(Eddig), retract(ossz(Eddig)),
	Uj is Eddig + Sz, assert(ossz(Uj)),
	szamol.
szamol :- ossz(S), writef('A számok összege: %w\n', [S]).



/*
Másik összegzési lehetőség. (A feladat jellege is eltér az előzőtől.)
Az adatok adatbázisban vannak, retract-tal szervezzük meg a 
ciklust, de ha az adatokra később is szükségünk van, akkor vissza kell
írni őket.
*/

:- dynamic adat/2.

adat(kati,3).
adat(mari,4).
adat(géza,2).
adat(józsi,5).

start2 :- szamol(0), 
	writeln('\n\nCsak hogy lássa, megvannak az adatok: '), 
	forall(adat(Nev,Szam), writef('%w\t%w\n', [Nev,Szam])).


szamol(Eddig) :- adat(Nev,Db), Uj is Eddig + Db, retract(adat(Nev,Db)),
		assert(temp(Nev,Db)), szamol(Uj).
szamol(Veg) :- writef('Az adatok összege: %w', [Veg]), visszair.

visszair :- temp(Nev,Db), retract(temp(Nev,Db)), assert(adat(Nev,Db)),visszair.
visszair.



/*
Az előző adatokra egy újabb összegzési lehetőség.
*/

start3 :- retractall(osszeg(_)), assert(osszeg(0)), 
	forall(adat(_,Db),(
			   retract(osszeg(Eddig)), 
			   Uj is Eddig + Db, 
			   assert(osszeg(Uj))
			  )
	),
	osszeg(Veg), writef('Az adatok összege: %w', [Veg]).  


/*
Miért van egyik helyen retract, a másikon retractall? 
*/