| {A.annsynthesized = st; A.annexpected = Some et} -> Some (st, et)
| {A.annsynthesized = st; A.annexpected = None} -> Some (st, st)
with Not_found -> None
-with Invalid_argument _ -> failwith "A2P.get_inner_types"
+with Invalid_argument _ -> failwith "P2.get_inner_types"
let get_entry st id =
let rec aux = function
let anonymous_premise = C.Name "UNNAMED"
-let mk_exp_args hd tl classes synth =
+let mk_exp_args hd tl classes synth qs =
+ let exp = ref 0 in
let meta id = C.AImplicit (id, None) in
let map v (cl, b) =
- if I.overlaps synth cl && b then v else meta ""
+ if I.overlaps synth cl then
+ let w = if H.is_atomic (H.cic v) then v else meta "" in
+ if b then v, v else meta "", w
+ else
+ meta "", meta ""
in
- let rec aux b = function
- | [] -> b, []
+ let rec rev a = function
+ | [] -> a
| hd :: tl ->
- if hd = meta "" then aux true tl else b, List.rev (hd :: tl)
+ if snd hd <> meta "" then incr exp;
+ rev (snd hd :: a) tl
+ in
+ let rec aux = function
+ | [] -> []
+ | hd :: tl ->
+ if fst hd = meta "" then aux tl else rev [] (hd :: tl)
in
let args = T.list_rev_map2 map tl classes in
- let b, args = aux false args in
- if args = [] then b, hd else b, C.AAppl ("", hd :: args)
+ let args = aux args in
+ let part = !exp < List.length tl in
+ if args = [] then part, hd, qs else part, C.AAppl ("", hd :: args), qs
let mk_convert st ?name sty ety note =
let ppterm t =
let proceed, dtext = test_depth st in
let script = if proceed then
let st, hyp, rqv = match get_inner_types st what, get_inner_types st v with
- | Some (C.ALetIn _, _), _ ->
+ | Some (C.ALetIn (_, _, iv, iw, _), _), _ when
+ H.alpha_equivalence ~flatten:true st.context (H.cic v) (H.cic iv) &&
+ H.alpha_equivalence ~flatten:true st.context (H.cic w) (H.cic iw)
+ ->
st, C.Def (H.cic v, H.cic w), [T.Intros (Some 1, [intro], dtext)]
- | _, Some (ity, ety) ->
+ | _, Some (ity, ety) ->
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 ety
let diff = goal_arity - decurry in
if diff < 0 then
let text = Printf.sprintf "partial application: %i" diff in
+ prerr_endline ("Procedural 2: " ^ text);
[T.Exact (what, dtext ^ text)]
else
let classes = Cl.adjust st.context tl ?goal classes in
in
if List.length qs <> List.length names then
let qs = proc_bkd_proofs (next st) synth [] classes tl in
- let b, hd = mk_exp_args hd tl classes synth in
+ let b, hd, qs = mk_exp_args hd tl classes synth qs in
script @ [tactic b hd (dtext ^ text); T.Branch (qs, "")]
else if is_rewrite_right st hd then
script2 @ mk_rewrite st dtext where qs tl2 false what ety
| _ ->
let names = get_sub_names hd tl in
let qs = proc_bkd_proofs (next st) synth names classes tl in
- let b, hd = mk_exp_args hd tl classes synth in
+ let b, hd, qs = mk_exp_args hd tl classes synth qs in
script @ [tactic b hd (dtext ^ text); T.Branch (qs, "")]
else
[T.Exact (what, dtext)]