]> matita.cs.unibo.it Git - helm.git/blobdiff - helm/software/components/acic_procedural/acic2Procedural.ml
Procedural: bug fix in the procedural rendering of the abstraction
[helm.git] / helm / software / components / acic_procedural / acic2Procedural.ml
index 29b5677312874ccd2ebbf5e1f776261327aeb536..dd59d1f6e5305dfb74b04ea21dd7c035a21f62b1 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
@@ -241,56 +237,61 @@ 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
    | _                              -> []
 
-let mk_fwd_rewrite st dtext name tl direction t =   
+let mk_fwd_rewrite st dtext name tl direction v t ity =
+   let compare premise = function
+      | None   -> true
+      | Some s -> s = premise
+   in
    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 v ->
-         let where = Some (premise, name) in
-(*         let _script = convert_elim st ~name:(premise, i) t v e in *) 
-         let script = mk_arg st what @ mk_arg st v (* @ script *) in
-        let st = {st with context = Cn.clear st.context premise} in 
-        st, T.Rewrite (direction, what, where, e, dtext) :: script
+      | C.ARel (_, _, i, premise) as w ->
+(*         let _script = convert_elim st ~name:(premise, i) v w e in *) 
+         let script name =
+            let where = Some (premise, name) in
+           let script = mk_arg st what @ mk_arg st w (* @ script *) in
+           T.Rewrite (direction, what, where, e, dtext) :: script
+        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
+           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)]
       | _                         -> 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 rec proc_lambda st name v t =
-   let dno = DTI.does_not_occur 1 (H.cic t) in
-   let dno = dno && match get_inner_types st t with
-      | None          -> false
-      | Some (it, et) -> 
-         DTI.does_not_occur 1 (H.cic it) && DTI.does_not_occur 1 (H.cic et)
-   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 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 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
-   proc_proof (add st entry intro) t
+   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
@@ -300,9 +301,9 @@ and proc_letin st what name v w t =
          | Some (ity, _) ->
            let st, rqv = match v with
                | C.AAppl (_, hd :: tl) when is_fwd_rewrite_right hd tl ->
-                 mk_fwd_rewrite st dtext intro tl true v
+                 mk_fwd_rewrite st dtext intro tl true v t ity
               | C.AAppl (_, hd :: tl) when is_fwd_rewrite_left hd tl  ->
-                 mk_fwd_rewrite st dtext intro tl false v
+                 mk_fwd_rewrite st dtext intro tl false v t ity
               | v                                                     ->
                  let qs = [proc_proof (next st) v; [T.Id ""]] in
                  let ity = H.acic_bc st.context ity in
@@ -313,28 +314,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
@@ -385,12 +386,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 =
@@ -405,7 +406,7 @@ and proc_proof st t =
       {st with context = context; clears = clears; clears_note = note; }
    in
    match t with
-      | C.ALambda (_, name, w, t)           -> proc_lambda st name w t
+      | C.ALambda (_, name, w, t) as what   -> proc_lambda (f st) what name w t
       | C.ALetIn (_, name, v, w, t) as what -> proc_letin (f st) what name v w t
       | C.ARel _ as what                    -> proc_rel (f st) what
       | C.AMutConstruct _ as what           -> proc_mutconstruct (f st) what
@@ -466,7 +467,6 @@ let acic2procedural ~ids_to_inner_sorts ~ids_to_inner_types ?depth
       max_depth   = depth;
       depth       = 0;
       context     = [];
-      intros      = [];
       clears      = [];
       clears_note = "";
       case        = [];