if args = [] then b, hd else b, C.AAppl ("", hd :: args)
let mk_convert st ?name sty ety note =
+ let ppterm t =
+ let a = ref "" in Ut.pp_term (fun s -> a := !a ^ s) [] st.context t; !a
+ in
let e = Cn.hole "" in
let csty, cety = H.cic sty, H.cic ety in
- let script =
+ let note =
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 []
+ Printf.sprintf "%s: %s\nSINTH: %s\nEXP: %s"
+ note sname (ppterm csty) (ppterm cety)
+ else ""
in
- assert (Ut.is_sober st.context csty);
- assert (Ut.is_sober st.context cety);
- if Ut.alpha_equivalence csty cety then script else
+ if H.alpha_equivalence ~flatten:true st.context csty cety then [T.Note note] 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, "") :: script
+ | None -> [T.Change (sty, ety, None, e, note)]
| Some (id, i) ->
begin match get_entry st id with
- | C.Def _ -> assert false (* T.ClearBody (id, "") :: script *)
+ | C.Def _ ->
+ [T.Change (ety, sty, Some (id, Some id), e, note);
+ T.ClearBody (id, "")
+ ]
| C.Decl _ ->
- T.Change (ety, sty, Some (id, Some id), e, "") :: script
+ [T.Change (ety, sty, Some (id, Some id), e, note)]
end
let convert st ?name v =
let intro = get_intro name in
let proceed, dtext = test_depth st in
let script = if proceed then
- let st, hyp, rqv = match get_inner_types st v with
- | Some (ity, _) ->
+ let st, hyp, rqv = match get_inner_types st what, get_inner_types st v with
+ | Some (C.ALetIn _, _), _ ->
+ st, C.Def (H.cic v, H.cic w), [T.Intros (Some 1, [intro], dtext)]
+ | _, Some (ity, _) ->
let st, rqv = match v with
| C.AAppl (_, hd :: tl) when is_fwd_rewrite_right st hd tl ->
mk_fwd_rewrite st dtext intro tl true v t ity
st, [T.Branch (qs, ""); T.Cut (intro, ity, dtext)]
in
st, C.Decl (H.cic ity), rqv
- | None ->
+ | _, None ->
st, C.Def (H.cic v, H.cic w), [T.LetIn (intro, v, dtext)]
in
let entry = Some (name, hyp) in