@@ -950,92 +950,57 @@ let equantif_of_quantif (qt : quantif) : equantif =
950950 | Lexists -> `EExists
951951
952952(* -------------------------------------------------------------------- *)
953- let rec ss_inv_of_expr m (e : expr ) =
953+
954+ let rec form_of_expr_r ?m (e : expr ) =
954955 match e.e_node with
955956 | Eint n ->
956- {m;inv = f_int n}
957+ f_int n
957958
958959 | Elocal id ->
959- {m;inv = f_local id e.e_ty}
960+ f_local id e.e_ty
960961
961962 | Evar pv ->
962- f_pvar pv e.e_ty m
963+ begin
964+ match m with
965+ | None -> failwith " expecting memory"
966+ | Some m -> (f_pvar pv e.e_ty m).inv
967+ end
963968
964969 | Eop (op , tys ) ->
965- {m;inv = f_op op tys e.e_ty}
970+ f_op op tys e.e_ty
966971
967972 | Eapp (ef , es ) ->
968- let f_app' f = f_app (List. hd f) (List. tl f) e.e_ty in
969- map_ss_inv f_app' ((ss_inv_of_expr m ef)::(List. map (ss_inv_of_expr m) es))
973+ f_app (form_of_expr_r ?m ef) (List. map (form_of_expr_r ?m) es) e.e_ty
970974
971975 | Elet (lpt , e1 , e2 ) ->
972- map_ss_inv2 ( f_let lpt) (ss_inv_of_expr m e1) (ss_inv_of_expr m e2)
976+ f_let lpt (form_of_expr_r ? m e1) (form_of_expr_r ? m e2)
973977
974978 | Etuple es ->
975- map_ss_inv f_tuple (List. map (ss_inv_of_expr m) es)
979+ f_tuple (List. map (form_of_expr_r ? m) es)
976980
977981 | Eproj (e1 , i ) ->
978- let f_proj' f = f_proj f i e.e_ty in
979- map_ss_inv1 f_proj' (ss_inv_of_expr m e1)
982+ f_proj (form_of_expr_r ?m e1) i e.e_ty
980983
981984 | Eif (e1 , e2 , e3 ) ->
982- let e1 = ss_inv_of_expr m e1 in
983- let e2 = ss_inv_of_expr m e2 in
984- let e3 = ss_inv_of_expr m e3 in
985- map_ss_inv3 f_if e1 e2 e3
985+ let e1 = form_of_expr_r ? m e1 in
986+ let e2 = form_of_expr_r ? m e2 in
987+ let e3 = form_of_expr_r ? m e3 in
988+ f_if e1 e2 e3
986989
987990 | Ematch (b , fs , ty ) ->
988- let b' = ss_inv_of_expr m b in
989- let fs' = List. map (ss_inv_of_expr m) fs in
990- let f_match' fl = f_match (List. hd fl) (List. tl fl) ty in
991- map_ss_inv f_match' (b'::fs')
991+ let b' = form_of_expr_r ?m b in
992+ let fs' = List. map (form_of_expr_r ?m) fs in
993+ f_match b' fs' ty
992994
993995 | Equant (qt , b , e ) ->
994996 let b = List. map (fun (x , ty ) -> (x, GTty ty)) b in
995- let e = ss_inv_of_expr m e in
996- map_ss_inv1 ( f_quant (quantif_of_equantif qt) b) e
997+ let e = form_of_expr_r ? m e in
998+ f_quant (quantif_of_equantif qt) b e
997999
998- let rec form_of_expr e =
999- match e.e_node with
1000- | Eint n ->
1001- f_int n
1002-
1003- | Elocal id ->
1004- f_local id e.e_ty
1005-
1006- | Evar _ ->
1007- failwith " needs memory for program variable"
1008-
1009- | Eop (op , tys ) ->
1010- f_op op tys e.e_ty
1011-
1012- | Eapp (ef , es ) ->
1013- f_app (form_of_expr ef) (List. map form_of_expr es) e.e_ty
1014-
1015- | Elet (lpt , e1 , e2 ) ->
1016- f_let lpt (form_of_expr e1) (form_of_expr e2)
1017-
1018- | Etuple es ->
1019- f_tuple (List. map form_of_expr es)
1020-
1021- | Eproj (e1 , i ) ->
1022- f_proj (form_of_expr e1) i e.e_ty
1023-
1024- | Eif (e1 , e2 , e3 ) ->
1025- let e1 = form_of_expr e1 in
1026- let e2 = form_of_expr e2 in
1027- let e3 = form_of_expr e3 in
1028- f_if e1 e2 e3
1029-
1030- | Ematch (b , fs , ty ) ->
1031- let b' = form_of_expr b in
1032- let fs' = List. map form_of_expr fs in
1033- f_match b' fs' ty
1034-
1035- | Equant (qt , b , e ) ->
1036- let b = List. map (fun (x , ty ) -> (x, GTty ty)) b in
1037- let e = form_of_expr e in
1038- f_quant (quantif_of_equantif qt) b e
1000+ let form_of_expr e = form_of_expr_r e
1001+
1002+ let ss_inv_of_expr m (e : expr ) =
1003+ {m;inv= form_of_expr_r ~m e}
10391004
10401005(* -------------------------------------------------------------------- *)
10411006exception CannotTranslate
0 commit comments