+ let rec sortify metasenv subst = function
+ | NCic.Implicit (`Typeof _) -> assert false
+ | NCic.Sort _ as t -> metasenv, subst, t, 0
+ | NCic.Meta (i,_) as t ->
+ let tags, context, ty = NCicUtils.lookup_meta i metasenv in
+ if has_tag ((=) `IsSort) tags then metasenv, subst, t, i
+ else
+ let ty = NCicReduction.whd ~subst context ty in
+ let metasenv, subst, ty, _ = sortify metasenv subst ty in
+ let metasenv, j, m, _ =
+ NCicMetaSubst.mk_meta metasenv ~attrs:[`IsSort] [] (`WithType ty)
+ in
+ pp(lazy("rimpiazzo " ^ string_of_int i^" con "^string_of_int j));
+ let subst_entry = i, (tags, context, m, ty) in
+ let subst = subst_entry :: subst in
+ let metasenv = List.filter (fun x,_ -> i <> x) metasenv in
+ metasenv, subst, m, j
+ | NCic.Appl (NCic.Meta _ as hd :: args) as t ->
+ let metasenv, subst, lambda_Mj =
+ lambda_intros rdb metasenv subst context t args
+ in
+ let metasenv,subst= unify true metasenv subst context hd lambda_Mj in
+ let t = NCicReduction.whd ~subst context t in
+ let _result = sortify metasenv subst t in
+ (* untested, maybe dead, code *) assert false;
+ | t ->
+ if could_reduce t then raise (Uncertain(lazy "not a sort"))
+ else raise (UnificationFailure(lazy "not a sort"))
+ in
+ let metasenv, subst, _, n =
+ if has_tag ((=) `IsSort) tags then
+ let m,s,x,_ = sortify metasenv subst (NCicReduction.whd ~subst context t)
+ in m,s,x,n
+ else if is_sort metasenv subst context t then
+ sortify metasenv subst (NCic.Meta (n,lc))
+ else
+ metasenv, subst, NCic.Rel ~-1,n
+ in
+ let tags, ctx, ty = NCicUtils.lookup_meta n metasenv in
+ (* instantiation *)
+ pp (lazy(string_of_int n ^ " := 111 = "^
+ NCicPp.ppterm ~metasenv ~subst ~context t));