skip_thm_and_qed : bool;
}
+let debug = true
+
(* helpers ******************************************************************)
let split2_last l1 l2 =
*)
let get_type msg st bo =
try
- let ty, _ = TC.type_of_aux' [] st.context (H.cic bo) Un.empty_ugraph in
+ let ty, _ = TC.type_of_aux' [] st.context (H.cic bo) Un.oblivion_ugraph in
ty
with e -> failwith (msg ^ ": " ^ Printexc.to_string e)
let get_ind_names uri tno =
try
- let ts = match E.get_obj Un.empty_ugraph uri with
+ let ts = match E.get_obj Un.oblivion_ugraph uri with
| C.InductiveDefinition (ts, _, _, _), _ -> ts
| _ -> assert false
in
let mk_convert st ?name sty ety note =
let e = Cn.hole "" in
let csty, cety = H.cic sty, H.cic ety in
- let _note = Printf.sprintf "%s\nSINTH: %s\nEXP: %s"
- note (Pp.ppterm csty) (Pp.ppterm cety)
+ let script =
+ if debug then
+ let sname = match name with None -> "" | Some (id, _) -> id in
+ let note = Printf.sprintf "%s: %s\nSINTH: %s\nEXP: %s"
+ note sname (Pp.ppterm csty) (Pp.ppterm cety)
+ in
+ [T.Note note]
+ else []
in
assert (Ut.is_sober csty);
assert (Ut.is_sober cety);
- if Ut.alpha_equivalence csty cety then [(* T.Note note *)] else
+ if Ut.alpha_equivalence csty cety then script else
let sty, ety = H.acic_bc st.context sty, H.acic_bc st.context ety in
match name with
- | None -> [T.Change (sty, ety, None, e, ""(*note*))]
+ | None -> T.Change (sty, ety, None, e, "") :: script
| Some (id, i) ->
begin match get_entry st id with
- | C.Def _ -> assert false (* [T.ClearBody (id, note)] *)
- | C.Decl _ -> [T.Change (ety, sty, Some (id, Some id), e, "" (* note *))]
+ | C.Def _ -> assert false (* T.ClearBody (id, "") :: script *)
+ | C.Decl _ ->
+ T.Change (ety, sty, Some (id, Some id), e, "") :: script
end
let convert st ?name v =
match get_inner_types st v with
- | None -> [(*T.Note "NORMAL: NO INNER TYPES"*)]
+ | None ->
+ if debug then [T.Note "NORMAL: NO INNER TYPES"] else []
| Some (sty, ety) -> mk_convert st ?name sty ety "NORMAL"
let convert_elim st ?name t v pattern =
let intro = get_intro name in
proc_proof (add st entry intro) t
-and proc_letin st what name v t =
+and proc_letin st what name v w t =
let intro = get_intro name in
let proceed, dtext = test_depth st in
let script = if proceed then
in
st, C.Decl (H.cic ity), rqv
| None ->
- (*CSC: here we need the type of v *)
- st, C.Def (H.cic v, assert false), [T.LetIn (intro, v, dtext)]
+ st, C.Def (H.cic v, H.cic w), [T.LetIn (intro, v, dtext)]
in
let entry = Some (name, hyp) in
let qt = proc_proof (next (add st entry intro)) t in
let script = [T.Apply (what, dtext)] in
mk_intros st what script
+and proc_const st what =
+ let _, dtext = test_depth st in
+ let script = [T.Apply (what, dtext)] in
+ mk_intros st what script
+
and proc_appl st what hd tl =
let proceed, dtext = test_depth st in
let script = if proceed then
let ty = get_type "TC2" st hd in
let classes, rc = Cl.classify st.context ty in
- let goal_arity = match get_inner_types st what with
- | None -> 0
- | Some (ity, _) -> snd (PEH.split_with_whd (st.context, H.cic ity))
+ let goal_arity, goal = match get_inner_types st what with
+ | None -> 0, None
+ | Some (ity, ety) ->
+ snd (PEH.split_with_whd (st.context, H.cic ity)), Some (H.cic ety)
in
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 script = List.rev (mk_arg st hd) in
match rc with
| Some (i, j, uri, tyno) ->
- let classes, tl, _, where = split2_last classes tl in
- let script = List.rev (mk_arg st where) @ script in
- let synth = I.S.add 1 synth in
+ 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 = get_ind_names uri tyno in
- let qs = proc_bkd_proofs (next st) synth names classes tl in
- if is_rewrite_right hd then
- script @ mk_rewrite st dtext where qs tl false what
+ 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
- script @ mk_rewrite st dtext where qs tl true what
+ script2 @ mk_rewrite st dtext where qs tl2 true what
else
- let predicate = List.nth tl (parsno - i) in
+ let predicate = List.nth tl2 (parsno - i) in
let e = Cn.mk_pattern j predicate in
let using = Some hd in
- (* convert_elim st what what e @ *) script @
+ (* convert_elim st what what e @ *) script2 @
[T.Elim (where, using, e, dtext ^ text); T.Branch (qs, "")]
| None ->
let qs = proc_bkd_proofs (next st) synth [] classes tl in
{st with context = context; clears = clears; clears_note = note; }
in
match t with
- | C.ALambda (_, name, w, t) -> proc_lambda st name w t
- | C.ALetIn (_, name, v, ty, t) as what -> assert false (*proc_letin (f st) what name v t*)
- | C.ARel _ as what -> proc_rel (f st) what
- | C.AMutConstruct _ as what -> proc_mutconstruct (f st) what
- | C.AAppl (_, hd :: tl) as what -> proc_appl (f st) what hd tl
- | what -> proc_other (f st) what
+ | C.ALambda (_, name, w, t) -> proc_lambda st 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 =
try
(* object costruction *******************************************************)
-let is_theorem pars =
+let is_theorem pars =
+ pars = [] ||
List.mem (`Flavour `Theorem) pars || List.mem (`Flavour `Fact) pars ||
List.mem (`Flavour `Remark) pars || List.mem (`Flavour `Lemma) pars