5 use export real.RealInfix
8 type or_integer_float = Integer int | Real real
11 (* sum integers in a list *)
12 function add_int (e: list or_integer_float) : int =
15 | Cons (Integer n) t -> n + add_int t
16 | Cons _ t -> add_int t
19 (* sum reals in a list *)
20 function add_real (e: list or_integer_float) : real =
23 | Cons (Real x) t -> x +. add_real t
24 | Cons _ t -> add_real t
33 let rec sum (l: list or_integer_float) : (int, real) =
40 | Integer n -> (n + a,b)
41 | Real x -> (a,x +. b)
44 { let (si, sf) = result in si = add_int l /\ sf = add_real l }
48 Cons (Integer 5) (Cons (Real 3.3) (Cons (Integer 8)
49 (Cons (Real 1.4) (Cons (Integer 9) Nil))))
65 let sum (l: list or_integer_float) : (int, real) =
72 invariant { !si + add_int !ll = add_int l /\
73 !sf +. add_real !ll = add_real l
77 | Cons (Integer n) t ->
78 si := !si + n; ll := t
80 sf := !sf +. x; ll := t
84 with Break -> (!si, !sf)
86 { let (si, sf) = result in si = add_int l /\ sf = add_real l }
91 Cons (Integer 5) (Cons (Real 3.3) (Cons (Integer 8)
92 (Cons (Real 1.4) (Cons (Integer 9) Nil))))