- let lapply_tac status =
- let (proof, goal) = status in
- let _,metasenv,_,_ = proof in
- let _,context,ty = CicUtil.lookup_meta goal metasenv in
+ aux [] p
+
+let get_conclusion context t =
+ let rec aux p context = function
+ | Cic.Prod (name, t1, t2) ->
+ aux (succ p) (Some (name, Cic.Decl t1) :: context) t2
+ | Cic.LetIn (name, u1, t2) ->
+ aux (succ p) (Some (name, Cic.Def (u1, None)) :: context) t2
+ | Cic.Cast (t2, t1) -> aux p context t2
+ | t -> p, context, t
+ in aux 0 context t
+
+let get_conclusion_dependences context t =
+ let p, context, conclusion = get_conclusion context t in
+ let rec aux l q =
+ if q <= 0 then l else
+ let b = TC.does_not_occur context (pred q) q conclusion in
+ aux (b :: l) (pred q)
+ in
+ aux [] p
+
+let solve_independents ?with_what deps =
+ let rec aux p conts = function
+ | [] -> p, conts
+ | true :: tl ->
+ let cont = PT.apply_tac ~term:(Cic.Rel (succ p)) in
+ aux (succ p) (cont :: conts) tl
+ | false :: tl -> aux (succ p) conts tl
+ in
+ let p, conts = aux 0 [] deps in
+ match with_what with
+ | None -> conts
+ | Some t -> PT.apply_tac ~term:(S.lift p t) :: conts
+
+let lapply_tac ?(mk_fresh_name_callback = FreshNamesGenerator.mk_fresh_name ~subst:[])
+ (* ?(substs = []) *) ?to_what what =
+ let cut_tac term = PT.cut_tac ~mk_fresh_name_callback term in
+ let intros_tac () = PT.intros_tac ~mk_fresh_name_callback () in
+ let solve_conclusion_tac ?with_what p deps =
+ T.then_ ~start:(intros_tac ())
+ ~continuation:(
+ T.thens ~start:(PT.apply_tac what)
+ ~continuations:(
+ skip_metas p @ solve_independents ?with_what deps
+ )
+ )
+ in
+ let lapply_tac (proof, goal) =
+ let xuri, metasenv, u, t = proof in
+ let _, context, _ = CicUtil.lookup_meta goal metasenv in