]> matita.cs.unibo.it Git - helm.git/commitdiff
- Coq/preamble: missing alias added
authorFerruccio Guidi <ferruccio.guidi@unibo.it>
Tue, 17 Feb 2009 19:37:22 +0000 (19:37 +0000)
committerFerruccio Guidi <ferruccio.guidi@unibo.it>
Tue, 17 Feb 2009 19:37:22 +0000 (19:37 +0000)
- nUri: head comment fixed
- Procedural: the cases tactic is now detected and generated
              but does not compile :))
- grafiteAstPp: output syntax of the cases tactic fixed
- grafiteParser: impovement in the code for the elim tactic

13 files changed:
helm/software/components/acic_procedural/acic2Procedural.ml
helm/software/components/acic_procedural/proceduralClassify.ml
helm/software/components/acic_procedural/proceduralClassify.mli
helm/software/components/acic_procedural/proceduralHelpers.ml
helm/software/components/acic_procedural/proceduralHelpers.mli
helm/software/components/acic_procedural/proceduralOptimizer.ml
helm/software/components/acic_procedural/proceduralOptimizer.mli
helm/software/components/acic_procedural/proceduralTypes.ml
helm/software/components/acic_procedural/proceduralTypes.mli
helm/software/components/grafite/grafiteAstPp.ml
helm/software/components/grafite_parser/grafiteParser.ml
helm/software/components/ng_kernel/nUri.ml
helm/software/matita/contribs/procedural/Coq/preamble.ma

index b65d131e6a158f8af5d0ccfd495f1e2d96bb40b2..ae64d1f19af4c904e804cd3dd3fd48001c525d9b 100644 (file)
@@ -174,6 +174,19 @@ let get_sub_names head l =
 
 let get_type msg st t = H.get_type msg st.context (H.cic t) 
 
+let clear_absts m =
+   let rec aux k n = function
+      | C.ALambda (id, s, v, t) when k > 0 -> 
+         C.ALambda (id, s, v, aux (pred k) n t)
+      | C.ALambda (_, _, _, t) when n > 0 -> 
+         aux 0 (pred n) (Cn.lift 1 (-1) t)
+      | t                  when n > 0 ->
+         Printf.eprintf "A2P.clear_absts: %u %s\n" n (Pp.ppterm (H.cic t));
+         assert false
+      | t                             -> t
+   in 
+   aux m
+
 (* proof construction *******************************************************)
 
 let anonymous_premise = C.Name "UNNAMED"
@@ -380,6 +393,26 @@ and proc_appl st what hd tl =
    in
    mk_preamble st what script
 
+and proc_case st what uri tyno u v ts =
+   let proceed, dtext = test_depth st in
+   let script = if proceed then
+      let synth, classes = I.S.empty, Cl.make ts in
+      let names = H.get_ind_names uri tyno in
+      let qs = proc_bkd_proofs (next st) synth names classes ts in
+      let lpsno, _ = H.get_ind_type uri tyno in
+      let ps, sort_disp = H.get_ind_parameters st.context (H.cic v) in
+      let _, rps = HEL.split_nth lpsno ps in
+      let rpsno = List.length rps in   
+      let predicate = clear_absts rpsno (1 - sort_disp) u in
+      let e = Cn.mk_pattern rpsno predicate in
+      let text = "" in
+      let script = List.rev (mk_arg st v) in
+      script @ [T.Cases (v, e, dtext ^ text); T.Branch (qs, "")]   
+   else
+      [T.Apply (what, dtext)]
+   in
+   mk_preamble st what script
+
 and proc_other st what =
    let _, dtext = test_depth st in
    let text = Printf.sprintf "%s: %s" "UNEXPANDED" (string_of_head what) in
@@ -398,13 +431,14 @@ and proc_proof st t =
       {st with context = context}
    in
    match t with
-      | 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
-      | C.AConst _ as what                  -> proc_const (f st) what
-      | C.AAppl (_, hd :: tl) as what       -> proc_appl (f st) what hd tl
-      | what                                -> proc_other (f st) what
+      | 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
+      | C.AConst _ as what                       -> proc_const (f st) what
+      | C.AAppl (_, hd :: tl) as what            -> proc_appl (f st) what hd tl
+      | C.AMutCase (_, uri, i, u, v, ts) as what -> proc_case (f st) what uri i u v ts
+      | what                                     -> proc_other (f st) what
 
 and proc_bkd_proofs st synth names classes ts =
 try 
index 981acc969678302644d591be5bbe540702accd36..53c363a428372c447284c5c3f5654dbc2cd69f4b 100644 (file)
@@ -56,6 +56,12 @@ let out_table b =
    Array.iteri map b;
    prerr_newline ()
 
+(* dummy dependences ********************************************************)
+
+let make l =
+   let map _ = I.S.empty, false in
+   List.rev_map map l
+
 (* classification ***********************************************************)
 
 let classify_conclusion vs = 
index 6a93a1fdaaad4b4d0ac1a3b79a728135590e9aac..d4662764e850a2312116a52427fe5a2c44fd1404 100644 (file)
@@ -27,6 +27,8 @@ type dependences = (CicInspect.S.t * bool) list
 
 type conclusion = (int * int * UriManager.uri * int) option
 
+val make: 'a list -> dependences
+
 val classify: Cic.context -> Cic.term -> dependences * conclusion
 
 val adjust: Cic.context -> Cic.annterm list -> ?goal:Cic.term -> dependences -> dependences
index 5807e185ae6a4bb2e2313b8a0c36fc9878c9eed3..a9fa6473f280ac7e12fc50422181b99cf0a248cf 100644 (file)
@@ -127,12 +127,15 @@ let get_tail c t =
       | (_, hd) :: _, _ -> hd
       | _               -> assert false
 
-let is_proof c t =
-   match get_tail c (get_type "is_proof 1" c (get_type "is_proof 2" c t)) with
+let is_prop c t =
+   match get_tail c (get_type "is_prop" c t) with
       | C.Sort C.Prop -> true
       | C.Sort _      -> false
       | _             -> assert false 
 
+let is_proof c t =
+   is_prop c (get_type "is_prop" c t)
+
 let is_sort = function
    | C.Sort _ -> true
    | _        -> false 
index 69df6d79769d87e1d9eb9776aa8d4402418bb05d..6d4ef50da0bae3a7a135f9af1397644e1ca357cc 100644 (file)
@@ -41,6 +41,8 @@ val refine:
    Cic.context -> Cic.term -> Cic.term
 val get_type:
    string -> Cic.context -> Cic.term -> Cic.term
+val is_prop:
+   Cic.context -> Cic.term -> bool
 val is_proof:
    Cic.context -> Cic.term -> bool
 val is_sort:
index f1840cf7c95c75cf37877712fdfa70fdb66caa34..a05bbd26d8df836d422b6fee82dd838b44840281 100644 (file)
@@ -209,8 +209,14 @@ and opt_mutcase_critical g st es c uri tyno outty arg cases =
    opt_proof g (info st "Optimizer: remove 3") es c x
 
 and opt_mutcase_plain g st es c uri tyno outty arg cases =
-   let g st v ts = g st (C.MutCase (uri, tyno, outty, v, ts)) in
-   g st arg cases
+   let g st v =
+      let g (st, ts) = g st (C.MutCase (uri, tyno, outty, v, ts)) in
+      let map h v (st, vs) =
+         let h st vv = h (st, vv :: vs) in opt_proof h st es c v
+      in
+      if es then H.list_fold_right_cps g map cases (st, []) else g (st, cases)
+   in
+   if es then opt_proof g st es c arg else g st arg
 
 and opt_mutcase g =
    if !critical then opt_mutcase_critical g else opt_mutcase_plain g 
index 1e7bdada259d1100ee5146beaa34402812f0641a..522860df3ab2835e1e07ead9d73b0a7bb94752ef 100644 (file)
@@ -27,4 +27,6 @@ val optimize_obj: Cic.obj -> Cic.obj * string
 
 val optimize_term: Cic.context -> Cic.term -> Cic.term * string
 
+val critical: bool ref
+
 val debug: bool ref
index b194fbfa9fd9f5afce2bfa3f6384ec6d660ab85c..3b6afc4c31ac0d54f18d58613c583311801e199d 100644 (file)
@@ -79,6 +79,7 @@ type step = Note of note
          | LetIn of name * what * note
          | Rewrite of how * what * where * pattern * note
          | Elim of what * using option * pattern * note
+         | Cases of what * pattern * note
          | Apply of what * note
          | Change of inferred * what * where * pattern * note 
          | Clear of hyp list * note
@@ -194,6 +195,11 @@ let mk_elim what using pattern punctation =
    let tactic = G.Elim (floc, what, using, pattern, (Some 0, [])) in
    mk_tactic tactic punctation
 
+let mk_cases what pattern punctation =
+   let pattern = None, [], Some pattern in
+   let tactic = G.Cases (floc, what, pattern, (Some 0, [])) in
+   mk_tactic tactic punctation
+
 let mk_apply t punctation =
    let tactic = G.ApplyP (floc, t) in
    mk_tactic tactic punctation
@@ -239,6 +245,7 @@ let rec render_step sep a = function
    | LetIn (n, t, s)           -> mk_letin n t sep :: mk_tacnote s a
    | Rewrite (b, t, w, e, s)   -> mk_rewrite b t w e sep :: mk_tacnote s a
    | Elim (t, xu, e, s)        -> mk_elim t xu e sep :: mk_tacnote s a
+   | Cases (t, e, s)           -> mk_cases t e sep :: mk_tacnote s a
    | Apply (t, s)              -> mk_apply t sep :: mk_tacnote s a
    | Change (t, _, w, e, s)    -> mk_change t w e sep :: mk_tacnote s a
    | Clear (ns, s)             -> mk_clear ns sep :: mk_tacnote s a
@@ -287,6 +294,7 @@ let rec count_node a = function
    | Apply (t, _)            -> I.count_nodes a (H.cic t)
    | Rewrite (_, t, _, p, _)
    | Elim (t, _, p, _)
+   | Cases (t, p, _)
    | Change (t, _, _, p, _)  -> 
       let a = I.count_nodes a (H.cic t) in
       I.count_nodes a (H.cic p) 
index 3cc482a8ca9fe9faa6d09d971c46126200c2e198..aa6ad3aa58ffa9fbe4ee3e57ccc01b2d3efbe07b 100644 (file)
@@ -58,6 +58,7 @@ type step = Note of note
          | LetIn of name * what * note
          | Rewrite of how * what * where * pattern * note
          | Elim of what * using option * pattern * note
+         | Cases of what * pattern * note
          | Apply of what * note
          | Change of inferred * what * where * pattern * note 
          | Clear of hyp list * note
index 9e3ea3b5a91bc8c6f299609d9d400c8b36a90f84..1fdc87b416b367861d3d6af32fb5b06247b7f769 100644 (file)
@@ -121,9 +121,11 @@ let rec pp_tactic ~map_unicode_to_tex ~term_pp ~lazy_term_pp =
   | AutoBatch (_,params) -> "autobatch " ^ 
       pp_auto_params ~term_pp params
   | Assumption _ -> "assumption"
-  | Cases (_, term, pattern, specs) -> Printf.sprintf "cases " ^ term_pp term ^
-      pp_tactic_pattern pattern ^
-      pp_intros_specs "names " specs 
+  | Cases (_, term, pattern, specs) -> 
+      Printf.sprintf "cases %s %s%s" 
+      (term_pp term)
+      (pp_tactic_pattern pattern)
+      (pp_intros_specs "names " specs)
   | Change (_, where, with_what) ->
       Printf.sprintf "change %s with %s" (pp_tactic_pattern where) (lazy_term_pp with_what)
   | Clear (_,ids) -> Printf.sprintf "clear %s" (pp_hyps ids)
index 4da1d4477a405c92f7b42d22d10bdf4861ec0823..44dec6d32bf6adfc4aef459977bb26c861fe26cb 100644 (file)
@@ -227,12 +227,12 @@ EXTEND
         GrafiteAst.Destruct (loc, xts)
     | IDENT "elim"; what = tactic_term; using = using; 
        pattern = OPT pattern_spec;
-       (num, idents) = intros_spec ->
+       ispecs = intros_spec ->
         let pattern = match pattern with
            | None         -> None, [], Some Ast.UserInput
            | Some pattern -> pattern   
         in
-        GrafiteAst.Elim (loc, what, using, pattern, (num, idents))
+        GrafiteAst.Elim (loc, what, using, pattern, ispecs)
     | IDENT "elimType"; what = tactic_term; using = using;
       (num, idents) = intros_spec ->
         GrafiteAst.ElimType (loc, what, using, (num, idents))
index 5924036845b7a74db28f8fdd8c5b5762498fdee2..e94ee90372cc095dd297fd4db7831c46e42076af 100644 (file)
@@ -5,8 +5,8 @@
     ||I||                                                                
     ||T||  HELM is free software; you can redistribute it and/or         
     ||A||  modify it under the terms of the GNU General Public License   
-    \   /  version 2 or (at your option) any later version.      
-     \ /   This software is distributed as is, NO WARRANTY.     
+    \   /  version 2 or (at your option) any later version.              
+     \ /   This software is distributed as is, NO WARRANTY.              
       V_______________________________________________________________ *)
 
 (* $Id$ *)
index 04d88dc07bf12e93dd654841e619709c635caebb..6e26169d5d1e9ac24f2bd3691a8703a7905d3b53 100644 (file)
@@ -41,3 +41,5 @@ theorem f_equal1 : \forall A,B:Type.\forall f:A\to B.\forall x,y:A.
   apply cic:/Coq/Init/Logic/f_equal.con.
   assumption.
 qed.
+
+alias id "land" = "cic:/matita/procedural/Coq/Init/Logic/and.ind#xpointer(1/1)".