+ | GrafiteAst.NSemicolon _ -> fun x -> x
+ | GrafiteAst.NShift _ -> NTactics.shift_tac
+ | GrafiteAst.NSkip _ -> NTactics.skip_tac
+ | GrafiteAst.NUnfocus _ -> NTactics.unfocus_tac
+ | GrafiteAst.NWildcard _ -> NTactics.wildcard_tac
+ | GrafiteAst.NTry (_,tac) -> NTactics.try_tac
+ (eval_ng_tac (text, prefix_len, tac))
+ | GrafiteAst.NAssumption _ -> NTactics.assumption_tac
+;;
+
+let subst_metasenv_and_fix_names s =
+ let u,h,metasenv, subst,o = s#obj in
+ let o =
+ NCicUntrusted.map_obj_kind ~skip_body:true
+ (NCicUntrusted.apply_subst subst []) o
+ in
+ s#set_obj (u,h,NCicUntrusted.apply_subst_metasenv subst metasenv,subst,o)
+;;
+
+let rec eval_ncommand opts status (text,prefix_len,cmd) =
+ match cmd with
+ | GrafiteAst.UnificationHint (loc, t, n) -> eval_unification_hint status t n
+ | GrafiteAst.NQed loc ->
+ (match status#ng_status with
+ | GrafiteTypes.ProofMode estatus ->
+ let uri,height,menv,subst,obj_kind = estatus#obj in
+ if menv <> [] then
+ raise
+ (GrafiteTypes.Command_error"You can't Qed an incomplete theorem")
+ else
+ let obj_kind =
+ NCicUntrusted.map_obj_kind
+ (NCicUntrusted.apply_subst subst []) obj_kind in
+ let height = NCicTypeChecker.height_of_obj_kind uri obj_kind in
+ (* fix the height inside the object *)
+ let rec fix () = function
+ | NCic.Const (NReference.Ref (u,spec)) when NUri.eq u uri ->
+ NCic.Const (NReference.reference_of_spec u
+ (match spec with
+ | NReference.Def _ -> NReference.Def height
+ | NReference.Fix (i,j,_) -> NReference.Fix(i,j,height)
+ | NReference.CoFix _ -> NReference.CoFix height
+ | NReference.Ind _ | NReference.Con _
+ | NReference.Decl as s -> s))
+ | t -> NCicUtils.map (fun _ () -> ()) () fix t
+ in
+ let obj_kind =
+ match obj_kind with
+ | NCic.Fixpoint _ ->
+ NCicUntrusted.map_obj_kind (fix ()) obj_kind
+ | _ -> obj_kind
+ in
+ let obj = uri,height,[],[],obj_kind in
+ NCicTypeChecker.typecheck_obj obj;
+ let estatus = NCicLibrary.add_obj estatus uri obj in
+ let objs = NCicElim.mk_elims obj in
+ let timestamp,uris_rev =
+ List.fold_left
+ (fun (estatus,uris_rev) (uri,_,_,_,_) as obj ->
+ NCicTypeChecker.typecheck_obj obj;
+ let estatus = NCicLibrary.add_obj estatus uri obj in
+ estatus,uri::uris_rev
+ ) (estatus,[]) objs in
+ let uris = uri::List.rev uris_rev in
+ status#set_ng_status
+ (GrafiteTypes.CommandMode (estatus :> NEstatus.status)),`New uris
+ | _ -> raise (GrafiteTypes.Command_error "Not in proof mode"))
+ | GrafiteAst.NObj (loc,obj) ->
+ let estatus =
+ match status#ng_status with
+ | GrafiteTypes.ProofMode _ -> assert false
+ | GrafiteTypes.CommandMode es -> es
+ in
+ let estatus,obj =
+ GrafiteDisambiguate.disambiguate_nobj estatus
+ ~baseuri:status#baseuri (text,prefix_len,obj) in
+ let uri,height,nmenv,nsubst,nobj = obj in
+ let ninitial_stack = Continuationals.Stack.of_nmetasenv nmenv in
+ let status =
+ status#set_ng_status
+ (GrafiteTypes.ProofMode
+ (subst_metasenv_and_fix_names
+ ((new NTacStatus.status obj ninitial_stack)#set_estatus estatus)))
+ in
+ (match nmenv with
+ [] ->
+ eval_ncommand opts status ("",0,GrafiteAst.NQed Stdpp.dummy_loc)
+ | _ -> status,`New [])
+ | GrafiteAst.NUnivConstraint (loc,strict,u1,u2) ->
+ NCicEnvironment.add_constraint strict [false,u1] [false,u2];
+ status, `New [u1;u2]