Declaratieve Talen/alternatiefHuffman: verschil tussen versies
Geen bewerkingssamenvatting |
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(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 | ||
Regel 15: | Regel 15: | ||
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 | ||
Regel 44: | Regel 44: | ||
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:10
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>