
![]() |
Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
|
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[216.73.216.30] |
![]() |
|
Сообщ.
#1
,
|
|
|
В общем-то неглупому человеку, но в силу его невероятной лени, тупому студенту-программисту дали задание на курсовую - "Построение кода Хаффмана" на Прологе и Хакеле. Студент, попутно думая, то ли он не ту специальность выбрал, то ли он вообще некудышний, начал все таки копаться по этой теме. В первый день он понял, что 100стр какого-то учебника, прочитанные втечение семестра "рука-лицо" будет недостаточно для самостоятельного написания курсовой в достаточно короткие сроки...
На второй день он нашел Huffman Coding в сети и на Прологе и на Хаскеле. Теперь же он надеется на небольшую безвозмездную помощь от гуру программирования, которая заключилась бы в написании комментариев к готовому коду, для создания стартого ускорения, так сказать, в написании курсовй. Код: Пролог Скрытый текст huffman :- L = 'this is an example for huffman encoding', atom_chars(L, LA), msort(LA, LS), packList(LS, PL), sort(PL, PLS), build_tree(PLS, A), coding(A, [], C), sort(C, SC), format('Symbol~t Weight~t~30|Code~n'), maplist(print_code, SC). build_tree([[V1|R1], [V2|R2]], [V, [V1|R1], [V2|R2]]) :- V is V1+V2. build_tree([[V1|R1], [V2|R2] | T], AF) :- V is V1 + V2, A = [V, [V1|R1], [V2|R2]], sort([A| T], NT), build_tree(NT, AF). coding([_A,FG,FD], Code, CF) :- ( is_node(FG) -> coding(FG, [0 | Code], C1); leaf_coding(FG, [0|Code], C1) ), ( is_node(FD) -> coding(FD, [1 | Code], C2); leaf_coding(FD, [1 | Code], C2) ), append(C1, C2, CF). leaf_coding([FG,FD], Code, CF) :- reverse(Code, CodeR), CF = [[FG, FD, CodeR]] . is_node([_V, _FG, _FD]). print_code([N, Car, Code]):- format('~w :~t~w~t~30|', [Car, N]), forall(member(V, Code), write(V)), nl. Хаскель Хаскель packList([],[]). packList([X],[[1,X]]) :- !. packList([X|Rest],[XRun|Packed]):- run(X,Rest, XRun,RRest), packList(RRest,Packed). run(Var,[],[1,Var],[]). run(Var,[Var|LRest],[N1,Var],RRest):- run(Var,LRest,[N, Var],RRest), N1 is N + 1. run(Var,[Other|RRest], [1,Var],[Other|RRest]):- dif(Var,Other). import Data.List import Control.Arrow import Data.Ord data HTree a = Leaf a | Branch (HTree a) (HTree a) deriving (Show, Eq, Ord) freq :: (Ord a) => [a] -> [(Int, a)] freq = map(length &&& head). group. sort serialize :: HTree d -> [(d, String)] serialize (Branch l r) = map (second('0':)) (serialize l) ++ map (second('1':)) (serialize r) serialize (Leaf x) = [(x, "")] htree :: (Ord t, Num t) => [(t, HTree a)] -> HTree a htree [(_, t)] = t htree ((w1,t1):(w2,t2):wts) = htree $ insertBy (comparing fst) (w1 + w2, Branch t1 t2) wts huffman :: (Ord w, Num w) => [(w, a)] -> [(a, String)] huffman = serialize. htree. sortBy (comparing fst). map (second Leaf) Добавлено Не понял, как редактировать написанные сообщения... В коде я там намудрил. Вот нормальный вариант. Пролог huffman :- L = 'this is an example for huffman encoding', atom_chars(L, LA), msort(LA, LS), packList(LS, PL), sort(PL, PLS), build_tree(PLS, A), coding(A, [], C), sort(C, SC), format('Symbol~t Weight~t~30|Code~n'), maplist(print_code, SC). build_tree([[V1|R1], [V2|R2]], [V, [V1|R1], [V2|R2]]) :- V is V1+V2. build_tree([[V1|R1], [V2|R2] | T], AF) :- V is V1 + V2, A = [V, [V1|R1], [V2|R2]], sort([A| T], NT), build_tree(NT, AF). coding([_A,FG,FD], Code, CF) :- ( is_node(FG) -> coding(FG, [0 | Code], C1); leaf_coding(FG, [0|Code], C1) ), ( is_node(FD) -> coding(FD, [1 | Code], C2); leaf_coding(FD, [1 | Code], C2) ), append(C1, C2, CF). leaf_coding([FG,FD], Code, CF) :- reverse(Code, CodeR), CF = [[FG, FD, CodeR]] . is_node([_V, _FG, _FD]). print_code([N, Car, Code]):- format('~w :~t~w~t~30|', [Car, N]), forall(member(V, Code), write(V)), nl. packList([],[]). packList([X],[[1,X]]) :- !. packList([X|Rest],[XRun|Packed]):- run(X,Rest, XRun,RRest), packList(RRest,Packed). run(Var,[],[1,Var],[]). run(Var,[Var|LRest],[N1,Var],RRest):- run(Var,LRest,[N, Var],RRest), N1 is N + 1. run(Var,[Other|RRest], [1,Var],[Other|RRest]):- dif(Var,Other). Хаскель import Data.List import Control.Arrow import Data.Ord data HTree a = Leaf a | Branch (HTree a) (HTree a) deriving (Show, Eq, Ord) freq :: (Ord a) => [a] -> [(Int, a)] freq = map(length &&& head). group. sort serialize :: HTree d -> [(d, String)] serialize (Branch l r) = map (second('0':)) (serialize l) ++ map (second('1':)) (serialize r) serialize (Leaf x) = [(x, "")] htree :: (Ord t, Num t) => [(t, HTree a)] -> HTree a htree [(_, t)] = t htree ((w1,t1):(w2,t2):wts) = htree $ insertBy (comparing fst) (w1 + w2, Branch t1 t2) wts huffman :: (Ord w, Num w) => [(w, a)] -> [(a, String)] huffman = serialize. htree. sortBy (comparing fst). map (second Leaf) |