fact: Fixpoint interp_term (ty : type) : valuation -> eval_ctxt -> term -> Prop := fun val => match ty with | Tvar v => comp_term (val v) | Arrow t1 t2 => fun ectx t => exists t' ectx', TmEval ectx t (VAbs t' ectx') /\ forall v, interp_val t1 val v -> interp_term t2 val (v ::: ectx') t' | Forall name ty => fun ectx t => forall P, computable P -> interp_term ty (extend val name P) ectx t end with interp_val (ty : type) : valuation -> value -> Prop := fun val => match ty with | Tvar v => comp_val (val v) | Arrow t1 t2 => fun v => match v with | VAbs t env => forall v, interp_val t1 val v -> interp_term t2 val (v ::: env) t end | Forall name ty => fun v => forall P, computable P -> interp_val ty (extend val name P) v end .
imports: List Arith Bool