/*
A vörösiszap katasztrófa áldozatainak adományokat gyûjtenek.
Tároljuk, hogy melyik cég mit adományozott és milyen értékben.
adomany(ceg, termek, ertek).

a) melyik volt az a cég, amelyik több, mint kétfélét adott? 
	rávezetõ - több, mint egy félét, azaz legalább kétfélét
	rávezetõ kibõvítése - összes olyan cég, amelyik több, mint egy félét adományozott
	variácio - legfeljebb kettõt
	variáció kibõvítése - összes olyan cég, amelyik legfeljebb kettõt adományozott
b) melyik adomány volt a legértékesebb?
c) milyen termek adtak?
d) mennyi értékben adományozott egy beolvasott cég?
e) mely ceg adományozott egy beolvasott összeget meghaladó értékû terméket?
	kibõvítés - adjuk meg az összes ilyen céget
f) minden cégrõl adjuk meg, hogy hány féle terméket adott?
*/

/*---------------------------------------------------- TÉNYEK -------------------------------------------------------------------------------*/
adomany(cba, liszt, 100).
adomany(cba, fertotlenito,150).
adomany(cba, jatek ,120).
adomany(lidl, fertotlenito, 80).
/*
adomany(lidl, teszta, 70).
adomany(lidl, konzerv, 110).
adomany(spar, kenyer, 120).
*/
adomany(spar, liszt, 110).
adomany(spar, gyumolcs, 40).
adomany(tesco, kenyer, 100).

:- dynamic marvolt/3.
:- dynamic marvoltceg/1.
:- dynamic marvolttermek/1.
:- dynamic termekfajta/1.

/*---------------------------------------------------- A FELADAT ---------------------------------------------------------------------------*/
 legalabbketto(Ceg):- 
      adomany(Ceg,Termek1,_), adomany(Ceg,Termek2,_), Termek1\=Termek2.
 osszes_legalabbketto:- 
      legalabbketto(Ceg), 
	  \+marvoltceg(Ceg),  
	  write(Ceg), write(' '), 
	  assert(marvoltceg(Ceg)), 
	  fail; 
	  write(' '). 	  
	  
 tobbmintketto(Ceg):- 
      adomany(Ceg,Termek1,_), adomany(Ceg,Termek2,_),  adomany(Ceg,Termek3,_),
      Termek1\=Termek2, Termek1\=Termek3, Termek2\=Termek3.
 afel :- 
      tobbmintketto(Ceg), 
	  write(Ceg),  write(' ceg tobb, mint kettot adott.');
      write('Nincs tobb, mint kettot adomanyozo ceg.').
	  
 legfeljebbketto(Ceg):- 
      adomany(Ceg,_,_), \+(tobbmintketto(Ceg)).
 afelvar:- 
      legfeljebbketto(Ceg), 
      write(Ceg), write(' ceg legfeljebb kettot adott.');
      write('Nincs legfeljebb kettot adomanyozo ceg.').
 osszes_afelvar:-
      legfeljebbketto(Ceg),
      \+marvoltceg(Ceg), 
      write(Ceg), write(' '), 
      assert(marvoltceg(Ceg)), 
      fail;
      true.
/*---------------------------------------------------- B FELADAT ---------------------------------------------------------------------------*/
 nemlegertekesebb(Ertek):- 
      adomany(_,_,Ertek), adomany(_,_,NagyobbErtek),  Ertek<NagyobbErtek.
 bfel:- 
      adomany(Ceg,Termek,Ertek), \+(nemlegertekesebb(Ertek)),
      write('A legertekesebb: '), write(Ceg), write(' '),
      write(Termek), write(' '), write(Ertek), nl.
/*---------------------------------------------------- C FELADAT ---------------------------------------------------------------------------*/
 kigyujt:- 
      adomany(_,Termek,_), 
      \+(termekfajta(Termek)), assert(termekfajta(Termek)), 
      kigyujt; 
      true.
 kiir:- 
      termekfajta(Termek), write(Termek), nl, 
      fail; 
      true.
 cfel:- 
      retractall(termekfajta(_)), write('Termek fajtak:'), nl, 
      kigyujt, 
      kiir. 
/*---------------------------------------------------- C FELADAT 2. megoldás --------------------------------------------------------------*/
 eleme(Termek,[Termek|_]).
 eleme(Termek,[_|TermekLista]):- eleme(Termek,TermekLista). 
 
 kigyujtlista(ListaBe,ListaKi):- 
      adomany(_,Termek,_), \+(eleme(Termek,ListaBe)),
      kigyujtlista([Termek|ListaBe],ListaKi); 
      ListaBe=ListaKi.
 cfellista:- 
      kigyujtlista([],L) , write(L). 
	  
/*---------------------------------------------------- D FELADAT -------------------------------------------------------------------------*/
 osszegez(Ceg,Ossz):- 
      adomany(Ceg,Termek,Ertek),
      \+(marvolttermek(Termek)), assert(marvolttermek(Termek)), !,
      osszegez(Ceg,OsszMar), Ossz is OsszMar+Ertek;
      Ossz=0.
 dfel :-
     retractall(marvolttermek(_)),
     write('Melyik ceg: '), read(Ceg),
     osszegez(Ceg,Ossz),
     write('Osszesen:'), write(Ossz);
     write('Nincs ilyen ceg.').


/*---------------------------------------------------- E, F FELADATHOZ: lista létrehozása, lista kií -------------------------------------*/
betolt(L):-
     adomany(Ceg,Termek,Ertek), 
     \+marvolt(Ceg,Termek,Ertek), assert(marvolt(Ceg,Termek,Ertek)),!, 
     betolt(MarL), L=[adomany(Ceg,Termek,Ertek)|MarL];
     L=[].
		
kiirlista([]).
kiirlista([adomany(C,T,E)|MarLista]):-
     write(C), write('-'), write(T), write('-'), write(E), nl,  
     kiirlista(MarLista).		
    	   
/*---------------------------------------------------- E FELADAT -------------------------------------------------------------------------*/	 
	 
megfelel(Ert,Ceg):- 
    adomany(Ceg,_,AktErt), AktErt>Ert.

efel:-
    write('Adj meg egy ertekhatart:'), read(Ert), megfelel(Ert,Ceg), write(Ceg); 
    write('Nincs olyen ceg, aki a beolvasott erteknel nagyobb erteku termeket adomanyozott volna.').

kivalogat([],[], _).
kivalogat([adomany(Ceg,Termek,Ertek)|MarLista],KiLista,Ert):-
    megfelel(Ert,Ceg),
    \+marvoltceg(Ceg), assert(marvoltceg(Ceg)), 
    kivalogat(MarLista,MarKiLista,Ert),
    KiLista = [Ceg|MarKiLista].
kivalogat([_|MarLista],KiLista,Ert):-
    kivalogat(MarLista,KiLista,Ert).
	
kiirceglista([]).
kiirceglista([C|MarLista]):-
    write(C), nl,  
    kiirceglista(MarLista).

osszes_efel:-
    betolt(BeLista), write('A beolvasott lista:'), nl, kiirlista(BeLista), nl, 
    write('Adj meg egy ertekhatart:'), read(Ert), retractall(marvoltceg(_)), kivalogat(BeLista,KiLista,Ert), 
    write('A beolvasott erteknel nagyobb erteku termekeket adomanyozo cegek:'), nl,  kiirceglista(KiLista),
    retractall(marvolt(_,_,_)).

/*---------------------------------------------------- F FELADAT -------------------------------------------------------------------------*/	 

cegterdb(Ceg,Db):-
    adomany(Ceg,Termek,_),
    \+marvolttermek(Termek), assert(marvolttermek(Termek)),
    cegterdb(Ceg,MarDb), Db is MarDb+1; 
    Db=0.

cegekterdb([],[]).
cegekterdb([adomany(Ceg,_,_)|MarLista],KiLista):-
    \+marvoltceg(Ceg), assert(marvoltceg(Ceg)),
    retractall(marvolttermek(_)), cegterdb(Ceg,Db),
    cegekterdb(MarLista,MarKiLista),KiLista=[cegdb(Ceg,Db)|MarKiLista];
    cegekterdb(MarLista,MarKiLista),KiLista=MarKiLista.

kiircegtermeklista([]).
kiircegtermeklista([cegdb(Ceg,Db)|Lista]):-
    write(Ceg), write('-'), write(Db), nl, 
    kiircegtermeklista(Lista).
	 
ffel:-
    betolt(BeLista), write('A beolvasott lista:'), nl,  kiirlista(BeLista),  
    retractall(marvoltceg(_)), cegekterdb(BeLista,KiLista), 
    write('A cegek altal adomanyozott termek fajtak:'), nl, kiircegtermeklista(KiLista),
    retractall(marvolt(_,_,_)).


/*---------------------------------------------------- FELADATOK -------------------------------------------------------------------------*/	      	
:-
/*"tiszta lap"*/
 retractall(marvolt(_,_,_)), retractall(marvoltceg(_)), retractall(marvolttermek(_)), retractall(termekfajta(_)), 
/*feladatok*/
write('afel ravezeto osszes:') , nl , osszes_legalabbketto , nl , 
write('afel:') , nl , afel , nl , 
write('afel variacio:') , nl , afelvar , nl , 
write('afel variacio osszes:') , nl , osszes_afelvar , nl , nl,
write('bfel:') , nl , bfel , nl , 
write('cfel:') , nl , cfel , 
write('cfel lista:') , nl , cfellista , nl , nl ,
write('dfel:') , nl , dfel , nl ,
write('efel:') , nl , efel , nl ,
write('efel osszes:') , nl , osszes_efel, nl ,
write('ffel:') , nl , ffel.
