max_depth: int option;
depth: int;
context: C.context;
- intros: string list;
- ety: C.annterm option
+ intros: string list
}
(* helpers ******************************************************************)
| C.AMeta _ -> "meta"
| C.AImplicit _ -> "implict"
-let clear st = {st with intros = []; ety = None}
+let clear st = {st with intros = []}
let next st = {(clear st) with depth = succ st.depth}
-let set_ety st ety =
- if st.ety = None then {st with ety = ety} else st
-
-let add st entry intro ety =
- let st = set_ety st ety in
+let add st entry intro =
{st with context = entry :: st.context; intros = intro :: st.intros}
let test_depth st =
let defined_premise = "DEFINED"
-let assumed_premise = "ASSUMED"
-
let expanded_premise = "EXPANDED"
let convert st ?name v =
let ty = C.AImplicit ("", None) in
let name i = Printf.sprintf "%s%u" expanded_premise i in
let lambda i t = C.ALambda (id, C.Name (name i), ty, t) in
- let arg i n = T.mk_arel (n - i) (name i) in
+ let arg i n = T.mk_arel (n - i) (name (n - i - 1)) in
let rec aux i f a =
if i >= n then f, a else aux (succ i) (comp f (lambda i)) (arg i n :: a)
in
try
if st.intros = [] then script else
let count = List.length st.intros in
- let p0 = T.Whd (count, "") in
- let p1 = T.Intros (Some count, List.rev st.intros, "") in
- match st.ety with
- | Some ety when Cn.need_whd count ety -> p0 :: p1 :: script
- | _ -> p1 :: script
+ T.Intros (Some count, List.rev st.intros, "") :: script
with Invalid_argument _ -> failwith "A2P.mk_intros"
let rec mk_atomic st dtext what =
and mk_fwd_rewrite st dtext name tl direction =
let what, where = List.nth tl 5, List.nth tl 3 in
- let rewrite premise =
- let script, what = mk_atomic st dtext what in
- T.Rewrite (direction, what, Some (premise, name), dtext) :: script
- in
match where with
- | C.ARel (_, _, _, binder) -> rewrite binder
- | _ -> assert false
-
-(*
- assert (get_inner_sort st where = `Prop);
- let pred, old = List.nth tl 2, List.nth tl 1 in
- let pred_name = defined_premise in
- let pred_text = "extracted" in
- let p1 = T.LetIn (pred_name, pred, pred_text) in
- let cut_name = assumed_premise in
- let cut_type = C.AAppl ("", [T.mk_arel 0 pred_name; old]) in
- let cut_text = "" in
- let p2 = T.Cut (cut_name, cut_type, cut_text) in
- let qs = [rewrite cut_name; mk_proof (next st) where] in
- [T.Branch (qs, ""); p2; p1]
-*)
+ | C.ARel (_, _, _, premise) ->
+ let script, what = mk_atomic st dtext what in
+ T.Rewrite (direction, what, Some (premise, name), dtext) :: script
+ | _ -> assert false
+
and mk_fwd_proof st dtext name = function
| C.AAppl (_, hd :: tl) as v ->
if is_fwd_rewrite_right hd tl then mk_fwd_rewrite st dtext name tl true else
[T.LetIn (name, v, dtext)]
and mk_proof st = function
- | C.ALambda (_, name, v, t) as what ->
+ | C.ALambda (_, name, v, t) ->
let entry = Some (name, C.Decl (cic v)) in
let intro = get_intro name t in
- let ety = match get_inner_types st what with
- | Some (_, ety) -> Some ety
- | None -> None
- in
- mk_proof (add st entry intro ety) t
+ mk_proof (add st entry intro) t
| C.ALetIn (_, name, v, t) as what ->
let proceed, dtext = test_depth st in
let script = if proceed then
let entry = Some (name, C.Def (cic v, None)) in
let intro = get_intro name t in
- let q = mk_proof (next (add st entry intro None)) t in
+ let q = mk_proof (next (add st entry intro)) t in
List.rev_append (mk_fwd_proof st dtext intro v) q
else
[T.Apply (what, dtext)]
let mk_obj st = function
| C.AConstant (_, _, s, Some v, t, [], pars) when is_theorem pars ->
- let ast = mk_proof (set_ety st (Some t)) v in
+ let ast = mk_proof st v in
let count = T.count_steps 0 ast in
let text = Printf.sprintf "tactics: %u" count in
T.Theorem (s, t, text) :: ast @ [T.Qed ""]
max_depth = depth;
depth = 0;
context = [];
- intros = [];
- ety = None
+ intros = []
} in
HLog.debug "Level 2 transformation";
let steps = mk_obj st aobj in
| Rewrite of how * what * where * note
| Elim of what * using option * note
| Apply of what * note
- | Whd of count * note
| Change of inferred * what * where * note
| ClearBody of name * note
| Branch of step list list * note
let tactic = G.Apply (floc, t) in
mk_tactic tactic
-let mk_whd i =
- let pattern = None, [], Some hole in
- let tactic = G.Reduce (floc, `Whd, pattern) in
- mk_tactic tactic
-
let mk_change t where =
let pattern = match where with
| None -> None, [], Some hole
| Rewrite (b, t, w, s) -> mk_note s :: cont sep (mk_rewrite b t w :: a)
| Elim (t, xu, s) -> mk_note s :: cont sep (mk_elim t xu :: a)
| Apply (t, s) -> mk_note s :: cont sep (mk_apply t :: a)
- | Whd (c, s) -> mk_note s :: cont sep (mk_whd c :: a)
| Change (t, _, w, s) -> mk_note s :: cont sep (mk_change t w :: a)
| ClearBody (n, s) -> mk_note s :: cont sep (mk_clearbody n :: a)
| Branch ([], s) -> a