Języki symboliczne, laboratorium 05 Zadanie 1. Stwórz listę par

Transkrypt

Języki symboliczne, laboratorium 05 Zadanie 1. Stwórz listę par
Języki symboliczne, laboratorium 05
Zadanie 1. Stwórz listę par (imię, wiek – jacek: 4, placek: 5, gniewomira: 4123 itd.), gdzie imię jest symbolem, a wiek
liczbą. Napisz funkcję przyjmującą jako argument imię (symbol) oraz listę do przeszukania, zwracającą wiek osoby o
podanym imieniu.
Ponieważ DrRacket nie przepada za wielkimi literami, imiona wpisuj używając tylko małych.
https://mitpress.mit.edu/sicp/full-text/book/book-Z-H-16.html#%_sec_2.3
Zadanie 2. Napisz funkcję liczącą pochodną podanego wzoru. Funkcja powinna przyjmować jako argument wzór oraz
zmienną, po której pochodną chcemy obliczyć. Funkcja powinna obsługiwać wyrażenia zawierające dodawanie i
mnożenie.
https://mitpress.mit.edu/sicp/full-text/book/book-Z-H-16.html#%_sec_2.3.2
Zadanie 3. Rozbuduj funkcję z zadania 2. o upraszczanie wyrażeń:
• x+0 → upraszczane do x
• x*0 → upraszczane do 0
W powyższych regułach, x może być symbolem jak i liczbą.
Zadanie 4. Przeczytaj rozdział 2.3.4: https://mitpress.mit.edu/sicp/full-text/book/book-Z-H-16.html#%_sec_2.3.4
Przepisz z książki funkcje potrzebne do obsługi drzewa Huffmana:
• tworzącą liść drzewa, zawierający kodowany symbol i wagę,
• sprawdzającą czy podany obiekt jest liściem,
• zwracającą symbol z liścia,
• zwracającą wagę symbolu z liścia,
• łączącą dwie gałęzie w jedno drzewo (make-code-tree),
• zwracającą lewą gałąź drzewa,
• zwracającą prawą gałąź drzewa,
• zwracającą listę symboli w danej gałęzi,
• zwracającą sumę wag symboli w danej gałęzi.
https://mitpress.mit.edu/sicp/full-text/book/book-Z-H-16.html#%_sec_Temp_259
Przepisz z książki funkcje tworzącą drzewo Huffmana na podstawie listy par (symbol, waga) oraz funkcje pomocnicze:
• adjoin-set - dołączającą element do zbioru w kolejności rosnących wag,
• make-leaf-set - tworzącą listę liści drzewa Huffmana na podstawie listy par (symbol, waga),
• generate-huffman-tree - tworzącą drzewo Huffmana z listy par – wywołuje successive-merge (patrz: zadanie
5.) przesyłając jako argument listę zwróconą przez funkcję make-leaf-set.
Zadanie 5. Napisz samodzielnie funkcję successive-merge, tworzącą drzewo Huffmana z posortowanej listy liści,
przesyłanej jako argument.
Funkcja successive-merge łączy elementy listy o najmniejszych wagach, dopóki nie pozostanie jeden element (którym
będzie drzewo Huffmana), który jest zwracany. Ponieważ przesyłana jest posortowana rosnąco lista liści, należy
wyciągnąć dwa pierwsze elementy listy, połączyć je przy pomocy make-code-tree, wstawić w odpowiednim miejscu
listy (przy pomocy adjoin-set), oraz zmodyfikowaną listę przesłać rekurencyjnie do successive-merge. Kolejne
elementy będą łączone w coraz większe drzewa, aby ostatecznie utworzyć jedno wielkie drzewo Huffmana.
https://mitpress.mit.edu/sicp/full-text/book/book-Z-H-16.html#%_sec_Temp_261
https://mitpress.mit.edu/sicp/full-text/book/book-Z-H-16.html#%_thm_2.69
Zadanie 6. Napisz funkcję dekodującą wiadomość zadaną jako listę 0 i 1, przy pomocy utworzonego drzewa
Huffmana. Zademonstruj jej działanie dla przykładu z zadania 2.67. Wynik podany jest na następnej stronie.
https://mitpress.mit.edu/sicp/full-text/book/book-Z-H-16.html#%_thm_2.67
Zadanie 7. Napisz funkcję kodującą wiadomość, przy pomocy utworzonego drzewa Huffmana.
Zakoduj wiadomość otrzymaną w zadaniu 6., sprawdź czy otrzymano taki sam kod.
Zakoduj wiadomość otrzymaną w zadaniu 6., używając drzewa Huffmana wygenerowanego dla symboli i wag:
A: 5, B: 1, D: 2, C: 1, a następnie ją odkoduj.
https://mitpress.mit.edu/sicp/full-text/book/book-Z-H-16.html#%_thm_2.68
Odpowiedź do zadania 6: Zakodowana wiadomośc to: ADABBCA

Podobne dokumenty