summaryrefslogtreecommitdiff
path: root/src/gen_lib/prompt.lem
diff options
context:
space:
mode:
authorThomas Bauereiss2018-02-23 19:38:40 +0000
committerThomas Bauereiss2018-02-26 13:30:21 +0000
commit30ba876d4c465d9a6cf2eba4eb1ac4c3dbc7ed22 (patch)
treef08e199bb2cc932928296ba2fcdb5bd50d1f7d75 /src/gen_lib/prompt.lem
parentf100cf44857926030361ef66cff795169c29fdbc (diff)
Add/generate Isabelle lemmas about the monad lifting
Architecture-specific lemmas about concrete registers and types are generated and written to a file <prefix>_lemmas.thy, generic lemmas are in the theories *_extras.thy in lib/isabelle. In particular, State_extras contains simplification lemmas about the lifting from prompt to state monad.
Diffstat (limited to 'src/gen_lib/prompt.lem')
-rw-r--r--src/gen_lib/prompt.lem73
1 files changed, 15 insertions, 58 deletions
diff --git a/src/gen_lib/prompt.lem b/src/gen_lib/prompt.lem
index 756bb699..728014eb 100644
--- a/src/gen_lib/prompt.lem
+++ b/src/gen_lib/prompt.lem
@@ -10,81 +10,38 @@ let rec iter_aux i f xs = match xs with
| [] -> return ()
end
+declare {isabelle} termination_argument iter_aux = automatic
+
val iteri : forall 'rv 'a 'e. (integer -> 'a -> monad 'rv unit 'e) -> list 'a -> monad 'rv unit 'e
let iteri f xs = iter_aux 0 f xs
val iter : forall 'rv 'a 'e. ('a -> monad 'rv unit 'e) -> list 'a -> monad 'rv unit 'e
let iter f xs = iteri (fun _ x -> f x) xs
+val foreachM : forall 'a 'rv 'vars 'e.
+ list 'a -> 'vars -> ('a -> 'vars -> monad 'rv 'vars 'e) -> monad 'rv 'vars 'e
+let rec foreachM [] vars _ = return vars
+and foreachM (x :: xs) vars body =
+ body x vars >>= fun vars ->
+ foreachM xs vars body
-val foreachM_inc : forall 'rv 'vars 'e. (integer * integer * integer) -> 'vars ->
- (integer -> 'vars -> monad 'rv 'vars 'e) -> monad 'rv 'vars 'e
-let rec foreachM_inc (i,stop,by) vars body =
- if (by > 0 && i <= stop) || (by < 0 && stop <= i)
- then
- body i vars >>= fun vars ->
- foreachM_inc (i + by,stop,by) vars body
- else return vars
-
-
-val foreachM_dec : forall 'rv 'vars 'e. (integer * integer * integer) -> 'vars ->
- (integer -> 'vars -> monad 'rv 'vars 'e) -> monad 'rv 'vars 'e
-let rec foreachM_dec (i,stop,by) vars body =
- if (by > 0 && i >= stop) || (by < 0 && stop >= i)
- then
- body i vars >>= fun vars ->
- foreachM_dec (i - by,stop,by) vars body
- else return 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 'rv 'vars 'e. 'vars -> ('vars -> bool) ->
- ('vars -> monad 'rv 'vars 'e) -> monad 'rv 'vars 'e
-let rec while_PM vars cond body =
- if cond vars then
- body vars >>= fun vars -> while_PM vars cond body
- else return vars
+declare {isabelle} termination_argument foreachM = automatic
-val while_MP : forall 'rv 'vars 'e. 'vars -> ('vars -> monad 'rv bool 'e) ->
- ('vars -> 'vars) -> monad 'rv 'vars 'e
-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 'rv 'vars 'e. 'vars -> ('vars -> monad 'rv bool 'e) ->
+val whileM : forall 'rv 'vars 'e. 'vars -> ('vars -> monad 'rv bool 'e) ->
('vars -> monad 'rv 'vars 'e) -> monad 'rv 'vars 'e
-let rec while_MM vars cond body =
+let rec whileM vars cond body =
cond vars >>= fun cond_val ->
if cond_val then
- body vars >>= fun vars -> while_MM vars cond body
+ body vars >>= fun vars -> whileM 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 'rv 'vars 'e. 'vars -> ('vars -> bool) ->
- ('vars -> monad 'rv 'vars 'e) -> monad 'rv '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 'rv 'vars 'e. 'vars -> ('vars -> monad 'rv bool 'e) ->
- ('vars -> 'vars) -> monad 'rv '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 'rv 'vars 'e. 'vars -> ('vars -> monad 'rv bool 'e) ->
+val untilM : forall 'rv 'vars 'e. 'vars -> ('vars -> monad 'rv bool 'e) ->
('vars -> monad 'rv 'vars 'e) -> monad 'rv 'vars 'e
-let rec until_MM vars cond body =
+let rec untilM vars cond body =
body vars >>= fun vars ->
cond vars >>= fun cond_val ->
- if cond_val then return vars else until_MM vars cond body
+ if cond_val then return vars else untilM vars cond body
(*let write_two_regs r1 r2 vec =
let is_inc =