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.
<nowiki>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
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>