Section Evaluation.
Variable (M : model).
Fixpoint eval (ρ : nat -> tpred) (s : poly_type) : tpred :=
match s with
| poly_var n => Var M (ρ n)
| poly_arr s t => Arr M (eval ρ s) (eval ρ t)
| poly_abs s => All M (fun d => eval (d .: ρ) s)
end.
Instance eval_ext :
Proper (pointwise_relation _ pw_iff ==> eq ==> pw_iff) eval.

Lemma eval_beta (M : model) s t ρ :
eval M ρ (subst_poly_type (t .: poly_var) s) == eval (lift M) (eval M ρ t .: ρ >> Var M) s.