Declaratieve Talen/alternatiefHuffman: verschil tussen versies

Uit Wina Examenwiki
Naar navigatie springen Naar zoeken springen
Mick (overleg | bijdragen)
Geen bewerkingssamenvatting
Mick (overleg | bijdragen)
Geen bewerkingssamenvatting
Regel 1: Regel 1:
Deze oplossing is een alternatief, maar daarom niet beter of minder goed dan de andere oplossing. Hier werd vooral veel commentaar genoteerd.
Deze oplossing is een alternatief, maar daarom niet beter of minder goed dan de andere oplossing. Hier werd vooral veel commentaar genoteerd.
  decodeer(N,Mes,Res) :-
  decodeer(N,Mes,Res) :-
decodeer(0,N,Mes,[],Res).
decodeer(0,N,Mes,[],Res).
  decodeer(N,N,[],Acc,RAcc) :- % Uiteindelijk eindig je.
  decodeer(N,N,[],Acc,RAcc) :- % Uiteindelijk eindig je.
reverse(Acc,RAcc).
reverse(Acc,RAcc).
  decodeer(N,M,Mes,Acc,Res) :-
  decodeer(N,M,Mes,Acc,Res) :-
length(Mes,MesLen), % Bereken de lengte van het bericht
length(Mes,MesLen), % Bereken de lengte van het bericht
numlist(1,MesLen,MesLL), % Maak een lijst lengtes van deelverz van het bericht
numlist(1,MesLen,MesLL), % Maak een lijst lengtes van deelverz van het bericht
member(MesAm,MesLL), % Haal zo'n lengte uit de lijst
member(MesAm,MesLL), % Haal zo'n lengte uit de lijst
take(MesAm,Mes,MesPart), % Neem dat aantal elementen uit het bericht
take(MesAm,Mes,MesPart), % Neem dat aantal elementen uit het bericht
delete(MesAm,Mes,MesRest), % Verwijder die ook, zodat er enkel een rest is
delete(MesAm,Mes,MesRest), % Verwijder die ook, zodat er enkel een rest is
no_conflict(N-MesPart,Acc), % Kijk of er geen conflict is met reeds berekende
no_conflict(N-MesPart,Acc), % Kijk of er geen conflict is met reeds berekende
NAcc = [N-MesPart|Acc], % Voeg berekende toe aan accumulator, vooraan op het einde reverse
NAcc = [N-MesPart|Acc], % Voeg berekende toe aan accumulator, vooraan op het einde reverse
Nn is N+1, % Bereken nieuwe N
Nn is N+1, % Bereken nieuwe N
decodeer(Nn,M,MesRest,NAcc,Res). % Decodeer rest bericht
decodeer(Nn,M,MesRest,NAcc,Res). % Decodeer rest bericht
 
  no_conflict(_,[]). % Je kan moeilijk conflict hebben met niets
  no_conflict(_,[]). % Je kan moeilijk conflict hebben met niets
  no_conflict(MesC-MesP,[_-MesH|T]) :-
  no_conflict(MesC-MesP,[_-MesH|T]) :-
\+ prefix(MesP,MesH), % Check of geen prefix van elkaar
\+ prefix(MesP,MesH), % Check of geen prefix van elkaar
no_conflict(MesC-MesP,T).
no_conflict(MesC-MesP,T).
  prefix(_,[]). % Niets is pefix van alles
  prefix(_,[]). % Niets is pefix van alles
  prefix([],_). % Niets is pefix van alles
  prefix([],_). % Niets is pefix van alles
  prefix([H|PR],[H|RR]) :- % Controlleer of top lijst gelijk is (prefix)
  prefix([H|PR],[H|RR]) :- % Controlleer of top lijst gelijk is (prefix)
prefix(PR,RR).
prefix(PR,RR).
  take(0,_,[]).
  take(0,_,[]).
  take(N,[H|T],Res) :-
  take(N,[H|T],Res) :-
Nn is N-1,
Nn is N-1,
take(Nn,T,TRes),
take(Nn,T,TRes),
Res = [H|TRes].
Res = [H|TRes].
  delete(0,A,A).
  delete(0,A,A).
  delete(N,[_|T],Res) :-
  delete(N,[_|T],Res) :-
Nn is N-1,
Nn is N-1,
delete(Nn,T,TRes),
delete(Nn,T,TRes),
Res = TRes.
Res = TRes.
  bereken([],_,0). % Het gewicht van een lege codering is 0
  bereken([],_,0). % Het gewicht van een lege codering is 0
  bereken([Nn-Ms|Rest],Freq,Res) :- % Neem eerste codering
  bereken([Nn-Ms|Rest],Freq,Res) :- % Neem eerste codering
member(Nn-W,Freq), % Zoek de frequentie
member(Nn-W,Freq), % Zoek de frequentie
length(Ms,MsLen), % Bereken lengte codering
length(Ms,MsLen), % Bereken lengte codering
bereken(Rest,Freq,TRes), % Bereken rest van codering
bereken(Rest,Freq,TRes), % Bereken rest van codering
Res is TRes + MsLen*W. % Resultaat is berek. rest + lengte cod. * freq-gewicht
Res is TRes + MsLen*W. % Resultaat is berek. rest + lengte cod. * freq-gewicht
  beste(N,Mes,Freqs,Res) :-
  beste(N,Mes,Freqs,Res) :-
findall(Ress,decodeer(N,Mes,Ress),ResList),
findall(Ress,decodeer(N,Mes,Ress),ResList),
geef_beste(ResList,Freqs,Res).
geef_beste(ResList,Freqs,Res).
  geef_beste(ResList,Freqs,Res) :-
  geef_beste(ResList,Freqs,Res) :-
bereken_alle(ResList,Freqs,BResList),
bereken_alle(ResList,Freqs,BResList),
min_list(BResList,Min),
min_list(BResList,Min),
geef_beste(ResList,BResList,Min,Res).
geef_beste(ResList,BResList,Min,Res).
  geef_beste([HE|_],[Min|_],Min,HE). % Verwijder 1 voor 1 tot je bij beste komt
  geef_beste([HE|_],[Min|_],Min,HE). % Verwijder 1 voor 1 tot je bij beste komt
  geef_beste([_|TE],[HB|TB],Min,Res) :-
  geef_beste([_|TE],[HB|TB],Min,Res) :-
HB > Min,
HB > Min,
geef_beste(TE,TB,Min,Res).
geef_beste(TE,TB,Min,Res).
  bereken_alle([],_,[]). % Bereken alle coderingen a.d.h.v. frequentie
  bereken_alle([],_,[]). % Bereken alle coderingen a.d.h.v. frequentie
  bereken_alle([H|T],Freqs,Res) :-
  bereken_alle([H|T],Freqs,Res) :-
bereken_alle(T,Freqs,TRes),
bereken_alle(T,Freqs,TRes),
bereken(H,Freqs,Berek),
bereken(H,Freqs,Berek),
Res = [Berek|TRes].</nowiki>
Res = [Berek|TRes].</nowiki>

Versie van 7 jan 2009 11:11

Deze oplossing is een alternatief, maar daarom niet beter of minder goed dan de andere oplossing. Hier werd vooral veel commentaar genoteerd.

decodeer(N,Mes,Res) :-
	decodeer(0,N,Mes,[],Res).
decodeer(N,N,[],Acc,RAcc) :-				% Uiteindelijk eindig je.
	reverse(Acc,RAcc).
decodeer(N,M,Mes,Acc,Res) :-
	length(Mes,MesLen),				% Bereken de lengte van het bericht
	numlist(1,MesLen,MesLL),			% Maak een lijst lengtes van deelverz van het bericht
	member(MesAm,MesLL),				% Haal zo'n lengte uit de lijst
	take(MesAm,Mes,MesPart),			% Neem dat aantal elementen uit het bericht
	delete(MesAm,Mes,MesRest),			% Verwijder die ook, zodat er enkel een rest is
	no_conflict(N-MesPart,Acc),			% Kijk of er geen conflict is met reeds berekende
	NAcc = [N-MesPart|Acc],				% Voeg berekende toe aan accumulator, vooraan op het einde reverse
	Nn is N+1,					% Bereken nieuwe N
	decodeer(Nn,M,MesRest,NAcc,Res).		% Decodeer rest bericht

no_conflict(_,[]).					% Je kan moeilijk conflict hebben met niets
no_conflict(MesC-MesP,[_-MesH|T]) :-
	\+ prefix(MesP,MesH),				% Check of geen prefix van elkaar
	no_conflict(MesC-MesP,T).
	
prefix(_,[]).						% Niets is pefix van alles
prefix([],_).						% Niets is pefix van alles
prefix([H|PR],[H|RR]) :-				% Controlleer of top lijst gelijk is (prefix)
	prefix(PR,RR).
take(0,_,[]).
take(N,[H|T],Res) :-
	Nn is N-1,
	take(Nn,T,TRes),
	Res = [H|TRes].
	
delete(0,A,A).
delete(N,[_|T],Res) :-
	Nn is N-1,
	delete(Nn,T,TRes),
	Res = TRes.
	
bereken([],_,0).					% Het gewicht van een lege codering is 0
bereken([Nn-Ms|Rest],Freq,Res) :-			% Neem eerste codering
	member(Nn-W,Freq),				% Zoek de frequentie
	length(Ms,MsLen),				% Bereken lengte codering
	bereken(Rest,Freq,TRes),			% Bereken rest van codering
	Res is TRes + MsLen*W.				% Resultaat is berek. rest + lengte cod. * freq-gewicht
	
beste(N,Mes,Freqs,Res) :-
	findall(Ress,decodeer(N,Mes,Ress),ResList),
	geef_beste(ResList,Freqs,Res).
	
geef_beste(ResList,Freqs,Res) :-
	bereken_alle(ResList,Freqs,BResList),
	min_list(BResList,Min),
	geef_beste(ResList,BResList,Min,Res).
	
geef_beste([HE|_],[Min|_],Min,HE).			% Verwijder 1 voor 1 tot je bij beste komt
geef_beste([_|TE],[HB|TB],Min,Res) :-
	HB > Min,
	geef_beste(TE,TB,Min,Res).
	
bereken_alle([],_,[]).					% Bereken alle coderingen a.d.h.v. frequentie
bereken_alle([H|T],Freqs,Res) :-
	bereken_alle(T,Freqs,TRes),
	bereken(H,Freqs,Berek),
	Res = [Berek|TRes].</nowiki>