summaryrefslogtreecommitdiff
path: root/backends/hol4/divDefProto2Theory.sig
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--backends/hol4/divDefProto2Theory.sig400
1 files changed, 255 insertions, 145 deletions
diff --git a/backends/hol4/divDefProto2Theory.sig b/backends/hol4/divDefProto2Theory.sig
index 349aabf7..7ce4b194 100644
--- a/backends/hol4/divDefProto2Theory.sig
+++ b/backends/hol4/divDefProto2Theory.sig
@@ -6,25 +6,41 @@ sig
val fix_def : thm
val fix_fuel_P_def : thm
val fix_fuel_def : thm
- val ftree_TY_DEF : thm
- val ftree_case_def : thm
- val ftree_size_def : thm
val is_valid_fp_body_def : thm
+ val list_t_TY_DEF : thm
+ val list_t_case_def : thm
+ val list_t_size_def : thm
+ val nth_body1_def : thm
+ val nth_body_valid_def : thm
+ val simp_types_def : thm
(* Theorems *)
- val datatype_ftree : thm
- val eval_ftree_compute : thm
- val eval_ftree_def : thm
- val eval_ftree_ind : thm
+ val datatype_list_t : thm
+ val fix_fixed_diverges : thm
+ val fix_fixed_eq : thm
+ val fix_fixed_terminates : thm
+ val fix_fuel_P_least : thm
val fix_fuel_compute : thm
- val ftree_11 : thm
- val ftree_Axiom : thm
- val ftree_case_cong : thm
- val ftree_case_eq : thm
- val ftree_distinct : thm
- val ftree_induction : thm
- val ftree_nchotomy : thm
- val ftree_size_eq : thm
+ val fix_fuel_eq_fix : thm
+ val fix_fuel_mono : thm
+ val fix_fuel_mono_aux : thm
+ val fix_fuel_mono_least : thm
+ val fix_fuel_not_diverge_eq_fix : thm
+ val fix_fuel_not_diverge_eq_fix_aux : thm
+ val fix_not_diverge_implies_fix_fuel : thm
+ val fix_not_diverge_implies_fix_fuel_aux : thm
+ val is_valid_fp_body_compute : thm
+ val is_valid_suffice : thm
+ val list_t_11 : thm
+ val list_t_Axiom : thm
+ val list_t_case_cong : thm
+ val list_t_case_eq : thm
+ val list_t_distinct : thm
+ val list_t_induction : thm
+ val list_t_nchotomy : thm
+ val nth_body_valid_eq : thm
+ val nth_body_valid_is_valid : thm
+ val nth_def : thm
val divDefProto2_grammars : type_grammar.grammar * term_grammar.grammar
(*
@@ -47,124 +63,130 @@ sig
⊢ (∀f x. fix_fuel 0 f x = Diverge) ∧
∀n f x. fix_fuel (SUC n) f x = f (fix_fuel n f) x
- [ftree_TY_DEF] Definition
+ [is_valid_fp_body_def] Definition
+
+ ⊢ (∀f. is_valid_fp_body 0 f ⇔ F) ∧
+ ∀n f.
+ is_valid_fp_body (SUC n) f ⇔
+ ∀x. (∀g h. f g x = f h x) ∨
+ ∃h y.
+ is_valid_fp_body n h ∧ ∀g. f g x = do z <- g y; h g z od
+
+ [list_t_TY_DEF] Definition
⊢ ∃rep.
TYPE_DEFINITION
(λa0'.
- ∀ $var$('ftree') $var$('@temp @ind_typedivDefProto20prod')
- $var$('@temp @ind_typedivDefProto21list').
+ ∀ $var$('list_t').
(∀a0'.
- (∃a. a0' =
- (λa.
- ind_type$CONSTR 0 (ARB,ARB)
- (ind_type$FCONS a (λn. ind_type$BOTTOM)))
- a ∧
- $var$('@temp @ind_typedivDefProto20prod') a) ∨
- (∃a. a0' =
- (λa.
- ind_type$CONSTR (SUC 0) (a,ARB)
- (λn. ind_type$BOTTOM)) a) ⇒
- $var$('ftree') a0') ∧
- (∀a1'.
(∃a0 a1.
- a1' =
+ a0' =
(λa0 a1.
- ind_type$CONSTR (SUC (SUC 0)) (ARB,a0)
+ ind_type$CONSTR 0 a0
(ind_type$FCONS a1 (λn. ind_type$BOTTOM)))
- a0 a1 ∧
- $var$('@temp @ind_typedivDefProto21list') a1) ⇒
- $var$('@temp @ind_typedivDefProto20prod') a1') ∧
- (∀a2.
- a2 =
- ind_type$CONSTR (SUC (SUC (SUC 0))) (ARB,ARB)
- (λn. ind_type$BOTTOM) ∨
- (∃a0 a1.
- a2 =
- (λa0 a1.
- ind_type$CONSTR (SUC (SUC (SUC (SUC 0))))
- (ARB,ARB)
- (ind_type$FCONS a0
- (ind_type$FCONS a1 (λn. ind_type$BOTTOM))))
- a0 a1 ∧ $var$('ftree') a0 ∧
- $var$('@temp @ind_typedivDefProto21list') a1) ⇒
- $var$('@temp @ind_typedivDefProto21list') a2) ⇒
- $var$('ftree') a0') rep
+ a0 a1 ∧ $var$('list_t') a1) ∨
+ a0' =
+ ind_type$CONSTR (SUC 0) ARB (λn. ind_type$BOTTOM) ⇒
+ $var$('list_t') a0') ⇒
+ $var$('list_t') a0') rep
- [ftree_case_def] Definition
+ [list_t_case_def] Definition
- ⊢ (∀a f f1. ftree_CASE (Rec a) f f1 = f a) ∧
- ∀a f f1. ftree_CASE (NRec a) f f1 = f1 a
+ ⊢ (∀a0 a1 f v. list_t_CASE (ListCons a0 a1) f v = f a0 a1) ∧
+ ∀f v. list_t_CASE ListNil f v = v
- [ftree_size_def] Definition
+ [list_t_size_def] Definition
- ⊢ (∀f a. ftree_size f (Rec a) = 1 + ftree1_size f a) ∧
- (∀f a. ftree_size f (NRec a) = 1) ∧
- (∀f a0 a1. ftree1_size f (a0,a1) = 1 + ftree2_size f a1) ∧
- (∀f. ftree2_size f [] = 0) ∧
- ∀f a0 a1.
- ftree2_size f (a0::a1) = 1 + (ftree_size f a0 + ftree2_size f a1)
+ ⊢ (∀f a0 a1.
+ list_t_size f (ListCons a0 a1) = 1 + (f a0 + list_t_size f a1)) ∧
+ ∀f. list_t_size f ListNil = 0
- [is_valid_fp_body_def] Definition
+ [nth_body1_def] Definition
- ⊢ ∀f. is_valid_fp_body f ⇔ ∀x. ∃n ft. ∀g. f g x = eval_ftree n g ft
-
- [datatype_ftree] Theorem
-
- ⊢ DATATYPE (ftree Rec NRec)
-
- [eval_ftree_compute] Theorem
-
- ⊢ (∀x g fs. eval_ftree 0 g (fs,x) = Diverge) ∧
- (∀x n g fs.
- eval_ftree (NUMERAL (BIT1 n)) g (fs,x) =
- case x of
- INL r => r
- | INR (y,i) =>
- case g y of
- Return z =>
- (let
- f = EL i fs
- in
- eval_ftree (NUMERAL (BIT1 n) − 1) g (fs,f z))
- | Fail e => Fail e
- | Diverge => Diverge) ∧
- ∀x n g fs.
- eval_ftree (NUMERAL (BIT2 n)) g (fs,x) =
+ ⊢ ∀f x.
+ nth_body1 f x =
case x of
- INL r => r
- | INR (y,i) =>
- case g y of
- Return z =>
- (let
- f = EL i fs
- in
- eval_ftree (NUMERAL (BIT1 n)) g (fs,f z))
- | Fail e => Fail e
- | Diverge => Diverge
-
- [eval_ftree_def] Theorem
-
- ⊢ (∀x g fs. eval_ftree 0 g (fs,x) = Diverge) ∧
- ∀x n g fs.
- eval_ftree (SUC n) g (fs,x) =
+ INL x =>
+ (let
+ (ls,i) = x
+ in
+ case ls of
+ ListCons x tl =>
+ if u32_to_int i = 0 then Return (INR x)
+ else
+ do
+ i0 <- u32_sub i (int_to_u32 1);
+ r <-
+ case f (INL (tl,i0)) of
+ Return (INL v) => Fail Failure
+ | Return (INR i1) => Return i1
+ | Fail e => Fail e
+ | Diverge => Diverge;
+ Return (INR r)
+ od
+ | ListNil => Fail Failure)
+ | INR v3 => Fail Failure
+
+ [nth_body_valid_def] Definition
+
+ ⊢ ∀f x.
+ nth_body_valid f x =
case x of
- INL r => r
- | INR (y,i) =>
- case g y of
- Return z => (let f = EL i fs in eval_ftree n g (fs,f z))
- | Fail e => Fail e
- | Diverge => Diverge
-
- [eval_ftree_ind] Theorem
-
- ⊢ ∀P. (∀g fs x. P 0 g (fs,x)) ∧
- (∀n g fs x.
- (∀v1 y i z f.
- x = INR v1 ∧ v1 = (y,i) ∧ g y = Return z ∧ f = EL i fs ⇒
- P n g (fs,f z)) ⇒
- P (SUC n) g (fs,x)) ⇒
- ∀v v1 v2 v3. P v v1 (v2,v3)
+ INL x =>
+ (let
+ (ls,i) = x
+ in
+ case ls of
+ ListCons x tl =>
+ if u32_to_int i = 0 then Return (INR x)
+ else
+ do
+ i0 <- u32_sub i (int_to_u32 1);
+ r <- f (INL (tl,i0));
+ case r of
+ INL v => Fail Failure
+ | INR i1 => Return (INR i1)
+ od
+ | ListNil => Fail Failure)
+ | INR v2 => Fail Failure
+
+ [simp_types_def] Definition
+
+ ⊢ ∀f. simp_types f =
+ (λx'.
+ case x' of
+ INL x =>
+ (case f x of
+ Return y => Return (INR y)
+ | Fail e => Fail e
+ | Diverge => Diverge)
+ | INR v1 => Fail Failure)
+
+ [datatype_list_t] Theorem
+
+ ⊢ DATATYPE (list_t ListCons ListNil)
+
+ [fix_fixed_diverges] Theorem
+
+ ⊢ ∀N f.
+ is_valid_fp_body N f ⇒
+ ∀x. ¬(∃n. fix_fuel_P f x n) ⇒ fix f x = f (fix f) x
+
+ [fix_fixed_eq] Theorem
+
+ ⊢ ∀N f. is_valid_fp_body N f ⇒ ∀x. fix f x = f (fix f) x
+
+ [fix_fixed_terminates] Theorem
+
+ ⊢ ∀N f.
+ is_valid_fp_body N f ⇒
+ ∀x n. fix_fuel_P f x n ⇒ fix f x = f (fix f) x
+
+ [fix_fuel_P_least] Theorem
+
+ ⊢ ∀f n x.
+ fix_fuel n f x ≠ Diverge ⇒
+ fix_fuel_P f x ($LEAST (fix_fuel_P f x))
[fix_fuel_compute] Theorem
@@ -176,49 +198,137 @@ sig
fix_fuel (NUMERAL (BIT2 n)) f x =
f (fix_fuel (NUMERAL (BIT1 n)) f) x
- [ftree_11] Theorem
+ [fix_fuel_eq_fix] Theorem
+
+ ⊢ ∀N f.
+ is_valid_fp_body N f ⇒
+ ∀n x. fix_fuel_P f x n ⇒ fix_fuel n f x = fix f x
+
+ [fix_fuel_mono] Theorem
+
+ ⊢ ∀N f.
+ is_valid_fp_body N f ⇒
+ ∀n x.
+ fix_fuel_P f x n ⇒ ∀m. n ≤ m ⇒ fix_fuel n f x = fix_fuel m f x
+
+ [fix_fuel_mono_aux] Theorem
+
+ ⊢ ∀n N M g f.
+ is_valid_fp_body M f ⇒
+ is_valid_fp_body N g ⇒
+ ∀x. ¬is_diverge (g (fix_fuel n f) x) ⇒
+ ∀m. n ≤ m ⇒ g (fix_fuel n f) x = g (fix_fuel m f) x
+
+ [fix_fuel_mono_least] Theorem
+
+ ⊢ ∀N f.
+ is_valid_fp_body N f ⇒
+ ∀n x.
+ fix_fuel_P f x n ⇒
+ fix_fuel n f x = fix_fuel ($LEAST (fix_fuel_P f x)) f x
+
+ [fix_fuel_not_diverge_eq_fix] Theorem
+
+ ⊢ ∀N f.
+ is_valid_fp_body N f ⇒
+ ∀n x.
+ f (fix_fuel n f) x ≠ Diverge ⇒ f (fix f) x = f (fix_fuel n f) x
+
+ [fix_fuel_not_diverge_eq_fix_aux] Theorem
+
+ ⊢ ∀N M g f.
+ is_valid_fp_body M f ⇒
+ is_valid_fp_body N g ⇒
+ ∀n x.
+ g (fix_fuel n f) x ≠ Diverge ⇒ g (fix f) x = g (fix_fuel n f) x
+
+ [fix_not_diverge_implies_fix_fuel] Theorem
+
+ ⊢ ∀N f.
+ is_valid_fp_body N f ⇒
+ ∀x. f (fix f) x ≠ Diverge ⇒ ∃n. f (fix f) x = f (fix_fuel n f) x
+
+ [fix_not_diverge_implies_fix_fuel_aux] Theorem
+
+ ⊢ ∀N M g f.
+ is_valid_fp_body M f ⇒
+ is_valid_fp_body N g ⇒
+ ∀x. g (fix f) x ≠ Diverge ⇒
+ ∃n. g (fix f) x = g (fix_fuel n f) x ∧
+ ∀m. n ≤ m ⇒ g (fix_fuel m f) x = g (fix_fuel n f) x
+
+ [is_valid_fp_body_compute] Theorem
+
+ ⊢ (∀f. is_valid_fp_body 0 f ⇔ F) ∧
+ (∀n f.
+ is_valid_fp_body (NUMERAL (BIT1 n)) f ⇔
+ ∀x. (∀g h. f g x = f h x) ∨
+ ∃h y.
+ is_valid_fp_body (NUMERAL (BIT1 n) − 1) h ∧
+ ∀g. f g x = do z <- g y; h g z od) ∧
+ ∀n f.
+ is_valid_fp_body (NUMERAL (BIT2 n)) f ⇔
+ ∀x. (∀g h. f g x = f h x) ∨
+ ∃h y.
+ is_valid_fp_body (NUMERAL (BIT1 n)) h ∧
+ ∀g. f g x = do z <- g y; h g z od
+
+ [is_valid_suffice] Theorem
+
+ ⊢ ∃y. ∀g. g x = g y
+
+ [list_t_11] Theorem
+
+ ⊢ ∀a0 a1 a0' a1'.
+ ListCons a0 a1 = ListCons a0' a1' ⇔ a0 = a0' ∧ a1 = a1'
+
+ [list_t_Axiom] Theorem
+
+ ⊢ ∀f0 f1. ∃fn.
+ (∀a0 a1. fn (ListCons a0 a1) = f0 a0 a1 (fn a1)) ∧
+ fn ListNil = f1
+
+ [list_t_case_cong] Theorem
- ⊢ (∀a a'. Rec a = Rec a' ⇔ a = a') ∧ ∀a a'. NRec a = NRec a' ⇔ a = a'
+ ⊢ ∀M M' f v.
+ M = M' ∧ (∀a0 a1. M' = ListCons a0 a1 ⇒ f a0 a1 = f' a0 a1) ∧
+ (M' = ListNil ⇒ v = v') ⇒
+ list_t_CASE M f v = list_t_CASE M' f' v'
- [ftree_Axiom] Theorem
+ [list_t_case_eq] Theorem
- ⊢ ∀f0 f1 f2 f3 f4. ∃fn0 fn1 fn2.
- (∀a. fn0 (Rec a) = f0 a (fn1 a)) ∧ (∀a. fn0 (NRec a) = f1 a) ∧
- (∀a0 a1. fn1 (a0,a1) = f2 a0 a1 (fn2 a1)) ∧ fn2 [] = f3 ∧
- ∀a0 a1. fn2 (a0::a1) = f4 a0 a1 (fn0 a0) (fn2 a1)
+ ⊢ list_t_CASE x f v = v' ⇔
+ (∃t l. x = ListCons t l ∧ f t l = v') ∨ x = ListNil ∧ v = v'
- [ftree_case_cong] Theorem
+ [list_t_distinct] Theorem
- ⊢ ∀M M' f f1.
- M = M' ∧ (∀a. M' = Rec a ⇒ f a = f' a) ∧
- (∀a. M' = NRec a ⇒ f1 a = f1' a) ⇒
- ftree_CASE M f f1 = ftree_CASE M' f' f1'
+ ⊢ ∀a1 a0. ListCons a0 a1 ≠ ListNil
- [ftree_case_eq] Theorem
+ [list_t_induction] Theorem
- ⊢ ftree_CASE x f f1 = v ⇔
- (∃p. x = Rec p ∧ f p = v) ∨ ∃f'. x = NRec f' ∧ f1 f' = v
+ ⊢ ∀P. (∀l. P l ⇒ ∀t. P (ListCons t l)) ∧ P ListNil ⇒ ∀l. P l
- [ftree_distinct] Theorem
+ [list_t_nchotomy] Theorem
- ⊢ ∀a' a. Rec a ≠ NRec a'
+ ⊢ ∀ll. (∃t l. ll = ListCons t l) ∨ ll = ListNil
- [ftree_induction] Theorem
+ [nth_body_valid_eq] Theorem
- ⊢ ∀P0 P1 P2.
- (∀p. P1 p ⇒ P0 (Rec p)) ∧ (∀f. P0 (NRec f)) ∧
- (∀l. P2 l ⇒ ∀f. P1 (f,l)) ∧ P2 [] ∧
- (∀f l. P0 f ∧ P2 l ⇒ P2 (f::l)) ⇒
- (∀f. P0 f) ∧ (∀p. P1 p) ∧ ∀l. P2 l
+ ⊢ nth_body_valid = nth_body1
- [ftree_nchotomy] Theorem
+ [nth_body_valid_is_valid] Theorem
- ⊢ ∀ff. (∃p. ff = Rec p) ∨ ∃f. ff = NRec f
+ ⊢ is_valid_fp_body (SUC (SUC 0)) nth_body_valid
- [ftree_size_eq] Theorem
+ [nth_def] Theorem
- ⊢ ftree1_size f = pair_size (λv. 0) (list_size (ftree_size f)) ∧
- ftree2_size f = list_size (ftree_size f)
+ ⊢ ∀ls i.
+ nth ls i =
+ case ls of
+ ListCons x tl =>
+ if u32_to_int i = 0 then Return x
+ else do i0 <- u32_sub i (int_to_u32 1); nth tl i0 od
+ | ListNil => Fail Failure
*)