Answer to the First Test (FA96)

Note that these are the "what I had in mind/what I came up when I answered" answers. They are not definitive (i.e. other answers may be right).


1a)  datatype command = skip |
                        assign string * atype |
                        sequence of command * command |
                        ifexp of bexp * command * command;

 b)  fun cexp skip state = state |
         cexp (assign (x,y)) state = update state x (aexp y state) |
         cexp (sequence (c1,c2)) state = cexp c2 (cexp c1 state) |
         cexp (ifexp (b,c1,c2)) state = if (bexp b state)
                                         then (cexp c1 state)
                                         else (cexp c2 state);

2a)  (\x.x x)(\x.x x) only reduces to itself (technically speaking the
                      problem is impossible)

 b)  (\x y z. x (y x z) y)(\x y.y)(\x y.x)u =
     (\y z.(\x y. y) (y (\x y.y) z) y)(\x y.x)u =
     (\z.(\x y.y) ((\x y.x)(\x y.y) z)(\x y.x))u =
     (\x y.y)((\x y.x)(\x y.y)u)(\x y.x) =
     (\x y.y)((\y.(\x y.y))u)(\x y.x) =
     (\x y.y)(\x y.y)(\x y.x) =
     (\y.y)(\x y.x) =
     (\x y.x)

 c)  (\x y.y)((\x.x x)(\x.x x))(\x y.y) =
     (\y.y)(\x y.y) =
     (\x y.y)

3)  since we're in the middle of an induction, we assume the property
    holds for arbitrary b0,b1 both boolean expressions.

    ==>  assume we have a derivation (operational) for an and expression.
         then, we must have derivations  -> t0 and  -> t1.

	 by the I.H. B [|b0|] = {(s,t0)} and
                     B [|b1|] = {(s,t1)}
     
         by the "and" denotation rule

		B [| b0 ^ b1 |] = {(s,t0 ^ t1) | ((s,t0) mem B[|b0|]) and
                                                 ((s,t1) mem B[|b1|])}

    <==  assume we have a denotation for the "and" expression.
         then we must have  B [|b0|] = {(s,t0)} and
                     	    B [|b1|] = {(s,t1)}
     
	 by the IH we have  -> t0 and
                            -> t1

         and by the "and" derivation rule

	 -> t0    -> t1
        ___________________________      where t= t0 ^ t1
            -> t        


      QED.


4)  let addfn = \f m n.(iszero m -> n | (suc (f (pre m) n)))

5)  prove (add (suc a) b) = (suc (add a b))

    by induction on b

    base:  b=0
           
       (add (suc a) 0) = (suc (add a 0))
       (suc a)         = (suc a)          (apply defn of "add" on
                                             both sides)

    induction:  b=(suc k)

	IH:  (add (suc a) k) = (suc (add a k))

        (add (suc a) (suc k)) = (suc (add a (suc k)))
        (suc (add (suc a) (pre (suc k)))) = (suc (add a (suc k))) 
                                             --defn of add
        (suc (add (suc a) k)) = (suc (add a (suc k))) 
                                             --by pre-suc rule
        (suc (add (suc a) k)) = (suc (suc (add a (pre (suc k))))) 
                                             --defn of add
        (suc (add (suc a) k)) = (suc (suc (add a k)))
	                                     --by pre-suc rule
        (suc (suc (add a k))) = (suc (suc (add a k)))
                                             --by IH

6) "be somebody else"