aboutsummaryrefslogtreecommitdiff
path: root/src/Compilers/InSet/TypeifyInterp.v
diff options
context:
space:
mode:
Diffstat (limited to 'src/Compilers/InSet/TypeifyInterp.v')
-rw-r--r--src/Compilers/InSet/TypeifyInterp.v114
1 files changed, 114 insertions, 0 deletions
diff --git a/src/Compilers/InSet/TypeifyInterp.v b/src/Compilers/InSet/TypeifyInterp.v
new file mode 100644
index 000000000..77790eec8
--- /dev/null
+++ b/src/Compilers/InSet/TypeifyInterp.v
@@ -0,0 +1,114 @@
+Require Import Crypto.Compilers.Syntax.
+Require Import Crypto.Compilers.InSet.Syntax.
+Require Import Crypto.Compilers.InSet.Typeify.
+
+
+Local Ltac t :=
+ repeat first [ reflexivity
+ | progress simpl in *
+ | apply (f_equal2 (@pair _ _))
+ | solve [ auto ]
+ | progress cbv [LetIn.Let_In]
+ | progress autorewrite with core
+ | progress intros
+ | match goal with
+ | [ v : _ * _ |- _ ] => destruct v
+ | [ H : _ |- _ ] => rewrite H
+ end ].
+
+Section language.
+ Context {base_type_code : Set}
+ {op : flat_type base_type_code -> flat_type base_type_code -> Set}
+ {interp_base_type : base_type_code -> Set}.
+
+ Lemma typeify_untypeify_interp_flat_type {t} v
+ : @typeify_interp_flat_type base_type_code interp_base_type t (untypeify_interp_flat_type v) = v.
+ Proof using Type. induction t; t. Qed.
+ Lemma untypeify_typeify_interp_flat_type {t} v
+ : @untypeify_interp_flat_type base_type_code interp_base_type t (typeify_interp_flat_type v) = v.
+ Proof using Type. induction t; t. Qed.
+ Hint Rewrite @typeify_untypeify_interp_flat_type @untypeify_typeify_interp_flat_type.
+
+ Section gen.
+ Context {interp_op : forall s d, op s d -> Compilers.Syntax.interp_flat_type interp_base_type s -> Compilers.Syntax.interp_flat_type interp_base_type d}
+ {interp_op' : forall s d, op s d -> InSet.Syntax.interp_flat_type interp_base_type s -> InSet.Syntax.interp_flat_type interp_base_type d}
+ (untypeify_interp_op
+ : forall s d opc args,
+ untypeify_interp_flat_type (interp_op s d opc args)
+ = interp_op' s d opc (untypeify_interp_flat_type args))
+ (typeify_interp_op
+ : forall s d opc args,
+ typeify_interp_flat_type (interp_op' s d opc args)
+ = interp_op s d opc (typeify_interp_flat_type args)).
+
+ Local Notation interpf := (Compilers.Syntax.interpf interp_op).
+ Local Notation interpf' := (InSet.Syntax.interpf interp_op').
+ Local Notation typeify := (typeify (var:=interp_base_type)).
+
+ Lemma interpf_typeify {t} e
+ : interpf (typeify e) = typeify_interp_flat_type (t:=t) (interpf' e).
+ Proof using typeify_interp_op. induction e; t. Qed.
+ Lemma interpf_untypeify {t} e
+ : interpf' (untypeify e) = untypeify_interp_flat_type (t:=t) (interpf e).
+ Proof using untypeify_interp_op. induction e; t. Qed.
+
+ Lemma interpf_typeify_untypeify {t} e
+ : interpf (typeify (untypeify (t:=t) e)) = interpf e.
+ Proof using Type. induction e; t. Qed.
+ Lemma interpf_untypeify_typeify {t} e
+ : interpf' (untypeify (t:=t) (typeify e)) = interpf' e.
+ Proof using Type. induction e; t. Qed.
+ End gen.
+End language.
+
+Module Compilers.
+ Import Compilers.Syntax.
+ Section language.
+ Context {base_type_code : Set}
+ {op : flat_type base_type_code -> flat_type base_type_code -> Set}
+ {interp_base_type : base_type_code -> Set}
+ {interp_op : forall s d, op s d -> interp_flat_type interp_base_type s -> interp_flat_type interp_base_type d}.
+
+ Hint Rewrite @typeify_untypeify_interp_flat_type @untypeify_typeify_interp_flat_type.
+
+ Local Notation interp_op' :=
+ (fun s d opc args => untypeify_interp_flat_type (interp_op s d opc (typeify_interp_flat_type args))).
+
+ Local Notation interpf := (Compilers.Syntax.interpf interp_op).
+ Local Notation interpf' := (InSet.Syntax.interpf interp_op').
+ Local Notation typeify := (typeify (var:=interp_base_type)).
+
+ Lemma interpf_typeify {t} e
+ : interpf (typeify e) = typeify_interp_flat_type (t:=t) (interpf' e).
+ Proof using Type. apply interpf_typeify; t. Qed.
+ Lemma interpf_untypeify {t} e
+ : interpf' (untypeify e) = untypeify_interp_flat_type (t:=t) (interpf e).
+ Proof using Type. apply interpf_untypeify; t. Qed.
+ End language.
+End Compilers.
+
+Module InSet.
+ Import InSet.Syntax.
+ Section language.
+ Context {base_type_code : Set}
+ {op : flat_type base_type_code -> flat_type base_type_code -> Set}
+ {interp_base_type : base_type_code -> Set}
+ {interp_op' : forall s d, op s d -> interp_flat_type interp_base_type s -> interp_flat_type interp_base_type d}.
+
+ Hint Rewrite @typeify_untypeify_interp_flat_type @untypeify_typeify_interp_flat_type.
+
+ Local Notation interp_op :=
+ (fun s d opc args => typeify_interp_flat_type (interp_op' s d opc (untypeify_interp_flat_type args))).
+
+ Local Notation interpf := (Compilers.Syntax.interpf interp_op).
+ Local Notation interpf' := (InSet.Syntax.interpf interp_op').
+ Local Notation typeify := (typeify (var:=interp_base_type)).
+
+ Lemma interpf_typeify {t} e
+ : interpf (typeify e) = typeify_interp_flat_type (t:=t) (interpf' e).
+ Proof using Type. apply interpf_typeify; t. Qed.
+ Lemma interpf_untypeify {t} e
+ : interpf' (untypeify e) = untypeify_interp_flat_type (t:=t) (interpf e).
+ Proof using Type. apply interpf_untypeify; t. Qed.
+ End language.
+End InSet.