| 5377 |      1 | Exercise = Main +
 | 
|  |      2 | datatype ifex = CIF bool | VIF nat | IF ifex ifex ifex
 | 
|  |      3 | consts valif :: ifex => (nat => bool) => bool
 | 
|  |      4 | primrec valif ifex
 | 
|  |      5 | "valif (CIF b)    env = b"
 | 
|  |      6 | "valif (VIF x)    env = env x"
 | 
|  |      7 | "valif (IF b t e) env = (if valif b env then valif t env
 | 
|  |      8 |                                         else valif e env)"
 | 
|  |      9 | consts normif :: ifex => ifex => ifex => ifex
 | 
|  |     10 | primrec normif ifex
 | 
|  |     11 | "normif (CIF b)    t e = (if b then t else e)"
 | 
|  |     12 | "normif (VIF x)    t e = IF (VIF x) t e"
 | 
|  |     13 | "normif (IF b t e) u f = normif b (normif t u f) (normif e u f)"
 | 
|  |     14 | consts norm :: ifex => ifex
 | 
|  |     15 | primrec norm ifex
 | 
|  |     16 | "norm (CIF b)    = CIF b"
 | 
|  |     17 | "norm (VIF x)    = VIF x"
 | 
|  |     18 | "norm (IF b t e) = normif b (norm t) (norm e)"
 | 
|  |     19 | consts normal :: ifex => bool
 | 
|  |     20 | primrec normal ifex
 | 
|  |     21 | "normal(CIF b) = True"
 | 
|  |     22 | "normal(VIF x) = True"
 | 
|  |     23 | "normal(IF b t e) = (normal t & normal e &
 | 
|  |     24 |       (case b of CIF b => False | VIF x => True | IF x y z => False))"
 | 
|  |     25 | end
 |