aboutsummaryrefslogtreecommitdiff
path: root/src/Experiments
diff options
context:
space:
mode:
authorGravatar Jason Gross <jgross@mit.edu>2018-04-22 14:50:53 -0400
committerGravatar Jason Gross <jasongross9@gmail.com>2018-05-05 18:01:31 -0400
commit9471c11b708e5f1c564ef4b5da8cc8a0a5df0c67 (patch)
treec1f844d7dd79548b6a893c2d52488b2e9474f3e7 /src/Experiments
parentdd03058bd0729cda68e810a26920884b59d7c3db (diff)
Add comment about leaky abstraction
Diffstat (limited to 'src/Experiments')
-rw-r--r--src/Experiments/PartialEvaluationWithLetIn.v10
1 files changed, 9 insertions, 1 deletions
diff --git a/src/Experiments/PartialEvaluationWithLetIn.v b/src/Experiments/PartialEvaluationWithLetIn.v
index c8140ea83..7b854af21 100644
--- a/src/Experiments/PartialEvaluationWithLetIn.v
+++ b/src/Experiments/PartialEvaluationWithLetIn.v
@@ -361,7 +361,15 @@ Module partial.
(update_literal_with_state : abstract_domain' base.type.nat -> nat -> nat)
(state_of_upperbound : forall T, upperboundT T -> abstract_domain' T)
(bottom' : forall A, abstract_domain' A)
- (** we need constructors for reify and destructors for intersect_state *)
+ (** we need constructors for reify and destructors for
+ intersect_state, which is needed to talk about how to do
+ cast on values; there's a leaky abstraction barrier
+ here: we assume that we can take apart the abstract
+ state via type structure and then put it back together
+ again, in order to cast values. But we don't require
+ that the abstract state is actually a pair on product
+ types, so we pay the cost of crossing that abstraction
+ barrier in both directions a decent amount *)
(ident_Literal : nat -> pident parametric.base.type.nat)
(ident_Pair : forall A B, pident (#A -> #B -> #A * #B)%ptype)
(ident_Fst : forall A B, pident (#A * #B -> #A)%ptype)