%/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\% %meno: Pavol Humay %rocnik: 3 %kruzok: 2 %Zadanie z prologu %\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/% starter:- dynamic([komponent/2,zostava/2]), menu. /*------------------------------*\ hlavne menu menu/0 \*------------------------------*/ menu:- repeat, ( write( '*****************************' ),nl, write( ' Hlavne menu ' ), nl, write( '*****************************' ),nl, write( 'Nacitat subor ............. 1' ), nl, write( 'Ulozit subor .............. 2' ), nl, write( 'Pridat komponent .......... 3' ), nl, write( 'Pridat zostavu ............ 4' ), nl, write( 'Zobrazit komponenty ....... 5' ), nl, write( 'Zobrazit zostavy .......... 6' ), nl, write( 'Vypis podla casti mena .... 7' ), nl, write( 'Vymaz podla casti mena .... 8' ), nl, write( 'Vypis pod zadanu cenu ..... 9' ), nl, write( 'Vypis nad zadanu cenu ..... a' ), nl, write( 'Vyprazdni DB .............. 0' ), nl, write( 'Ukonci program ............ q' ), nl, write( '*****************************' ),nl, fail; read(V), not(vyber(V)), write('Koniec programu'),nl, ! ). %-------------------------------- %vykonanie volby v menu %vyber/1 %-------------------------------- vyber(1):- !,write( 'Nacitavanie suboru'), nl, subor_nazov(N), nacitaj(N). vyber(2):- !,write( 'Ukladanie suboru'), nl, subor_nazov(N), zapis(N). vyber(3):- !,write( 'Pridavanie komponentov'), nl, pridaj_komponenty(1,_,[]), nl. vyber(4):- !,write( 'Pridavanie zostav'), nl, pridaj_zostavy(1,_,[]), nl. vyber(5):- !,write( 'Zobrazenie komponentov'), nl, collect(X), process(X,[je_komponent],[nic],Y), write( 'Nazov Cena'),nl, vypis(Y), nl. vyber(6):- !,write( 'Zobrazenie zostav'), nl, collect(X), process(X,[je_zostava],[nic],Y), write( 'Nazov Cena'),nl, vypis(Y), nl. vyber(7):- !,write( 'Zadajte nazov prvku'),read(N),nl, collect(X), process(X,[vola_sa],[N],Y), write( 'Nazov Cena'),nl, vypis(Y),nl. vyber(8):- !,write( 'Zadajte nazov prvku'),read(N),nl, collect(X), process(X,[vola_sa],[N],Y), vymaz(Y),nl. vyber(9):- !,write( 'Zadajte cenovy strop'),read(N),nl, collect(X), process(X,[cena_pod],[N],Y), write( 'Nazov Cena'),nl, vypis(Y),nl. vyber(a):- !,write( 'Zadajte cenove dno'),read(N),nl, collect(X), process(X,[cena_nad],[N],Y), write( 'Nazov Cena'),nl, vypis(Y),nl. vyber(0):- !,dynamic([komponent/2,zostava/2,vyrobok/2]). vyber(q):- !, fail. vyber(_):- write( 'Nespravna moznost.'), nl, write('Chcete opakovat svoju volbu? (a/n)'), read(V), volba(V). %-------------------------------- %volba na navrat pravdy, %ak sa ma opakovat volba v menu %volba/1 %-------------------------------- volba(a). %-------------------------------- %sluzi na ziskavanie nazvu suboru %subor_nazov(-nazov) %-------------------------------- subor_nazov(N):- write( 'Zadajte nazov suboru'), read(N),nl. /*------------------------------*\ nacita cely subor nacitaj(+Subor) \*------------------------------*/ nacitaj(Subor):- see(Subor), work, seen. work:- repeat, read(Term), spracuj(Term). spracuj(end_of_file). spracuj(['komponent',H,T]):- assertz(komponent(H,T)),!,fail. spracuj(['zostava',H,T]):- assertz(zostava(H,T)),!,fail. spracuj(_):- write('Chyba vo vstupnych udajoch'),nl. /*------------------------------*\ zapise do suboru databazu zapis(+Subor) \*------------------------------*/ zapis(Subor):- fcreate(test,Subor,0), fclose(test), tell(Subor), write_komponent, write_zostava, told. write_komponent:- komponent(X,Y), write(['komponent',X,Y]),write('.'),nl, fail. write_komponent. write_zostava:- zostava(X,Y), write(['zostava',X,Y]),write('.'),nl, fail. write_zostava. /*------------------------------*\ pridavanie prvkov do databazy \*------------------------------*/ %-------------------------------- %prida urceny pocet komponentov %brani vytvoreniu rodicov ktory este nie su vytvoreny (kolizie) %v pripade neplatneho cisla komponentov vrati prazdny zoznam %pridaj_komponenty(+pocet,-zoznam,+kolizie) %pridaj_komponent(+meno,+kolizie) %vrati platne cislo ceny (0 ak vstup nie je cislo) %test_cena(+cena,-cena) %-------------------------------- pridaj_komponenty(0,[],_):-!. pridaj_komponenty(N,[Meno|Rest],Mena):- number(N), write('Zadajte nazov komponentu: '), read(Meno), nl, pridaj_komponent(Meno,Mena), NM is N -1,!, pridaj_komponenty(NM,Rest,[Mena|[Meno]]). pridaj_komponenty(N,Rest,Mena):- number(N),!, pridaj_komponenty(N,Rest,Mena). pridaj_komponenty(_,[],_). %-------------------------------- pridaj_komponent(Meno,Mena):- test(Meno),write('Prvok uz v DB existuje'),nl,!. pridaj_komponent(Meno,Mena):- member(Meno,Mena),write('Prvok tohto mena sa prave vyraba'),nl,!,fail. pridaj_komponent(Meno,Mena):- write('Zadajte cenu komponentu: '), read(Cena),test_cena(Cena,Cenan), nl, assertz(komponent(Meno,Cenan)),!. %-------------------------------- test_cena(Cena,Cena):- number(Cena),!. test_cena(_,0). %-------------------------------- %prida urceny pocet zostav %brani vytvoreniu rodicov ktory este nie su vytvoreny (kolizie) %v pripade neplatneho cisla zostav vrati prazdny zoznam %pridaj_zostavy(+pocet,-zoznam,+kolizie) %pridaj_zostavu(+meno,+kolizie) %-------------------------------- pridaj_zostavy(0,[],_):-!. pridaj_zostavy(N,[Meno|Rest],Mena):- number(N), write('Zadajte nazov zostavy: '), read(Meno), nl, pridaj_zostavu(Meno,Mena), NM is N -1,!, pridaj_zostavy(NM,Rest,[Mena|[Meno]]). pridaj_zostavy(N,Rest,Mena):- number(N),!, pridaj_zostavy(N,Rest,Mena). %pridaj_zostavy(_,[],_). %-------------------------------- pridaj_zostavu(Meno,Mena):- test(Meno),write('Prvok uz v DB existuje'),nl,!. pridaj_zostavu(Meno,Mena):- member(Meno,Mena),write('Prvok tohto mena sa prave vyraba'),nl,!,fail. pridaj_zostavu(Meno,Mena):- write('Zadajte pocet podzostav'), read(Pocet), nl, pridaj_zostavy(Pocet,Zostavy,[Meno|Mena]), write('Zadajte pocet komponentov zostavy'), read(Pocetk), nl, pridaj_komponenty(Pocetk,Komponents,[Meno|Mena]), append(Zostavy,Komponents,Zlozky), assertz(zostava(Meno,Zlozky)),!. %-------------------------------- %otestuje existenciu prvku %test/1 %-------------------------------- test(Meno):- komponent(Meno,_). test(Meno):- zostava(Meno,_). /*------------------------------*\ praca s prvkami databazy \*------------------------------*/ %-------------------------------- %vypise prvky %vypis(+prvky) %-------------------------------- vypis([[Meno,Cena]|T]):- number(Cena),!, write(Meno), write(' '), write(Cena), nl, vypis(T). vypis([[Meno,Cena]|T]):- write(Meno), write(' '), cena(Cena,NCena), write(NCena), nl, vypis(T). vypis([]). %-------------------------------- %vymaze prvky %vymaz(+mena) %-------------------------------- vymaz([[Meno,Cena]|T]):- number(Cena),!, retract(komponent(Meno,Cena)), vymaz(T). vymaz([[Meno,Cena]|T]):- retract(zostava(Meno,Cena)), nl, vymaz(T). vymaz([]). %-------------------------------- %vrati cenu zostavy alebo vyrobku %cena(+list,-cena) %-------------------------------- cena([H|T],N):- komponent(H,C), cena(T,CC), N is C+CC,!. cena([H|T],N):- zostava(H,K), cena(K,C), cena(T,CC), N is C+CC,!. cena([],0). %-------------------------------- %najde vsetky prvky DB %collect(-results) %-------------------------------- collect([[X,Y]|T]):- komponent(X,Y), retract(komponent(X,Y)),!, collect(T). collect([[X,Y]|T]):- zostava(X,Y), retract(zostava(X,Y)),!, collect(T). collect([]). %-------------------------------- %spracuje vsetky prvky DB %a prida ich spet do DB %process(+najdene,+podmienky,+argumenty,-vysledky). %-------------------------------- process([H|T],Podmienky,Argumenty,[H|Tr]):- testuj(H,Podmienky,Argumenty),!, vratDB(H), process(T,Podmienky,Argumenty,Tr). process([H|T],Podmienky,Argumenty,Results):- vratDB(H), process(T,Podmienky,Argumenty,Results). process([],_,_,[]). %-------------------------------- %zaradi prvok spet do DB %vratDB/1 %-------------------------------- vratDB([X,Y]):- number(Y),!, assertz(komponent(X,Y)). vratDB([X,Y]):- assertz(zostava(X,Y)). %-------------------------------- %otestuje platnost vlastnosti %testuj/3 %-------------------------------- testuj([X,Y],[Hp|Tp],[Ha|Ta]):- call(Hp(Ha,X,Y)), testuj([X,Y],Tp,Ta). testuj(_,[],[]). %-------------------------------- %testovacie funkcie pre podmienky vyberu %meno(+arg,+meno,+cena) %-------------------------------- je_komponent(_,Meno,Cena):- number(Cena). je_zostava(_,Meno,Cena):- not(number(Cena)). cena_pod(N,Meno,Cena):- number(Cena), number(N), CenaN. vola_sa(Hladaj,Meno,_):- name(Hladaj,X), name(Meno,Y), hladaj(X,Y). %-------------------------------- %zisti ci sa prvy retazec nachadza v druhom %hladaj/2 %najdene/2 %-------------------------------- hladaj([H|T],[H|T2]):- !,najdene(T,T2). hladaj(X,[_|T2]):- hladaj(X,T2). najdene([H|T],[H|T2]):- najdene(T,T2). najdene([],_).