Lecture 11, July 12
The lecture notes I post serve two purposes: to remind you of the topics we discussed and to provide any interesting code examples I did during lecture. I would describe these notes as an outline, not a summary, of what I talked about during lecture. You are not expected to be able to learn the material simply from examining these notes, nor is reading these notes a reasonable substitute for attending lecture.
Trees
We spent most of lectur talking about trees. We also talked about make-predicate and assert.#lang typed/racket (require "../include/uchicago151.rkt") (define-struct Point ([x : Real] [y : Real])) (: f : (U Point Number) -> Number) (define (f p) (cond [(Point? p) (Point-x p)] [else p])) ;(: g : Any -> Number) ;(define (g x) ; (cond ; [(number? x) (+ 4 x)] ; [else (error "Non-number given to g")])) (: g : Any -> Number) (define (g x) (+ (assert x number?) 4)) (: h : Integer -> Integer) (define (h x) (cond [(even? x) (assert (/ x 2) exact-integer?)] [else (+ 1 (* 3 x))])) ;(define (h x) ; (cond ; [(even? x) (/ x 2)] ; [else (+ 1 (* 3 x))])) ;(cond ; [(or (string=? "a" (string-first s)) ; (string=? "e" (string-first s)) ; (string=? "i" (string-first s)) ; .... (define-type Vowel (U "a" "e" "i" "o" "u")) (: e : String -> Vowel) (define (e x) (cond [((make-predicate Vowel) x) x] [else (error "Input not vowel")])) (define-type Expr (U Number Plus Times)) (define-struct Plus ([left : Expr] [right : Expr])) (define-struct Times ([left : Expr] [right : Expr])) (: evaluate : Expr -> Number) (define (evaluate exp) (match exp [(? number?) exp] [(Plus l r) (+ (evaluate l) (evaluate r))] [(Times l r) (* (evaluate l) (evaluate r))])) (: num-ops : Expr -> Nonnegative-Integer) (define (num-ops exp) (match exp [(? number?) 0] [(Plus l r) (+ 1 (num-ops l) (num-ops r))] [(Times l r) (+ 1 (num-ops l) (num-ops r))])) (define-struct Empty ()) (define-struct Num-Node ([value : Real] [lsub : Num-Tree] [rsub : Num-Tree])) (define-type Num-Tree (U Empty Num-Node)) ; Determines whether a real is in the tree or not (: num-find : Real Num-Tree -> Boolean) (define (num-find n t) (match t [(Empty) false] [(Num-Node v l r) (cond [(= n v) true] [(num-find n l) true] [(num-find n r) true] [else false])])) ; (or (= n v) ; (num-find n l) ; (num-find n r))])) (: test-tree Num-Tree) (define test-tree (Num-Node 5 (Num-Node 3 (Empty) (Empty)) (Num-Node 7 (Empty) (Num-Node 9 (Num-Node 8 (Empty) (Empty)) (Num-Node 10 (Empty) (Empty)))))) ;(define-struct Empty ()) (define-struct (Node A) ([value : A] [lsub : (Tree A)] [rsub : (Tree A)])) (define-type (Tree A) (U Empty (Node A))) (: bst-insert : Real Num-Tree -> Num-Tree) (define (bst-insert n t) (match t [(Empty) (Num-Node n (Empty) (Empty))] [(Num-Node v l r) (cond [(= n v) t] [(< n v) (Num-Node v (bst-insert n l) r)] [else (Num-Node v l (bst-insert n r))])])) (: insert : (All (A) (A A -> Boolean) A (Tree A) -> (Tree A))) (define (insert f n t) (match t [(Empty) (Node n (Empty) (Empty))] [(Node v l r) (cond [(equal? n v) t] [(f n v) (Node v (insert f n l) r)] [else (Node v l (insert f n r))])])) ;(foldl (λ ([n : Real] [t : (Tree Real)]) (insert < n t)) (Empty) '(4 3 6 1)) (: bst-find : Real Num-Tree -> Boolean) (define (bst-find n t) (match t [(Empty) false] [(Num-Node v l r) (cond [(= n v) true] [(< n v) (bst-find n l)] [else (bst-find n r)])])) (: find : (All (A) (A A -> Boolean) A (Tree A) -> Boolean)) (define (find f n t) (match t [(Empty) false] [(Node v l r) (cond [(equal? n v) true] [(f n v) (find f n l)] [else (find f n r)])])) (: inorder : (All (A) (Tree A) -> (Listof A))) (define (inorder t) (match t [(Empty) '()] [(Node v l r) (append (inorder l) (append (list v) (inorder r)))])) (: preorder : (All (A) (Tree A) -> (Listof A))) (define (preorder t) (match t [(Empty) '()] [(Node v l r) (append (list v) (append (preorder l) (preorder r)))])) (: sum-tree : (Tree Number) -> Number) (define (sum-tree t) (match t [(Empty) 0] [(Node v l r) (+ v (sum-tree l) (sum-tree r))])) ; pre-order traversal (: str-app-tree : (Tree String) -> String) (define (str-app-tree t) (match t [(Empty) ""] [(Node v l r) (string-append (str-app-tree l) (str-app-tree r) v)])) (str-app-tree (Node "Hi" (Node "Cat" (Empty) (Empty)) (Node "Dog" (Empty) (Empty)))) (define-struct (3-Node A) ([v : A] [l : (3-Tree A)] [m : (3-Tree A)] [r : (3-Tree A)])) (define-type (3-Tree A) (U Empty (3-Node A))) (define-struct (Variable-Node A) ([v : A] [children : (Listof (Variable-Tree A))])) (define-type (Variable-Tree A) (U Empty (Variable-Node A))) (: count : (All (A) (Variable-Tree A) -> Nonnegative-Integer)) (define (count t) (match t [(Empty) 0] [(Variable-Node _ chldrn) (+ 1 (foldl + 0 (map (inst count A) chldrn)))]))