Advertisement
Guest User

Untitled

a guest
Jan 27th, 2015
182
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Prolog 4.32 KB | None | 0 0
  1. % Deeltaak 1
  2. contract([],[]). % lege lijst
  3. contract([A|T],Uit) :- % niet-lege lijst
  4.     contract([A|T],1,Uit). % beginwaarde accumulator: 1
  5.  
  6. contract([A],N1,[N1-A]). % Voor wanneer er 1 element over is
  7. contract([A,A|T],N,Lijst) :-  % Indien de eerste twee elementen uit de lijst hetzelfde zijn
  8.     N1 is N+1,
  9.     contract([A|T],N1,Lijst). % Ga hierna nogmaals door de lijst met de nieuwe frequentie en zonder het eerste element
  10. contract([A,A1|T],N,Lijst) :-
  11.     A\=A1,
  12.     contract([A1|T],1,L2),
  13.     append([N-A],L2,Lijst).
  14.  
  15. % Deeltaak 2
  16. % Merge 4 keer is dit echt nodig?
  17. merge(P1,tree(L1,K1,R1),P2,tree(L2,K2,R2),P,tree(tree(L1,K1,R1),Yield,tree(L2,K2,R2))) :- P is P1+P2, append(K1,K2,Yield).
  18. merge(P1,tree(L1,K1,R1),P2,K2,P,tree(tree(L1,K1,R1),Yield,leaf(K2))) :- P is P1+P2, append(K1,[K2],Yield).
  19. merge(P1,K1,P2,tree(L2,K2,R2),P,tree(leaf(K1),Yield,tree(L2,K2,R2))) :- P is P1+P2, append([K1],K2,Yield).
  20. merge(P1,K1,P2,K2,P,tree(leaf(K1),Yield,leaf(K2))) :- P is P1+P2, append([K1],[K2],Yield).
  21.  
  22. heap_to_tree(Heap,Tree) :-
  23.     singleton_heap(Heap,_,Tree).
  24.  
  25. heap_to_tree(Heap, Tree) :-
  26.     get_from_heap(Heap,P0,K0,H0),
  27.     get_from_heap(H0,P1,K1,H1),
  28.     merge(P1,K1,P0,K0,P2,K2),
  29.     add_to_heap(H1,P2,K2,H2),
  30.     heap_to_tree(H2,Tree).
  31.  
  32. % Deeltaak 3
  33. % Dit moet met verschillijsten
  34. member(X,[X|_]).
  35. member(X,[_|T])  :-  member(X,T).
  36.  
  37. symbol_code(A,leaf(A),CodeRest,CodeRest).
  38. symbol_code(A,tree(Links,Yield,_),[0|Code],CodeRest) :- member(A,Yield), symbol_code(A,Links,Code,CodeRest).
  39. symbol_code(A,tree(_,Yield,Rechts),[1|Code],CodeRest) :- member(A,Yield), symbol_code(A,Rechts,Code,CodeRest).
  40.  
  41. % Deeltaak 4
  42. encode([],_) --> [].
  43. encode([H|T],Tree) --> symbol_code(H,Tree),encode(T,Tree).
  44.  
  45. % Deeltaak 5
  46. export_dcg(CodeList) :-
  47.     tell('huffdcg.pl'),
  48.     % format/2 code voor het schrijven van de DCG regels
  49.     maplist(format("huff([~q|L]) --> ~i~w,huff(L).\n"),CodeList),
  50.     format("huff([]) --> [].",[]), % laatste regel/grensgeval
  51.     told.
  52.  
  53.  
  54.  
  55.  
  56.  
  57. % Modelleren en programmeren 2014-15. Inleveropdracht 4: testpredicaten
  58.  
  59. % Wikipedia: http://en.wikipedia.org/wiki/Huffman_coding
  60.  
  61. % We gebruiken de heaps library voor priority queues:
  62.  
  63. :- use_module(library(heaps)).
  64.  
  65. % Twee testpredicaten: huffman/2 voor klein voorbeeld,
  66. % huffman/1 voor invoer van een compleet tekstbestand.
  67.  
  68. % huffman/1: file invoer
  69.  
  70. time(huffman(File)) :-
  71.     read_file_to_codes(File,Codes,[]),
  72.     atom_codes(L,Codes),
  73.     huffman(L,_).
  74.  
  75. % huffman/2: simpele teststring (L: atom)
  76.    
  77. huffman(L,Tree) :-
  78. %
  79. %   bijvoorbeeld L = 'this is an example of a huffman tree',
  80. %
  81.     atom_chars(L, LA), % zet tekst om in losse karakters
  82.     msort(LA, LS), % multiset sorting
  83.     contract(LS, PL), % DEELTAAK 1
  84.     list_to_heap(PL,Heap), % cf library(heaps)
  85.     heap_to_tree(Heap,Tree), % DEELTAAK 2
  86. %
  87. % schermuitvoer:
  88. %
  89.     sort(PL,PLs),
  90.     reverse(PLs,LAs),
  91.     code_list(LAs,Tree,Codes),
  92.     print_codes(Codes),nl, 
  93.     encode(LA,Tree,Code,[]),nl, % DEELTAAK 3 (symbol_code) en 4
  94.     length(Code,K),
  95. %   kies een van beide format/2 instructies hieronder  
  96.     format("Code: ~w~nLengte (in bits): ~d\n",[Code,K]),
  97. %   format("Length encoded message (bits): ~d\n",[K]),
  98.     length(LA,Length), % lengte invoer in karakters
  99.     stats(Codes,Length,SumL,SumH), % statistiek
  100.     format("Weighted path length L(C): ~f\nEntropy H(A): ~f\n",[SumL,SumH]),
  101. %
  102. % DCG uitvoer (als bestand huffdcg.pl):
  103. %
  104.     export_dcg(Codes), % DEELTAAK 5
  105.     consult('huffdcg.pl'). % check of de DCG foutloos laadt
  106.  
  107. % Invoer/Uitvoerroutines
  108.  
  109. code_list([P-K|Rest],Tree,[[K,P,Code]|Codes]) :-
  110.     symbol_code(K,Tree,Code,[]),
  111.     code_list(Rest,Tree,Codes).
  112. code_list([],_,[]).
  113.  
  114. % print_codes/1
  115.  
  116. % Elementen van CodeList zijn [Key,Priority,Code] tupels
  117. % format/2 documentatie:
  118. % ~q zorgt ervoor dat atomen waar nodig aanhalingstekens krijgen
  119.  
  120. print_codes(CodeList) :-
  121.     maplist(format("~q\t~d\t~w\n"),CodeList).
  122.  
  123. % statistics
  124.  
  125. stats(Codes,K,L,H) :-
  126.     % Codes: list of [Key,Priority,Code] triples,
  127.     % K: length message (in symbols)
  128.     lh(Codes,K,LWs,Hs),
  129.     sum_list(LWs,L),
  130.     sum_list(Hs,H).
  131.  
  132. % lh/4: computes L(C) and H(A)
  133. % Input: list of [Key,Priority,Code] tupels; N: lengte tekst
  134.  
  135. lh([],_,[],[]).
  136. lh([[_,P,C]|R],N,[L|T],[H|S]) :-
  137.     P1 is P/N,length(C,CodeLength),
  138.     L is P1*CodeLength, % weighted path length
  139.     log2(P1,Log2),H is -P1*Log2, % entropy
  140.     lh(R,N,T,S).
  141.  
  142. % log2, defined from built-in arithmetic function log/1
  143.  
  144. log2(N,Log2) :- Log2 is log(N)/log(2).
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement