diff options
Diffstat (limited to 'src/Compilers/Named/ContextProperties/NameUtil.v')
-rw-r--r-- | src/Compilers/Named/ContextProperties/NameUtil.v | 161 |
1 files changed, 0 insertions, 161 deletions
diff --git a/src/Compilers/Named/ContextProperties/NameUtil.v b/src/Compilers/Named/ContextProperties/NameUtil.v deleted file mode 100644 index 320d910f0..000000000 --- a/src/Compilers/Named/ContextProperties/NameUtil.v +++ /dev/null @@ -1,161 +0,0 @@ -Require Import Coq.omega.Omega. -Require Import Crypto.Util.FixCoqMistakes. -Require Import Crypto.Compilers.Syntax. -Require Import Crypto.Compilers.Wf. -Require Import Crypto.Compilers.Named.Context. -Require Import Crypto.Compilers.Named.ContextDefinitions. -Require Import Crypto.Compilers.Named.NameUtil. -Require Import Crypto.Compilers.Named.NameUtilProperties. -Require Import Crypto.Compilers.Named.ContextProperties. -Require Import Crypto.Compilers.Named.ContextProperties.Tactics. -Require Import Crypto.Util.Decidable. -Require Import Crypto.Util.ListUtil. -Require Import Crypto.Util.Prod. -Require Import Crypto.Util.Tactics.SplitInContext. -Require Import Crypto.Util.Tactics.DestructHead. -Require Import Crypto.Util.Tactics.BreakMatch. -Require Import Crypto.Util.Tactics.SpecializeBy. - -Section with_context. - Context {base_type_code Name var} (Context : @Context base_type_code Name var) - (base_type_code_dec : DecidableRel (@eq base_type_code)) - (Name_dec : DecidableRel (@eq Name)) - (ContextOk : ContextOk Context). - - Local Notation find_Name := (@find_Name base_type_code Name Name_dec). - Local Notation find_Name_and_val := (@find_Name_and_val base_type_code Name base_type_code_dec Name_dec). - - Hint Rewrite (@find_Name_and_val_default_to_None _ base_type_code_dec _ Name_dec) using congruence : ctx_db. - Hint Rewrite (@find_Name_and_val_different _ base_type_code_dec _ Name_dec) using assumption : ctx_db. - Hint Rewrite (@find_Name_and_val_wrong_type _ base_type_code_dec _ Name_dec) using congruence : ctx_db. - Hint Rewrite (@snd_split_onames_skipn base_type_code Name) : ctx_db. - - Local Ltac misc_oname_t_step := - match goal with - | [ H : oname_list_unique (List.skipn _ _) -> _ |- _ ] - => specialize (fun pf => H (@oname_list_unique_skipn _ _ _ pf)) - | [ H : ((_, _) = (_, _))%core -> _ |- _ ] - => specialize (fun a b => H (f_equal2 (@pair _ _) a b)) - | [ H : ?x = (_,_)%core -> _ |- _ ] - => rewrite (surjective_pairing x) in H; - specialize (fun a b => H (f_equal2 (@pair _ _) a b)) - end. - - Lemma split_onames_find_Name - {n T N ls ls'} - (H : split_onames _ ls = (Some N, ls')%core) - : (exists t, @find_Name n T N = Some t) - <-> List.In (Some n) (List.firstn (CountLets.count_pairs T) ls). - Proof using Type. - revert dependent ls; intro ls; revert ls ls'; induction T; intros ls ls' H; - [ | | specialize (IHT1 (fst N) ls (snd (split_onames T1 ls))); - specialize (IHT2 (snd N) (snd (split_onames T1 ls)) (snd (split_onames (T1 * T2) ls))) ]; - repeat first [ misc_oname_t_step - | t_step - | progress split_iff - | progress specialize_by (eexists; eauto) - | solve [ eauto using In_skipn, In_firstn ] - | match goal with - | [ H : List.In ?x (List.firstn ?n ?ls) |- List.In ?x (List.firstn (?n + ?m) ?ls) ] - => apply (In_firstn n); rewrite firstn_firstn by omega - | [ H : _ |- _ ] => first [ rewrite firstn_skipn_add in H - | rewrite firstn_firstn in H by omega ] - | [ H : List.In ?x' (List.firstn (?n + ?m) ?ls) |- List.In ?x' (List.firstn ?m (List.skipn ?n ?ls)) ] - => apply (In_firstn_skipn_split n) in H - end ]. - Qed. - - Lemma split_onames_find_Name_Some_unique_iff - {n T N ls ls'} - (Hls : oname_list_unique ls) - (H : split_onames _ ls = (Some N, ls')%core) - : (exists t, @find_Name n T N = Some t) - <-> List.In (Some n) ls /\ ~List.In (Some n) ls'. - Proof using Type. - rewrite (split_onames_find_Name (ls':=ls') (ls:=ls)) by assumption. - rewrite (surjective_pairing (split_onames _ _)) in H. - rewrite fst_split_onames_firstn, snd_split_onames_skipn in H. - inversion_prod; subst. - split; [ split | intros [? ?] ]; eauto using In_firstn, oname_list_unique_specialize. - match goal with - | [ H : List.In (Some _) ?ls |- _ ] - => is_var ls; - eapply In_firstn_skipn_split in H; destruct_head' or; eauto; exfalso; eauto - end. - Qed. - - Lemma split_onames_find_Name_Some_unique - {t n T N ls ls'} - (Hls : oname_list_unique ls) - (H : split_onames _ ls = (Some N, ls')%core) - (Hfind : @find_Name n T N = Some t) - : List.In (Some n) ls /\ ~List.In (Some n) ls'. - Proof using Type. - eapply split_onames_find_Name_Some_unique_iff; eauto. - Qed. - - Lemma flatten_binding_list_find_Name_and_val_unique - {var' t n T N V v ls ls'} - (Hls : oname_list_unique ls) - (H : split_onames _ ls = (Some N, ls')%core) - : @find_Name_and_val var' t n T N V None = Some v - <-> List.In (existT (fun t => (Name * var' t)%type) t (n, v)) (Wf.flatten_binding_list N V). - Proof using Type. - revert dependent ls; intro ls; revert ls ls'; induction T; intros ls ls' Hls H; - [ | | specialize (IHT1 (fst N) (fst V) ls (snd (split_onames T1 ls))); - specialize (IHT2 (snd N) (snd V) (snd (split_onames T1 ls)) (snd (split_onames (T1 * T2) ls))) ]; - repeat first [ find_Name_and_val_default_to_None_step - | progress simpl in * - | rewrite List.in_app_iff - | misc_oname_t_step - | t_step - | progress split_iff - | lazymatch goal with - | [ H : find_Name ?n ?x = Some ?t, H' : find_Name_and_val ?t' ?n ?X ?V None = Some ?v |- _ ] - => apply find_Name_and_val_find_Name_Some in H' - | [ H : find_Name ?n ?x = Some ?t, H' : find_Name ?n ?x' = Some ?t' |- _ ] - => let apply_in_tac H := - (eapply split_onames_find_Name_Some_unique in H; - [ | | apply path_prod_uncurried; split; [ eassumption | simpl; reflexivity ] ]; - [ | solve [ eauto using oname_list_unique_firstn, oname_list_unique_skipn ] ]) in - first [ constr_eq x x'; fail 1 - | apply_in_tac H; apply_in_tac H' ] - end ]. - Qed. - - Lemma fst_split_mnames__flatten_binding_list__find_Name - (MName : Type) (force : MName -> option Name) - {var' t n T N V v} {ls : list MName} - (Hs : fst (split_mnames force T ls) = Some N) - (HN : List.In (existT _ t (n, v)%core) (Wf.flatten_binding_list (var2:=var') N V)) - : find_Name n N = Some t. - Proof. - revert dependent ls; induction T; - [ | | specialize (IHT1 (fst N) (fst V)); - specialize (IHT2 (snd N) (snd V)) ]; - repeat first [ misc_oname_t_step - | t_step - | match goal with - | [ H : _ |- _ ] => first [ rewrite snd_split_mnames_skipn in H - | rewrite List.in_app_iff in H ] - | [ H : context[fst (split_mnames _ _ ?ls)] |- _ ] - => is_var ls; rewrite (@fst_split_mnames_firstn _ _ _ _ _ ls) in H - end ]. - Abort. - - Lemma fst_split_mnames__find_Name__flatten_binding_list - (MName : Type) (force : MName -> option Name) - {var' t n T N V v default} {ls : list MName} - (Hs : fst (split_mnames force T ls) = Some N) - (Hfind : find_Name n N = Some t) - (HN : List.In (existT _ t (n, v)%core) (Wf.flatten_binding_list N V)) - : @find_Name_and_val var' t n T N V default = Some v. - Proof. - revert default; revert dependent ls; induction T; - [ | | specialize (IHT1 (fst N) (fst V)); - specialize (IHT2 (snd N) (snd V)) ]; - repeat first [ find_Name_and_val_default_to_None_step - | rewrite List.in_app_iff in * - | t_step ]. - Abort. -End with_context. |