]> matita.cs.unibo.it Git - helm.git/blobdiff - helm/software/components/acic_procedural/acic2Procedural.ml
cicUtil : we added a context to is_sober to check for consistancy
[helm.git] / helm / software / components / acic_procedural / acic2Procedural.ml
index 4dd1bf192956edfd75777783e130b2b38f3fb684..a6e0667b05de904d64209c177889ea06b3f37daa 100644 (file)
@@ -51,7 +51,6 @@ type status = {
    max_depth: int option;
    depth: int;
    context: C.context;
-   intros: string option list;
    clears: string list;
    clears_note: string;
    case: int list;
@@ -88,12 +87,9 @@ let string_of_head = function
    | 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}
 
@@ -179,7 +175,7 @@ with Invalid_argument _ -> failwith "A2P.get_ind_names"
 
 (* 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
@@ -206,8 +202,8 @@ let mk_convert st ?name sty ety note =
         [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
@@ -241,16 +237,11 @@ let get_intro = function
    | 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
@@ -264,6 +255,7 @@ let mk_fwd_rewrite st dtext name tl direction v t ity =
    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 *) 
@@ -274,40 +266,35 @@ let mk_fwd_rewrite st dtext name tl direction v t ity =
         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
@@ -321,8 +308,9 @@ and proc_letin st what name v w t =
               | 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
@@ -330,28 +318,28 @@ and proc_letin st what name v w t =
            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
@@ -402,12 +390,12 @@ and proc_appl st what hd tl =
    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 =
@@ -483,7 +471,6 @@ let acic2procedural ~ids_to_inner_sorts ~ids_to_inner_types ?depth
       max_depth   = depth;
       depth       = 0;
       context     = [];
-      intros      = [];
       clears      = [];
       clears_note = "";
       case        = [];