+ let parsno, argsno = List.length classes, List.length tl in
+ let decurry = parsno - argsno in
+ let diff = goal_arity - decurry in
+ if diff < 0 then failwith (Printf.sprintf "NOT TOTAL: %i %s |--- %s" diff (Pp.ppcontext st.context) (Pp.ppterm (H.cic hd)));
+ let classes = Cl.adjust st.context tl ?goal classes in
+ let rec mk_synth a n =
+ if n < 0 then a else mk_synth (I.S.add n a) (pred n)
+ in
+ let synth = mk_synth I.S.empty decurry in
+ let text = "" (* Printf.sprintf "%u %s" parsno (Cl.to_string h) *) in
+ let script = List.rev (mk_arg st hd) in
+ match rc with
+ | Some (i, j, uri, tyno) ->
+ let classes2, tl2, _, where = split2_last classes tl in
+ let script2 = List.rev (mk_arg st where) @ script in
+ let synth2 = I.S.add 1 synth in
+ let names = H.get_ind_names uri tyno in
+ let qs = proc_bkd_proofs (next st) synth2 names classes2 tl2 in
+ if List.length qs <> List.length names then
+ let qs = proc_bkd_proofs (next st) synth [] classes tl in
+ let hd = mk_exp_args hd tl classes synth in
+ script @ [T.Apply (hd, dtext ^ text); T.Branch (qs, "")]
+ else if is_rewrite_right hd then
+ script2 @ mk_rewrite st dtext where qs tl2 false what
+ else if is_rewrite_left hd then
+ script2 @ mk_rewrite st dtext where qs tl2 true what
+ else
+ let predicate = List.nth tl2 (parsno - i) in
+ let e = Cn.mk_pattern j predicate in
+ let using = Some hd in
+ script2 @
+ [T.Elim (where, using, e, dtext ^ text); T.Branch (qs, "")]
+ | None ->
+ let names = get_sub_names hd tl in
+ let qs = proc_bkd_proofs (next st) synth names classes tl in
+ let hd = mk_exp_args hd tl classes synth in
+ script @ [T.Apply (hd, dtext ^ text); T.Branch (qs, "")]
+ else
+ [T.Apply (what, dtext)]
+ in
+ mk_preamble st what script
+
+and proc_other st what =
+ let _, dtext = test_depth st in
+ let text = Printf.sprintf "%s: %s" "UNEXPANDED" (string_of_head what) in
+ let script = [T.Apply (what, dtext ^ text)] in
+ mk_preamble st what script
+
+and proc_proof st t =
+ let f st =
+ let xtypes, note = match get_inner_types st t with
+ | Some (it, et) -> Some (H.cic it, H.cic et),
+ (Printf.sprintf "\nInferred: %s\nExpected: %s"
+ (Pp.ppterm (H.cic it)) (Pp.ppterm (H.cic et)))
+ | None -> None, "\nNo types"
+ in
+ let context, _clears = Cn.get_clears st.context (H.cic t) xtypes in
+ {st with context = context}
+ in
+ match t with
+ | C.ALambda (_, name, w, t) as what -> proc_lambda (f st) what name w t
+ | C.ALetIn (_, name, v, w, t) as what -> proc_letin (f st) what name v w t
+ | C.ARel _ as what -> proc_rel (f st) what
+ | C.AMutConstruct _ as what -> proc_mutconstruct (f st) what
+ | C.AConst _ as what -> proc_const (f st) what
+ | C.AAppl (_, hd :: tl) as what -> proc_appl (f st) what hd tl
+ | what -> proc_other (f st) what
+
+and proc_bkd_proofs st synth names classes ts =