Declaratieve Talen/alternatiefHuffman

Uit Wina Examenwiki
Versie door Mick (overleg | bijdragen) op 7 jan 2009 om 11:10
Naar navigatie springen Naar zoeken springen

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>