Symbolisk data (1 2 3 4) (a b c d) (jacek johan david) ((jacek "jacek@cs.lth.se") (johan "johang@cs.lth.se") (david "dat99dpe@ludat.lth.se")) ((anna 13) (per 11) (klas 9) (eva 4)) (+ (* 23 4) (/ y x)) (define (fak n) (if (= n 0) 1 (* n (fak (- n 1))))) quote (define a 1) (define b 2) > (list a b) (1 2) > (list a b) (a b) > (list a b) (1 b) Ekvivalenta uttryck: (list a b) (list (quote a) (quote b)) Jacek Malec, Dept. of Computer Science, Lund University 3 Jacek Malec, Dept. of Computer Science, Lund University 4 Nyttiga funktioner eq? jamför två symboler och svarar på frågan: Är det en och samma symbol? > (car (a b c)) a >(cdr (a b c)) (b c) > () () > (eq? a b) #f > (eq? a a) #t > (eq? 1 1) #t > (eq? 1 1.0) #f > (= 1 1.0) #t
memq Symbolisk deriviering (memq symbol lista) Finns symboln medinilistan? (define (memq item x) (cond ((null? x) #f) ((eq? item (car x)) x) (else (memq item (cdr x))))) > (memq apple (pear banana prune)) > (memq apple (x (apple sauce) y apple pear)) > (memq red ((red shoes) (blue socks))) > (memq red (red shoes blue socks)) (ax 2 + bx + c) =2ax + b Man deriverar genom att rekursivt använda följande regler: d(u + v) d(uv) dc =0 =1 = du + dv = v(du dv )+u( ) Studera exemplet själv! Jacek Malec, Dept. of Computer Science, Lund University 7 Jacek Malec, Dept. of Computer Science, Lund University 8 Mängder Val av representation En mängd är en samling (skilda) objekt. {1, 2, 3,a,c,jacek} = = {1, 2, 3, 1, 2, 3, 1, 2, 3,a,jacek,jacek,c} Mängdoperationer: summa (union) A B (t.ex. {1, 2, 3} {3, 4, 5} = {1, 2, 3, 4, 5}) snitt A B (t.ex. {1, 2, 3} {3, 4, 5} = {3}) tillhörighet x A (t.ex. 1 {1, 2, 3}) tom mängd Vi behöver följande operationer: union-set intersection-set element-of-set? adjoin-set Hur skall vi implementera de? Hur som helst, så att specifikationen är uppfylld!
Mängder som oordnade listor Formell specifikation: För varje mängd S och varje element x, (element-of-set? x (adjoin-set x S)) är sann; För alla mängder S och T och varje objekt x, (element-of-set? x (union-set S T)) är lika med (or (element-of-set? x S) (element-of-set? x T)); För alla mängder S och T och varje objekt x, (element-of-set? x (intersection-set S T)) är lika med (and (element-of-set? x S) (element-of-set? x T)); För varje objekt x, (element-of-set? ()) är falsk. x Antagande: element upprepas ej! (define (element-of-set? x set) (cond ((null? set) #f) ((equal? x (car set)) #t) ; godtyckliga element! (else (element-of-set? x (cdr set))))) (define (adjoin-set x set) (if (element-of-set? x set) set (cons x set))) (define (intersection-set set1 set2) (cond ((or (null? set1) (null? set2)) ()) ((element-of-set? (car set1) set2) (cons (car set1) (intersection-set (cdr set1) set2))) (else (intersection-set (cdr set1) set2)))) Jacek Malec, Dept. of Computer Science, Lund University 11 Jacek Malec, Dept. of Computer Science, Lund University 12 Mängder som ordnade listor ordning vi antar att vi kan jamföra alla objekt med varandra: < m, = m,> m Här begränsar vi oss till tal (d.v.s. <, =,>). {3, 10, 6, 1} = (1 3 6 10) (define (element-of-set? x set) (cond ((null? set) #f) ((= x (car set)) #t) ((< x (car set)) #f) (else (element-of-set? x (cdr set))))) (define (intersection-set set1 set2) (if (or (null? set1) (null? set2)) () (let ((x1 (car set1)) (x2 (car set2))) (cond ((= x1 x2) (cons x1 (intersection-set (cdr set1) (cdr set2)))) ((< x1 x2) (intersection-set (cdr set1) set2)) ((< x2 x1) (intersection-set set1 (cdr set2))))))) intersection-set har komplexitet Θ(n)!
Mängder som binära träd Vårt krav: att varje element i det vänstra delträdet är mindre än roten och att varje element i det högra delträdet är större än roten. Exempel: {2, 4, 6, 8, 10, 12} Balanserade träd ger bättre komplexitet! (Θ(log(n))) (define (entry tree) (car tree)) (define (left-branch tree) (cadr tree)) (define (right-branch tree) (caddr tree)) (define (make-tree entry left right) (list entry left right)) (define (element-of-set? x set) (cond ((null? set) #f) ((= x (entry set)) #t) ((< x (entry set)) (element-of-set? x (left-branch set))) ((> x (entry set)) (element-of-set? x (right-branch set))))) (define (adjoin-set x set) (cond ((null? set) (make-tree x () ())) ((= x (entry set)) set) ((< x (entry set)) (make-tree (entry set) (adjoin-set x (left-branch set)) (right-branch set))) ((> x (entry set)) (make-tree (entry set) (left-branch set) (adjoin-set x (right-branch set)))))) Jacek Malec, Dept. of Computer Science, Lund University 15 Jacek Malec, Dept. of Computer Science, Lund University 16 Huffmans kodningsträd Svenska tecken brukar kodas m.h.a. ISO-8859-1 med 8 bitar - vi kan representera 256 tecken medensådan kod. För enkelhetens skull kodar vi endast A - F A 000 B 001 C 010 D 011 E 100 F 101 G 110 H 111 Ett meddelande: ACBGAACFHBACHFE kodas som: 000010001110000000010101111001000010111101100 45 bitar kod med konstant-längd Koder med variabel längd A-4gånger C-3gånger B, F, H - 2 gånger E, G - 1 gång D-0gånger Ett förslag: A0 C 100 B 1010 D 1011 E 1100 F 1101 G 1110 H 1111
Meddelandet: ACBGAACFHBACHFE Kodas nu som: 010010101110001001101111110100100111111011100 Också 45bitar. Men ett meddelande: AABACAAF skulle kodas som: 0010100100001101 med 16 bitar, istället av 24! Prefix-koder Huffman kodning Huffman kodning Trädrepresentation (define (make-leaf symbol weight) (list leaf symbol weight)) (define (leaf? object) (eq? (car object) leaf)) (define (symbol-leaf x) (cadr x)) (define (weight-leaf x) (caddr x)) Jacek Malec, Dept. of Computer Science, Lund University 19 Jacek Malec, Dept. of Computer Science, Lund University 20 Att skapa träd: (define (make-code-tree left right) (list left right (append (symbols left) (symbols right)) (+ (weight left) (weight right)))) (define (left-branch tree) (car tree)) (define (right-branch tree) (cadr tree)) (define (symbols tree) (if (leaf? tree) (list (symbol-leaf tree)) (caddr tree))) (define (weight tree) (if (leaf? tree) (weight-leaf tree) (cadddr tree))) Avkodning (define (decode bits tree) (define (decode-1 bits current-branch) (if (null? bits) () (let ((next-branch (choose-branch (car bits) current-branch))) (if (leaf? next-branch) (cons (symbol-leaf next-branch) (decode-1 (cdr bits) tree)) (decode-1 (cdr bits) next-branch))))) (decode-1 bits tree)) (define (choose-branch bit branch) (cond ((= bit 0) (left-branch branch)) ((= bit 1) (right-branch branch)) (else (error "bad bit -- CHOOSE-BRANCH" bit))))
Hjälpfunktioner (define (adjoin-set x set) (cond ((null? set) (list x)) ((< (weight x) (weight (car set))) (cons x set)) (else (cons (car set) (adjoin-set x (cdr set)))))) (define (make-leaf-set pairs) (if (null? pairs) () (let ((pair (car pairs))) (adjoin-set (make-leaf (car pair) (cadr pair)) (make-leaf-set (cdr pairs))))))