summaryrefslogtreecommitdiff
path: root/lib/coq/Sail2_state.v
diff options
context:
space:
mode:
authorBrian Campbell2019-10-24 14:33:57 +0100
committerBrian Campbell2019-10-24 14:33:57 +0100
commit0e2b220ec96cd29471bba9f46a132427bc4b1ac4 (patch)
tree812a5a44d3014cde683dc4128f252e2e7910209a /lib/coq/Sail2_state.v
parent73475b844cb09f06c78d8f8a426e9de0eeffc367 (diff)
Coq: use `abstract` to separate out proofs from definitions
- requires fixpoint definitions containing proofs to be processed in proof mode (due to a bug in Coq), so change libraries and pretty printing to do that - adjust some lemmas to avoid extra evars
Diffstat (limited to 'lib/coq/Sail2_state.v')
-rw-r--r--lib/coq/Sail2_state.v16
1 files changed, 10 insertions, 6 deletions
diff --git a/lib/coq/Sail2_state.v b/lib/coq/Sail2_state.v
index 7a25cbe9..618ca3a5 100644
--- a/lib/coq/Sail2_state.v
+++ b/lib/coq/Sail2_state.v
@@ -114,13 +114,15 @@ let rec untilS vars cond body s =
if cond_val then returnS vars s'' else untilS vars cond body s'')) s')) s
*)
-Fixpoint whileST' {RV Vars E} limit (vars : Vars) (cond : Vars -> monadS RV bool E) (body : Vars -> monadS RV Vars E) (acc : Acc (Zwf 0) limit) : monadS RV Vars E :=
+Fixpoint whileST' {RV Vars E} limit (vars : Vars) (cond : Vars -> monadS RV bool E) (body : Vars -> monadS RV Vars E) (acc : Acc (Zwf 0) limit) : monadS RV Vars E.
+exact (
if Z_ge_dec limit 0 then
cond vars >>$= fun cond_val =>
if cond_val then
- body vars >>$= fun vars => whileST' (limit - 1) vars cond body (_limit_reduces acc)
+ body vars >>$= fun vars => whileST' _ _ _ (limit - 1) vars cond body (_limit_reduces acc)
else returnS vars
- else failS "Termination limit reached".
+ else failS "Termination limit reached").
+Defined.
Definition whileST {RV Vars E} (vars : Vars) measure (cond : Vars -> monadS RV bool E) (body : Vars -> monadS RV Vars E) : monadS RV Vars E :=
let limit := measure vars in
@@ -128,12 +130,14 @@ Definition whileST {RV Vars E} (vars : Vars) measure (cond : Vars -> monadS RV b
(*val untilM : forall 'rv 'vars 'e. 'vars -> ('vars -> monad 'rv bool 'e) ->
('vars -> monad 'rv 'vars 'e) -> monad 'rv 'vars 'e*)
-Fixpoint untilST' {RV Vars E} limit (vars : Vars) (cond : Vars -> monadS RV bool E) (body : Vars -> monadS RV Vars E) (acc : Acc (Zwf 0) limit) : monadS RV Vars E :=
+Fixpoint untilST' {RV Vars E} limit (vars : Vars) (cond : Vars -> monadS RV bool E) (body : Vars -> monadS RV Vars E) (acc : Acc (Zwf 0) limit) : monadS RV Vars E.
+exact (
if Z_ge_dec limit 0 then
body vars >>$= fun vars =>
cond vars >>$= fun cond_val =>
- if cond_val then returnS vars else untilST' (limit - 1) vars cond body (_limit_reduces acc)
- else failS "Termination limit reached".
+ if cond_val then returnS vars else untilST' _ _ _ (limit - 1) vars cond body (_limit_reduces acc)
+ else failS "Termination limit reached").
+Defined.
Definition untilST {RV Vars E} (vars : Vars) measure (cond : Vars -> monadS RV bool E) (body : Vars -> monadS RV Vars E) : monadS RV Vars E :=
let limit := measure vars in