From bb8f766778192902cc0d36c1f4e339ece8cbbac5 Mon Sep 17 00:00:00 2001 From: Ralf Jung <jung@mpi-sws.org> Date: Fri, 4 Mar 2016 09:29:46 +0100 Subject: [PATCH] some more comments --- heap_lang/lang.v | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/heap_lang/lang.v b/heap_lang/lang.v index ecc53ff13..1b934de7b 100644 --- a/heap_lang/lang.v +++ b/heap_lang/lang.v @@ -32,8 +32,16 @@ Proof. destruct mx; rewrite /= ?elem_of_cons; naive_solver. Qed. +(** A typeclass for whether a variable is bound in a given + context. Making this a typeclass means we can use tpeclass search + to program solving these constraints, so this becomes extensible. + Also, since typeclass search runs *after* unification, Coq has already + inferred the X for us; if we were to go for embedded proof terms ot + tactics, Coq would do things in the wrong order. *) Class VarBound (x : string) (X : list string) := var_bound : bool_decide (x ∈ X). +(* FIXME shouldn't this have this Hint to only perfom search of x and X + are not evars? *) Hint Extern 0 (VarBound _ _) => vm_compute; exact I : typeclass_instances. Instance var_bound_proof_irrel x X : ProofIrrel (VarBound x X). @@ -46,6 +54,13 @@ Qed. Inductive expr (X : list string) := (* Base lambda calculus *) + (* Var is the only place where the terms contain a proof. The fact that they + contain a proof at all is suboptimal, since this means two seeminlgy + convertible terms could differ in their proofs. However, this also has + some advantages: + * We can make the [X] an index, so we can do non-dependent match. + * In expr_weaken, we can push the proof all the way into Var, making + sure that proofs never block computation. *) | Var (x : string) `{VarBound x X} | Rec (f x : binder) (e : expr (f :b: x :b: X)) | App (e1 e2 : expr X) -- GitLab