diff options
Diffstat (limited to 'src/Compilers/InterpRewriting.v')
-rw-r--r-- | src/Compilers/InterpRewriting.v | 197 |
1 files changed, 0 insertions, 197 deletions
diff --git a/src/Compilers/InterpRewriting.v b/src/Compilers/InterpRewriting.v deleted file mode 100644 index 048452a35..000000000 --- a/src/Compilers/InterpRewriting.v +++ /dev/null @@ -1,197 +0,0 @@ -Require Import Crypto.Compilers.Syntax. -Require Import Crypto.Compilers.Wf. -Require Import Crypto.Util.Tactics.CacheTerm. -Require Import Crypto.Util.Tactics.Head. -Require Import Crypto.Util.Tactics.SplitInContext. -Require Import Crypto.Util.NatUtil. -Require Import Crypto.Util.Tactics.Not. -Require Import Crypto.Util.Tactics.BreakMatch. - -Section lang. - Context {base_type} - {op : flat_type base_type -> flat_type base_type -> Type} - {interp_base_type : base_type -> Type} - {interp_op : forall s d, op s d - -> interp_flat_type interp_base_type s - -> interp_flat_type interp_base_type d}. - Local Notation Expr := (@Expr base_type op). - Local Notation Interp := (@Interp base_type interp_base_type op interp_op). - - Definition packaged_expr_functionP A := - (fun F : Expr A -> Expr A - => forall e', - Wf e' - -> Wf (F e') - /\ forall v, Interp (F e') v = Interp e' v). - Local Notation packaged_expr_function A := - (sig (packaged_expr_functionP A)). - - Definition compose {A} (f g : packaged_expr_function A) - : packaged_expr_function A. - Proof. - exists (fun x => proj1_sig f (proj1_sig g x)). - clear. - abstract ( - destruct f as [f Hf], g as [g Hg]; cbn [proj1_sig]; - intros e' Wfe; split; [ apply Hf, Hg, Wfe | ]; - intro x; etransitivity; [ apply Hf, Hg, Wfe | apply Hg, Wfe ] - ). - Defined. - - Definition id_package {A} : packaged_expr_function A - := exist (packaged_expr_functionP A) - id - (fun e' Wfe' => conj Wfe' (fun v => eq_refl)). - - Inductive reified_transformation := - | base (idx : nat) - | transform (idx : nat) (rest : reified_transformation) - | cond (test : bool) (iftrue iffalse : reified_transformation). - Fixpoint denote {A} - (ls : list (packaged_expr_function A)) - (ls' : list { x : Expr A | Wf x }) - default - (f : reified_transformation) - := match f with - | base idx => proj1_sig (List.nth_default default ls' idx) - | transform idx rest - => proj1_sig (List.nth_default id_package ls idx) - (denote ls ls' default rest) - | cond test iftrue iffalse - => if test - then denote ls ls' default iftrue - else denote ls ls' default iffalse - end. - Fixpoint reduce (f : reified_transformation) : reified_transformation - := match f with - | base idx => base idx - | transform idx rest => reduce rest - | cond test iftrue iffalse - => match reduce iftrue, reduce iffalse with - | base idx0 as t, base idx1 as f - => if nat_beq idx0 idx1 - then base idx0 - else cond test t f - | t, f => cond test t f - end - end. - Lemma Wf_denote A ctx es d f : Wf (@denote A ctx es d f). - Proof. - induction f; simpl; unfold proj1_sig; break_innermost_match; split_and; auto. - match goal with H : _ |- _ => apply H; assumption end. - Qed. - Lemma Wf_denote_iff_True A ctx es d f : Wf (@denote A ctx es d f) <-> True. - Proof. split; auto using Wf_denote. Qed. - Lemma Interp_denote_reduce A ctx es d f - : forall v, Interp (@denote A ctx es d f) v = Interp (@denote A nil es d (reduce f)) v. - Proof. - induction f; simpl; unfold proj1_sig; break_innermost_match; - nat_beq_to_eq; subst; - try reflexivity; auto. - intro; rewrite <- IHf. - match goal with H : _ |- _ => apply H, Wf_denote end. - Qed. -End lang. - -Local Ltac find ctx f := - lazymatch ctx with - | (exist _ f _ :: _)%list => constr:(0) - | (_ :: ?ctx)%list - => let v := find ctx f in - constr:(S v) - end. - -Local Ltac reify_transformation interp_base_type interp_op ctx es T cont := - let reify_transformation := reify_transformation interp_base_type interp_op in - let ExprA := type of T in - let packageP := lazymatch type of T with - | @Expr ?base_type_code ?op ?A - => constr:(@packaged_expr_functionP base_type_code op interp_base_type interp_op A) - end in - let es := lazymatch es with - | tt => constr:(@nil { x : ExprA | Wf x }) - | _ => es - end in - let ctx := lazymatch ctx with - | tt => constr:(@nil (sig packageP)) - | _ => ctx - end in - lazymatch T with - | ?f ?e - => let ctx := lazymatch ctx with - | context[exist _ f _] => ctx - | _ => let hf := head f in - let fId := fresh hf in - let rfPf := - cache_proof_with_type_by - (packageP f) - ltac:(refine (fun e Hwf - => (fun Hwf' - => conj Hwf' (fun v => _)) _); - [ autorewrite with reflective_interp; reflexivity - | auto with wf ]) - fId in - constr:(cons (exist packageP f rfPf) - ctx) - end in - reify_transformation - ctx es e - ltac:(fun ctx es re - => let idx := find ctx f in - cont ctx es (transform idx re)) - | match ?b with true => ?t | false => ?f end - => reify_transformation - ctx es t - ltac:(fun ctx es rt - => reify_transformation - ctx es f - ltac:(fun ctx es rf - => reify_transformation - ctx es t - ltac:(fun ctx es rt - => cont ctx es (cond b rt rf)))) - | _ => let es := lazymatch es with - | context[exist _ T _] => es - | _ - => let Hwf := lazymatch goal with - | [ Hwf : Wf T |- _ ] => Hwf - - | _ - => let Hwf := fresh "Hwf" in - cache_proof_with_type_by - (Wf T) - ltac:(idtac; solve_wf_side_condition) - Hwf - end in - constr:(cons (exist Wf T Hwf) es) - end in - let idx := find es T in - cont ctx es (base idx) - end. -Ltac finish_rewrite_reflective_interp_cached := - rewrite ?Wf_denote_iff_True; - cbv [reduce nat_beq]; - try (rewrite Interp_denote_reduce; - cbv [reduce nat_beq]; - cbv [denote List.nth_default List.nth_error]; - cbn [proj1_sig]). -Ltac rewrite_reflective_interp_cached_then ctx es cont := - let e := match goal with - | [ |- context[@Interp _ _ _ _ _ ?e] ] - => let test := match goal with _ => not is_var e end in - e - end in - lazymatch goal with - | [ |- context[@Interp ?base_type ?interp_base_type ?op ?interp_op _ e] ] - => reify_transformation - interp_base_type interp_op ctx es e - ltac:(fun ctx es r - => lazymatch es with - | cons ?default _ - => change e with (denote ctx es default r) - end; - finish_rewrite_reflective_interp_cached; - cont ctx es) - end. -Ltac rewrite_reflective_interp_cached := - rewrite_reflective_interp_cached_then tt tt ltac:(fun _ _ => idtac). |