All pastes #487583 Raw Edit

Something

public text v1 · immutable
·published 2007-05-14 15:13 UTC
rendered paste body
%/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\%
%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),
	Cena<N.

cena_nad(N,Meno,Cena):-
	number(Cena),
	number(N),
	Cena>N.

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([],_).