diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/gen_lib/prompt.lem | 61 | ||||
| -rw-r--r-- | src/gen_lib/state.lem | 61 | ||||
| -rw-r--r-- | src/pretty_print_lem.ml | 8 | ||||
| -rw-r--r-- | src/rewriter.ml | 20 |
4 files changed, 97 insertions, 53 deletions
diff --git a/src/gen_lib/prompt.lem b/src/gen_lib/prompt.lem index cdff2972..8ef9dd9b 100644 --- a/src/gen_lib/prompt.lem +++ b/src/gen_lib/prompt.lem @@ -177,35 +177,56 @@ let rec foreachM_dec (stop,i,by) vars body = foreachM_dec (stop,i - by,by) vars body else return vars -val while_PP : forall 'vars. bool -> 'vars -> ('vars -> bool) -> ('vars -> 'vars) -> 'vars -let rec while_PP is_while vars cond body = - if (cond vars = is_while) - then while_PP is_while (body vars) cond body - else vars +val while_PP : forall 'vars. 'vars -> ('vars -> bool) -> ('vars -> 'vars) -> 'vars +let rec while_PP vars cond body = + if cond vars then while_PP (body vars) cond body else vars -val while_PM : forall 'vars 'r. bool -> 'vars -> ('vars -> bool) -> +val while_PM : forall 'vars 'r. 'vars -> ('vars -> bool) -> ('vars -> MR 'vars 'r) -> MR 'vars 'r -let rec while_PM is_while vars cond body = - if (cond vars = is_while) - then body vars >>= fun vars -> while_PM is_while vars cond body +let rec while_PM vars cond body = + if cond vars then + body vars >>= fun vars -> while_PM vars cond body else return vars -val while_MP : forall 'vars 'r. bool -> 'vars -> ('vars -> MR bool 'r) -> +val while_MP : forall 'vars 'r. 'vars -> ('vars -> MR bool 'r) -> ('vars -> 'vars) -> MR 'vars 'r -let rec while_MP is_while vars cond body = - cond vars >>= fun continue -> - if (continue = is_while) - then while_MP is_while (body vars) cond body - else return vars +let rec while_MP vars cond body = + cond vars >>= fun cond_val -> + if cond_val then while_MP (body vars) cond body else return vars -val while_MM : forall 'vars 'r. bool -> 'vars -> ('vars -> MR bool 'r) -> +val while_MM : forall 'vars 'r. 'vars -> ('vars -> MR bool 'r) -> ('vars -> MR 'vars 'r) -> MR 'vars 'r -let rec while_MM is_while vars cond body = - cond vars >>= fun continue -> - if (continue = is_while) - then body vars >>= fun vars -> while_MM is_while vars cond body +let rec while_MM vars cond body = + cond vars >>= fun cond_val -> + if cond_val then + body vars >>= fun vars -> while_MM vars cond body else return vars +val until_PP : forall 'vars. 'vars -> ('vars -> bool) -> ('vars -> 'vars) -> 'vars +let rec until_PP vars cond body = + let vars = body vars in + if (cond vars) then vars else until_PP (body vars) cond body + +val until_PM : forall 'vars 'r. 'vars -> ('vars -> bool) -> + ('vars -> MR 'vars 'r) -> MR 'vars 'r +let rec until_PM vars cond body = + body vars >>= fun vars -> + if (cond vars) then return vars else until_PM vars cond body + +val until_MP : forall 'vars 'r. 'vars -> ('vars -> MR bool 'r) -> + ('vars -> 'vars) -> MR 'vars 'r +let rec until_MP vars cond body = + let vars = body vars in + cond vars >>= fun cond_val -> + if cond_val then return vars else until_MP vars cond body + +val until_MM : forall 'vars 'r. 'vars -> ('vars -> MR bool 'r) -> + ('vars -> MR 'vars 'r) -> MR 'vars 'r +let rec until_MM vars cond body = + body vars >>= fun vars -> + cond vars >>= fun cond_val -> + if cond_val then return vars else until_MM vars cond body + (*let write_two_regs r1 r2 vec = let is_inc = let is_inc_r1 = is_inc_of_reg r1 in diff --git a/src/gen_lib/state.lem b/src/gen_lib/state.lem index cbec7204..69b9e301 100644 --- a/src/gen_lib/state.lem +++ b/src/gen_lib/state.lem @@ -238,35 +238,56 @@ let rec foreachM_dec (stop,i,by) vars body = foreachM_dec (stop,i - by,by) vars body else return vars -val while_PP : forall 'vars. bool -> 'vars -> ('vars -> bool) -> ('vars -> 'vars) -> 'vars -let rec while_PP is_while vars cond body = - if (cond vars = is_while) - then while_PP is_while (body vars) cond body - else vars +val while_PP : forall 'vars. 'vars -> ('vars -> bool) -> ('vars -> 'vars) -> 'vars +let rec while_PP vars cond body = + if cond vars then while_PP (body vars) cond body else vars -val while_PM : forall 'regs 'vars 'e. bool -> 'vars -> ('vars -> bool) -> +val while_PM : forall 'regs 'vars 'e. 'vars -> ('vars -> bool) -> ('vars -> ME 'regs 'vars 'e) -> ME 'regs 'vars 'e -let rec while_PM is_while vars cond body = - if (cond vars = is_while) - then body vars >>= fun vars -> while_PM is_while vars cond body +let rec while_PM vars cond body = + if cond vars then + body vars >>= fun vars -> while_PM vars cond body else return vars -val while_MP : forall 'regs 'vars 'e. bool -> 'vars -> ('vars -> ME 'regs bool 'e) -> +val while_MP : forall 'regs 'vars 'e. 'vars -> ('vars -> ME 'regs bool 'e) -> ('vars -> 'vars) -> ME 'regs 'vars 'e -let rec while_MP is_while vars cond body = - cond vars >>= fun continue -> - if (continue = is_while) - then while_MP is_while (body vars) cond body - else return vars +let rec while_MP vars cond body = + cond vars >>= fun cond_val -> + if cond_val then while_MP (body vars) cond body else return vars -val while_MM : forall 'regs 'vars 'e. bool -> 'vars -> ('vars -> ME 'regs bool 'e) -> +val while_MM : forall 'regs 'vars 'e. 'vars -> ('vars -> ME 'regs bool 'e) -> ('vars -> ME 'regs 'vars 'e) -> ME 'regs 'vars 'e -let rec while_MM is_while vars cond body = - cond vars >>= fun continue -> - if (continue = is_while) - then body vars >>= fun vars -> while_MM is_while vars cond body +let rec while_MM vars cond body = + cond vars >>= fun cond_val -> + if cond_val then + body vars >>= fun vars -> while_MM vars cond body else return vars +val until_PP : forall 'vars. 'vars -> ('vars -> bool) -> ('vars -> 'vars) -> 'vars +let rec until_PP vars cond body = + let vars = body vars in + if (cond vars) then vars else until_PP (body vars) cond body + +val until_PM : forall 'regs 'vars 'e. 'vars -> ('vars -> bool) -> + ('vars -> ME 'regs 'vars 'e) -> ME 'regs 'vars 'e +let rec until_PM vars cond body = + body vars >>= fun vars -> + if (cond vars) then return vars else until_PM vars cond body + +val until_MP : forall 'regs 'vars 'e. 'vars -> ('vars -> ME 'regs bool 'e) -> + ('vars -> 'vars) -> ME 'regs 'vars 'e +let rec until_MP vars cond body = + let vars = body vars in + cond vars >>= fun cond_val -> + if cond_val then return vars else until_MP vars cond body + +val until_MM : forall 'regs 'vars 'e. 'vars -> ('vars -> ME 'regs bool 'e) -> + ('vars -> ME 'regs 'vars 'e) -> ME 'regs 'vars 'e +let rec until_MM vars cond body = + body vars >>= fun vars -> + cond vars >>= fun cond_val -> + if cond_val then return vars else until_MM vars cond body + (*let write_two_regs r1 r2 bvec state = let vec = bvec_to_vec bvec in let is_inc = diff --git a/src/pretty_print_lem.ml b/src/pretty_print_lem.ml index 67febd0a..3832c187 100644 --- a/src/pretty_print_lem.ml +++ b/src/pretty_print_lem.ml @@ -662,8 +662,10 @@ let doc_exp_lem, doc_let_lem = ) ) | Id_aux ((Id (("while_PP" | "while_PM" | - "while_MP" | "while_MM" ) as loopf),_)) -> - let [is_while;cond;body;e5] = args in + "while_MP" | "while_MM" | + "until_PP" | "until_PM" | + "until_MP" | "until_MM") as loopf),_)) -> + let [cond;body;e5] = args in let varspp = match e5 with | E_aux (E_tuple vars,_) -> let vars = List.map (fun (E_aux (E_id id,_)) -> doc_id_lem id) vars in @@ -676,7 +678,7 @@ let doc_exp_lem, doc_let_lem = string "_" in parens ( (prefix 2 1) - ((separate space) [string loopf;expY is_while;expY e5]) + ((separate space) [string loopf; expY e5]) ((prefix 0 1) (parens (prefix 1 1 (separate space [string "fun";varspp;arrow]) (expN cond))) (parens (prefix 1 1 (separate space [string "fun";varspp;arrow]) (expN body)))) diff --git a/src/rewriter.ml b/src/rewriter.ml index c537e196..ba767081 100644 --- a/src/rewriter.ml +++ b/src/rewriter.ml @@ -3339,17 +3339,17 @@ let rec rewrite_var_updates ((E_aux (expaux,((l,_) as annot))) as exp) = (* let cond = rewrite_var_updates (add_vars false cond vartuple) in *) let body = rewrite_var_updates (add_vars overwrite body vartuple) in let (E_aux (_,(_,bannot))) = body in - let fname = match effectful cond, effectful body with - | false, false -> "while_PP" - | false, true -> "while_PM" - | true, false -> "while_MP" - | true, true -> "while_MM" in + let fname = match loop, effectful cond, effectful body with + | While, false, false -> "while_PP" + | While, false, true -> "while_PM" + | While, true, false -> "while_MP" + | While, true, true -> "while_MM" + | Until, false, false -> "until_PP" + | Until, false, true -> "until_PM" + | Until, true, false -> "until_MP" + | Until, true, true -> "until_MM" in let funcl = Id_aux (Id fname,gen_loc el) in - let is_while = - match loop with - | While -> annot_exp (E_lit (mk_lit L_true)) (gen_loc el) env bool_typ - | Until -> annot_exp (E_lit (mk_lit L_false)) (gen_loc el) env bool_typ in - let v = E_aux (E_app (funcl,[is_while;cond;body;vartuple]), (gen_loc el, bannot)) in + let v = E_aux (E_app (funcl,[cond;body;vartuple]), (gen_loc el, bannot)) in let pat = if overwrite then mktup_pat el vars else annot_pat (P_tup [pat; mktup_pat pl vars]) pl env (typ_of v) in |
