aboutsummaryrefslogtreecommitdiff
path: root/src/Reflection
diff options
context:
space:
mode:
authorGravatar Jason Gross <jgross@mit.edu>2016-11-22 16:52:08 -0500
committerGravatar Jason Gross <jgross@mit.edu>2016-11-22 23:32:02 -0500
commitcd3a49ad51a599383f981c22f6fcca49fdd8d8e0 (patch)
tree85909e8c501927fe4862c3b7daa16dfcdf0bbac8 /src/Reflection
parente01bc703cfcb2aa0a0a5c3bdfe6696cefdfb8215 (diff)
Add interp_all_binders_for'
Diffstat (limited to 'src/Reflection')
-rw-r--r--src/Reflection/Application.v38
1 files changed, 38 insertions, 0 deletions
diff --git a/src/Reflection/Application.v b/src/Reflection/Application.v
index 4274b3b3f..b49752c99 100644
--- a/src/Reflection/Application.v
+++ b/src/Reflection/Application.v
@@ -62,6 +62,42 @@ Section language.
| Arrow A B => interp_flat_type var (all_binders_for (Arrow A B))
end.
+ Fixpoint interp_all_binders_for' (T : type base_type) var
+ := match T return Type with
+ | Tflat _ => unit
+ | Arrow A B => var A * interp_all_binders_for' B var
+ end%type.
+
+ Fixpoint interp_all_binders_for_of' T var {struct T}
+ : interp_all_binders_for' T var -> interp_all_binders_for T var
+ := match T return interp_all_binders_for' T var -> interp_all_binders_for T var with
+ | Tflat _ => fun x => x
+ | Arrow A B =>
+ match B
+ return (interp_all_binders_for' B var -> interp_all_binders_for B var)
+ -> interp_all_binders_for' (Arrow A B) var
+ -> interp_all_binders_for (Arrow A B) var
+ with
+ | Tflat _ => fun _ => @fst _ _
+ | Arrow C D => fun interp x => (fst x, interp (snd x))
+ end (@interp_all_binders_for_of' B var)
+ end.
+
+ Fixpoint interp_all_binders_for_to' T var {struct T}
+ : interp_all_binders_for T var -> interp_all_binders_for' T var
+ := match T return interp_all_binders_for T var -> interp_all_binders_for' T var with
+ | Tflat _ => fun x => x
+ | Arrow A B =>
+ match B
+ return (interp_all_binders_for B var -> interp_all_binders_for' B var)
+ -> interp_all_binders_for (Arrow A B) var
+ -> interp_all_binders_for' (Arrow A B) var
+ with
+ | Tflat _ => fun _ x => (x, tt)
+ | Arrow C D => fun interp x => (fst x, interp (snd x))
+ end (@interp_all_binders_for_to' B var)
+ end.
+
Definition fst_binder {A B var} (args : interp_flat_type var (all_binders_for (Arrow A B))) : var A
:= match B return interp_flat_type var (all_binders_for (Arrow A B)) -> var A with
| Tflat _ => fun x => x
@@ -139,6 +175,8 @@ End language.
Arguments all_binders_for {_} !_ / .
Arguments interp_all_binders_for {_} !_ _ / .
+Arguments interp_all_binders_for_of' {_ !_ _} !_ / .
+Arguments interp_all_binders_for_to' {_ !_ _} !_ / .
Arguments count_binders {_} !_ / .
Arguments binders_for {_} !_ !_ _ / .
Arguments remove_binders {_} !_ !_ / .