fact: Fixpoint open_pattern {A P y} (p : pattern t A P y) : t (P y) := match p with | pbase x f u => oeq <- unify x y u; match oeq return t (P y) with | Some eq => let h := reduce (RedStrong [rl:RedBeta;RedDelta;RedMatch]) (eq_sym eq) in let 'eq_refl := eq in let b := reduce (RedStrong [rl:RedBeta]) (f h) in b | None => raise DoesNotMatch end | @ptele _ _ _ _ C f => e <- evar C; open_pattern (f e) end.