aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorGravatar Jason Gross <jgross@mit.edu>2017-04-02 12:56:36 -0400
committerGravatar Jason Gross <jgross@mit.edu>2017-04-02 12:56:36 -0400
commitfe0c2f54075c9f5c6805ee165dbf9df8b8058693 (patch)
treeede1b3280dfe82bb0193f7457b8e0307d19a3c2e /src
parentc4ce787fddb5d8eefd96cd4706aa1ee7a8ea8843 (diff)
Add InterpEta
It's a version of [Interp] that works even when there are destructuring lets.
Diffstat (limited to 'src')
-rw-r--r--src/Reflection/Eta.v10
-rw-r--r--src/Reflection/EtaInterp.v9
2 files changed, 18 insertions, 1 deletions
diff --git a/src/Reflection/Eta.v b/src/Reflection/Eta.v
index eda74f4a5..d40267858 100644
--- a/src/Reflection/Eta.v
+++ b/src/Reflection/Eta.v
@@ -63,3 +63,13 @@ Section language.
Definition ExprEta' {t} (e : Expr t) : Expr (Arrow (domain t) (codomain t))
:= fun var => expr_eta' (e var).
End language.
+(* put these outside the section so the argument order lines up with
+ [interp] and [Interp] *)
+Definition interp_eta {base_type_code interp_base_type op} interp_op
+ {t} (e : @expr base_type_code op interp_base_type t)
+ : interp_type interp_base_type t
+ := interp_flat_type_eta (interp interp_op e).
+Definition InterpEta {base_type_code interp_base_type op} interp_op
+ {t} (e : @Expr base_type_code op t)
+ : interp_type interp_base_type t
+ := interp_eta interp_op (e _).
diff --git a/src/Reflection/EtaInterp.v b/src/Reflection/EtaInterp.v
index 4dd5b00bb..4ab42a63f 100644
--- a/src/Reflection/EtaInterp.v
+++ b/src/Reflection/EtaInterp.v
@@ -93,6 +93,13 @@ Section language.
Lemma InterpExprEta'_arrow {s d e}
: forall x, Interp (t:=Arrow s d) (@interp_op) (ExprEta' (t:=Arrow s d) e) x = Interp (@interp_op) e x.
Proof. exact (@InterpExprEta' (Arrow s d) e). Qed.
+
+ Lemma eq_interp_eta {t e}
+ : forall x, interp_eta interp_op (t:=t) e x = interp interp_op e x.
+ Proof. apply eq_interp_flat_type_eta. Qed.
+ Lemma eq_InterpEta {t e}
+ : forall x, InterpEta interp_op (t:=t) e x = Interp interp_op e x.
+ Proof. apply eq_interp_eta. Qed.
End language.
-Hint Rewrite @eq_interp_flat_type_eta @eq_interp_flat_type_eta' @interpf_exprf_eta @interpf_exprf_eta' @interp_expr_eta @interp_expr_eta' @InterpExprEta @InterpExprEta' @InterpExprEta_arrow @InterpExprEta'_arrow : reflective_interp.
+Hint Rewrite @eq_interp_flat_type_eta @eq_interp_flat_type_eta' @interpf_exprf_eta @interpf_exprf_eta' @interp_expr_eta @interp_expr_eta' @InterpExprEta @InterpExprEta' @InterpExprEta_arrow @InterpExprEta'_arrow @eq_interp_eta @eq_InterpEta : reflective_interp.