max_depth: int option;
depth: int;
context: C.context;
- intros: string option list;
clears: string list;
clears_note: string;
case: int list;
| C.AMeta _ -> "meta"
| C.AImplicit _ -> "implict"
-let clear st = {st with intros = []}
+let next st = {st with depth = succ st.depth}
-let next st = {(clear st) with depth = succ st.depth}
-
-let add st entry intro =
- {st with context = entry :: st.context; intros = intro :: st.intros}
+let add st entry = {st with context = entry :: st.context}
let push st = {st with case = 1 :: st.case}
(* proof construction *******************************************************)
-let used_premise = C.Name "USED"
+let anonymous_premise = C.Name "PREMISE"
let mk_exp_args hd tl classes synth =
let meta id = C.AImplicit (id, None) in
[T.Note note]
else []
in
- assert (Ut.is_sober csty);
- assert (Ut.is_sober cety);
+ assert (Ut.is_sober st.context csty);
+ assert (Ut.is_sober st.context cety);
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
| C.Anonymous -> None
| C.Name s -> Some s
-let mk_intros st what script =
- let intros st script =
- if st.intros = [] then script else
- let count = List.length st.intros in
- T.Intros (Some count, List.rev st.intros, "") :: script
- in
+let mk_preamble st what script =
let clears st script =
if true (* st.clears = [] *) then script else T.Clear (st.clears, st.clears_note) :: script
in
- intros st (clears st (convert st what @ script))
+ clears st (convert st what @ script)
let mk_arg st = function
| C.ARel (_, _, i, name) as what -> convert st ~name:(name, i) what
assert (List.length tl = 6);
let what, where, predicate = List.nth tl 5, List.nth tl 3, List.nth tl 2 in
let e = Cn.mk_pattern 1 predicate in
+ if (Cn.does_not_occur e) then st, [] else
match where with
| C.ARel (_, _, i, premise) as w ->
(* let _script = convert_elim st ~name:(premise, i) v w e in *)
in
if DTI.does_not_occur (succ i) (H.cic t) || compare premise name then
{st with context = Cn.clear st.context premise}, script name
- else
+ else begin
+ assert (Ut.is_sober st.context (H.cic ity));
+ let ity = H.acic_bc st.context ity in
let br1 = [T.Id ""] in
let br2 = List.rev (T.Apply (w, "assumption") :: script None) in
let text = "non linear rewrite" in
st, [T.Branch ([br2; br1], ""); T.Cut (name, ity, text)]
+ end
| _ -> assert false
let mk_rewrite st dtext where qs tl direction t =
assert (List.length tl = 5);
let predicate = List.nth tl 2 in
let e = Cn.mk_pattern 1 predicate in
- let script = [] (* convert_elim st t t e *) in
- script @ [T.Rewrite (direction, where, None, e, dtext); T.Branch (qs, "")]
+ let script = [T.Branch (qs, "")] in
+ if (Cn.does_not_occur e) then script else
+(* let script = convert_elim st t t e in *)
+ T.Rewrite (direction, where, None, e, dtext) :: script
let rec proc_lambda st what name v t =
- let dno, ae = match get_inner_types st t with
- | None -> false, true
- | Some (sty, ety) ->
- let sty, ety = H.cic sty, H.cic ety in
- DTI.does_not_occur 1 sty && DTI.does_not_occur 1 ety,
- Ut.alpha_equivalence sty ety
- in
- let dno = dno && DTI.does_not_occur 1 (H.cic t) in
- let name = match dno, name with
- | true, _ -> C.Anonymous
- | false, C.Anonymous -> H.mk_fresh_name st.context used_premise
- | false, name -> name
+ let name = match name with
+ | C.Anonymous -> H.mk_fresh_name st.context anonymous_premise
+ | name -> name
in
let entry = Some (name, C.Decl (H.cic v)) in
let intro = get_intro name in
- let st = (add st entry intro) in
- if ae then proc_proof st t else
- let script = proc_proof (clear st) t in
- mk_intros st t script
+ let script = proc_proof (add st entry) t in
+ let script = T.Intros (Some 1, [intro], "") :: script in
+ mk_preamble st what script
and proc_letin st what name v w t =
let intro = get_intro name in
| C.AAppl (_, hd :: tl) when is_fwd_rewrite_left hd tl ->
mk_fwd_rewrite st dtext intro tl false v t ity
| v ->
+ assert (Ut.is_sober st.context (H.cic ity));
+ let ity = H.acic_bc st.context ity in
let qs = [proc_proof (next st) v; [T.Id ""]] in
- let ity = H.acic_bc st.context ity in
st, [T.Branch (qs, ""); T.Cut (intro, ity, dtext)]
in
st, C.Decl (H.cic ity), rqv
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 qt = proc_proof (next (add st entry)) t in
List.rev_append rqv qt
else
[T.Apply (what, dtext)]
in
- mk_intros st what script
+ mk_preamble st what script
and proc_rel st what =
let _, dtext = test_depth st in
let text = "assumption" in
let script = [T.Apply (what, dtext ^ text)] in
- mk_intros st what script
+ mk_preamble st what script
and proc_mutconstruct st what =
let _, dtext = test_depth st in
let script = [T.Apply (what, dtext)] in
- mk_intros st what script
+ mk_preamble 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
+ mk_preamble st what script
and proc_appl st what hd tl =
let proceed, dtext = test_depth st in
else
[T.Apply (what, dtext)]
in
- mk_intros st what script
+ mk_preamble st what script
and proc_other st what =
let text = Printf.sprintf "%s: %s" "UNEXPANDED" (string_of_head what) in
let script = [T.Note text] in
- mk_intros st what script
+ mk_preamble st what script
and proc_proof st t =
let f st =
max_depth = depth;
depth = 0;
context = [];
- intros = [];
clears = [];
clears_note = "";
case = [];