) s) ]
;;
+let cut_tac t =
+ block_tac [
+ exact_tac ("",0, Ast.Appl [Ast.Implicit `JustOne; Ast.Implicit `JustOne]);
+ branch_tac;
+ pos_tac [2]; exact_tac t;
+ shift_tac; pos_tac [1]; skip_tac;
+ merge_tac ]
+;;
+
+let lapply_tac (s,n,t) =
+ exact_tac (s,n, Ast.Appl [Ast.Implicit `JustOne; t])
+;;
+
let reduce_tac ~reduction ~where =
let change status t =
match reduction with
exec id_tac status goal)
;;
+let sort_of_goal_tac sortref = distribute_tac (fun status goal ->
+ let goalty = get_goalty status goal in
+ let status,sort = typeof status (ctx_of goalty) goalty in
+ let sort = fix_sorts sort in
+ let status, sort = term_of_cic_term status sort (ctx_of goalty) in
+ sortref := sort;
+ status)
+;;
+
let elim_tac ~what:(txt,len,what) ~where =
let what = txt, len, Ast.Appl [what; Ast.Implicit `Vector] in
let indtyinfo = ref None in
- let sort = ref None in
- let compute_goal_sort_tac = distribute_tac (fun status goal ->
- let goalty = get_goalty status goal in
- let status, goalsort = typeof status (ctx_of goalty) goalty in
- let goalsort = fix_sorts goalsort in
- sort := Some goalsort;
- exec id_tac status goal)
- in
+ let sort = ref (NCic.Rel 1) in
atomic_tac (block_tac [
analyze_indty_tac ~what indtyinfo;
(fun s -> select_tac
~where ~job:(`Substexpand ((HExtlib.unopt !indtyinfo).rightno+1)) true s);
- compute_goal_sort_tac;
+ sort_of_goal_tac sort;
(fun status ->
- let sort = HExtlib.unopt !sort in
let ity = HExtlib.unopt !indtyinfo in
let NReference.Ref (uri, _) = ity.reference in
- let status, sort = term_of_cic_term status sort (ctx_of sort) in
- let name = NUri.name_of_uri uri ^
- match sort with
- | NCic.Sort NCic.Prop -> "_ind"
- | NCic.Sort NCic.Type u ->
- "_rect_" ^ NCicPp.ppterm ~metasenv:[] ~subst:[] ~context:[] sort
- | _ -> assert false
+ let name =
+ NUri.name_of_uri uri ^ "_" ^
+ snd (NCicElim.ast_of_sort
+ (match !sort with NCic.Sort x -> x | _ -> assert false))
in
let eliminator =
let _,_,w = what in
exact_tac ("",0,eliminator) status) ])
;;
-let sort_of_goal_tac sortref = distribute_tac (fun status goal ->
- let goalty = get_goalty status goal in
- let status,sort = typeof status (ctx_of goalty) goalty in
- let status,sort = term_of_cic_term status sort (ctx_of goalty) in
- sortref := sort;
- status)
-;;
-
let rewrite_tac ~dir ~what:(_,_,what) ~where status =
let sortref = ref (NCic.Rel 1) in
let status = sort_of_goal_tac sortref status in
- let suffix =
- match !sortref with
- | NCic.Sort NCic.Prop -> "_ind"
- | NCic.Sort NCic.Type u ->
- "_rect_" ^ NCicPp.ppterm ~metasenv:[] ~subst:[] ~context:[] !sortref
- | _ -> assert false
+ let suffix = "_" ^ snd (NCicElim.ast_of_sort
+ (match !sortref with NCic.Sort x -> x | _ -> assert false))
in
let name =
match dir with
if name = "_clearme" then clear_tac ["_clearme"] else id_tac ]
;;
-let constructor ?(num=1) status goal =
+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
- exec (apply_tac ("",0,Ast.NRef ref)) status goal
+ 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 = distribute_tac (constructor ?num);;
+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