Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 23.04.2012, 22:04   #1
novicepro
Пользователь
 
Регистрация: 01.05.2011
Сообщений: 38
Восклицание Пролог! Код Хаффмана

Помогите, пожалуйста. Оооочень нужно.В прологе не очень разбираюсь. Нужно сделать, чтобы вводить не сообщение, а символы и соответствующую им вероятность появления в сообщении.Заранее спасибо!

Код:

huffman :-
 
    read(L),
    atom_chars(L, LA),
    msort(LA, LS),
    packList(LS, PL),
    sort(PL, PLS),
    build_tree(PLS, A),
    coding(A, [], C),
    sort(C, SAC),
revers(SAC, SC),
    format('Symbol~t Weight~t~30|Code~n'),
    maplist(print_code, SC).
 
 
 
 
sort([],[]).    
sort([X|TAIL],SORTLIST) :-
    div2(X, TAIL, S, L),
    sort(S, SORTS),
    sort(L, SORTL),
    link(SORTS,[X|SORTL],SORTLIST).
 
 
div2(_,[],[],[]).
div2(X,[Y|TAIL], [Y|S],L):-
    X>Y,!,
    div2(X,TAIL,S,L).
div2(X,[Y|TAIL], S,[Y|L]):-
    div2(X,TAIL,S,L).
 
link([],L,L).
link([X|L1],L2,[X|L3]):-
    link(L1,L2,L3).
 
 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),
%revers(NAT, 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).
 
revers(X,Y):- revers([],X,Y).
revers(Y,[],Y).
revers(X1,[Z|X2],Y):- revers([Z|X1],X2,Y).
novicepro вне форума Ответить с цитированием
Старый 23.04.2012, 22:50   #2
temaps
Форумчанин
 
Регистрация: 15.05.2011
Сообщений: 160
По умолчанию

Цитата:
Сообщение от novicepro Посмотреть сообщение
Помогите, пожалуйста. Оооочень нужно.В прологе не очень разбираюсь.
Фраза достойная стать мемом
temaps вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Архиватор Хаффмана zetrix Софт 17 15.03.2014 13:45
Код Хаффмана (Huffman) DiZbot Общие вопросы C/C++ 5 02.06.2011 18:53
Код Хаффмана Evgeny139 Помощь студентам 4 11.12.2010 09:33
Код Хаффмана boomeer Помощь студентам 1 04.11.2010 11:28