+ ~what:("",0,Ast.Ident (name,None));
+ if name = "_clearme" then clear_tac ["_clearme"] else id_tac ]
+;;
+
+let constructor ?(num=1) ~args status goal =
+ if num < 1 then fail (lazy "constructor numbers begin with 1");
+ let gty = get_goalty status goal in
+ let status, (r,_,_,_) = analyse_indty status gty in
+ let ref = NReference.mk_constructor num r in
+ let t =
+ if args = [] then Ast.NRef ref else
+ Ast.Appl (HExtlib.list_concat ~sep:[Ast.Implicit `Vector]
+ ([Ast.NRef ref] :: List.map (fun _,_,x -> [x]) args))
+ in
+ exec (apply_tac ("",0,t)) status goal
+;;
+
+let constructor_tac ?num ~args = distribute_tac (constructor ?num ~args);;
+
+let assert0_tac (hyps,concl) = distribute_tac (fun status goal ->
+ let gty = get_goalty status goal in
+ let eq status ctx t1 t2 =
+ let status,t1 = disambiguate status t1 None ctx in
+ let status,t1 = apply_subst status ctx t1 in
+ let status,t1 = term_of_cic_term status t1 ctx in
+ let t2 = mk_cic_term ctx t2 in
+ let status,t2 = apply_subst status ctx t2 in
+ let status,t2 = term_of_cic_term status t2 ctx in
+ prerr_endline ("COMPARING: " ^ NCicPp.ppterm ~subst:[] ~metasenv:[] ~context:ctx t1 ^ " vs " ^ NCicPp.ppterm ~subst:[] ~metasenv:[] ~context:ctx t2);
+ assert (t1=t2);
+ status
+ in
+ let status,gty' = term_of_cic_term status gty (ctx_of gty) in
+ let status = eq status (ctx_of gty) concl gty' in
+ let status,_ =
+ List.fold_right2
+ (fun (id1,e1) ((id2,e2) as item) (status,ctx) ->
+ assert (id1=id2 || (prerr_endline (id1 ^ " vs " ^ id2); false));
+ match e1,e2 with
+ `Decl t1, NCic.Decl t2 ->
+ let status = eq status ctx t1 t2 in
+ status,item::ctx
+ | `Def (b1,t1), NCic.Def (b2,t2) ->
+ let status = eq status ctx t1 t2 in
+ let status = eq status ctx b1 b2 in
+ status,item::ctx
+ | _ -> assert false
+ ) hyps (ctx_of gty) (status,[])
+ in
+ exec id_tac status goal)