Ullman 12.1(b) type ('a, 'b) triples = ('a*'a*'b) list; 12.4 exception Emptytree; fun subtrees Empty = raise Emptytree | subtrees (Node(a,l,r)) = (l,r); 13.1(b) fun assign (a:int, b, Empty) = Node((a,b), Empty, Empty) | assign (a, b, Node((c,d), left, right)) = if a = c then Node((c,b), left, right) else if a < c then Node((c,d),assign(a,b,left),right) else Node((c,d),left,assign(a,b,right)); 13.2 fun preOrder_g (Node(a, nil)) = [a] | preOrder_g (Node(a, Node(b,l)::ts)) = [a] @ preOrder_g(Node(b,l @ ts)); fun sum_g t = reduce(op +, preOrder_g t); 13.4(a) datatype logiexp = PROP of string | AND of logiexp * logiexp | OR of logiexp * logiexp | NOT of logiexp; (b) fun eval(AND(E1,E2), L:string list) = (eval (E1, L)) andalso (eval (E2, L)) | eval(OR(E1,E2), L) = (eval (E1, L)) orelse (eval (E2, L)) | eval(NOT E1, L) = not (eval(E1, L)) | eval(PROP s, L) = member(s, L); 13.7(b) fun insert(x,Empty,lt) = Node(x,Empty,Empty) | insert(x,T as Node(y,left,right),lt) = if x=y then T else if lt(x,y) then Node(y,insert(x,left,lt),right) else Node(y,left,insert(x,right,lt)); (c) fun delete(x,Empty,lt) = Empty | delete(x,Node(y,left,right),lt) = if lt(x,y) then Node(y,delete(x,left,lt),right) else if lt(y,x) then Node(y,left,delete(x,right,lt)) else if left = Empty then right else if right = Empty then left else let val (z,R) = deletemin(right) in Node(z,left,R) end; Reade 5.1 datatype month = Jan | Feb | Mar | Apr | May | Jun | Jul | Aug | Sep | Oct | Nov | Dec; datatype day = Day of int; datatype year = Year of int; datatype dates = Dates of month * day * year; (* Limitations: no range check for day, no format check for year *) datatype money = Usdollar of int | Pound of int | Yen of int ... (* Limitations: only integer value *) 5.10 fun convert l = let fun f x = let fun g nil = nil | g((hx,hy)::t) = if x = hx then hy::(g t) else g t in g l end in Graph f end 5.26 For C: 'a tree: Just like C code for intbtree in lecture notes. ('a,'b) abtree: Assume 'a is int and 'b is double. typedef enum {Leaf, Node} Node_type; typedef struct abtree{ Node_type node_type; union { struct {int value;} Leaf; struct {struct abtree *left; double value; struct abtree *right;} Node; } u; } *Abtree; Abtree mk_Leaf(int v) { Abtree t = (Abtree) (malloc(sizeof(struct abtree))); assert(t); t->node_type = Leaf; t->u.Leaf.value = v; return t; }; Abtree mk_Node(Abtree l, int v, Abtree r){ Abtree t = (Abtree) (malloc(sizeof(struct abtree))); assert(t); t->node_type = Node; t->u.Node.left = l; t->u.Node.value = v; t->u.Node.right = r; return t; }; is_Leaf(Abtree t) { return t->node_type == Leaf; } is_Node(Abtree t) { return t->node_type == Node; } int Leaf_value(Abtree t) { assert(is_Leaf(t)); return t->u.Leaf.value; } Abtree Node_left(Abtree t) { assert(is_Node(t)); return t->u.Node.left; } double Node_value(Abtree t) { assert(is_Node(t)); return t->u.Node.value; } Abtree Node_right(Abtree t) { assert(is_Node(t)); return t->u.Node.right; }