]> matita.cs.unibo.it Git - helm.git/commitdiff
3 nasty bugs fixed:
authorEnrico Tassi <enrico.tassi@inria.fr>
Mon, 6 Oct 2008 15:02:12 +0000 (15:02 +0000)
committerEnrico Tassi <enrico.tassi@inria.fr>
Mon, 6 Oct 2008 15:02:12 +0000 (15:02 +0000)
- mk_restricted_irl has been duplicated
  - mk_restricted_irl generates an irl
  - mk_perforated_irl generates a restricted local context suitable for a new meta

- a wrong optimization in psubst was lifting of a bad amount

- force_does_not_occurr was not delifting rels to hypotheses to be cancelled

helm/software/components/ng_refiner/.depend.opt
helm/software/components/ng_refiner/check.ml
helm/software/components/ng_refiner/esempio.ma
helm/software/components/ng_refiner/nCicMetaSubst.ml
helm/software/components/ng_refiner/nCicUnification.ml

index b71e499a165043fbff379fae6975f2d046361b47..42a02ebf19445f9c6a7685c7f5caeadde71815b7 100644 (file)
@@ -2,7 +2,7 @@ nDiscriminationTree.cmo: nDiscriminationTree.cmi
 nDiscriminationTree.cmx: nDiscriminationTree.cmi 
 nCicMetaSubst.cmo: nCicMetaSubst.cmi 
 nCicMetaSubst.cmx: nCicMetaSubst.cmi 
-nCicUnification.cmo: nCicUnification.cmi 
-nCicUnification.cmx: nCicUnification.cmi 
+nCicUnification.cmo: nCicMetaSubst.cmi nCicUnification.cmi 
+nCicUnification.cmx: nCicMetaSubst.cmx nCicUnification.cmi 
 nCicRefiner.cmo: nCicRefiner.cmi 
 nCicRefiner.cmx: nCicRefiner.cmi 
index 6f1c9293a912f03a156b22a7819cf29377d71f0e..1da4002061b4f63779b139cfd167eba8327443f2 100644 (file)
@@ -208,25 +208,35 @@ let _ =
           let rec perforate ctx menv = function
             | NCic.Appl (NCic.Const (NReference.Ref (u,_))::ty::_)
               when NUri.string_of_uri u = "cic:/matita/tests/hole.con" ->
+                let menv, ty =  perforate ctx menv ty in
                 NCicMetaSubst.mk_meta menv ctx ty
             | t -> 
                 NCicUntrusted.map_term_fold_a
                  (fun e ctx -> e::ctx) ctx perforate menv t
           in
-          let ctx, ity = intros ty in
-          let menv, pty = perforate [] [] ty in
+          let ctx, pty = intros ty in
+          let menv, pty = perforate ctx [] pty in
 (*
           let sty, menv, _ = 
             NCicMetaSubst.saturate ~delta:max_int [] ctx ty 0
           in
 *)
 (*           let ctx, ty = intros ty in *)
+          let left, right = 
+            match  NCicReduction.whd ~delta:max_int ctx pty with
+            | NCic.Appl [eq;t;a;b] -> a, b
+            | _-> assert false
+          in
+               
+
+(*
           let whd ty =
             match ty with
             | NCic.Appl [eq;t;a;b] ->
                NCic.Appl [eq;t;NCicReduction.whd ~delta:0 ctx a;b]
             | t -> NCicReduction.whd ~delta:0 ctx t
           in
+*)
 (*
                 prerr_endline 
                  (Printf.sprintf "%s == %s"
@@ -236,25 +246,31 @@ let _ =
           let metasenv, subst = 
             try 
 (*                     prerr_endline ("INIZIO: " ^ NUri.string_of_uri u); *)
-              NCicUnification.unify menv [] ctx ity pty
+              NCicUnification.unify menv [] ctx left right
             with
             | NCicUnification.Uncertain msg 
             | NCicUnification.UnificationFailure msg 
             | NCicMetaSubst.MetaSubstFailure msg ->
                 prerr_endline (Lazy.force msg); 
-                prerr_endline 
-                 (Printf.sprintf "RESULT OF UNIF\n%s\n%s == %s\n"
-                 (NCicPp.ppcontext ~metasenv:menv ~subst:[] ctx)
-                 (NCicPp.ppterm ~metasenv:menv ~subst:[] ~context:ctx ity)
-                 (NCicPp.ppterm ~metasenv:menv ~subst:[] ~context:ctx pty));
                 [], []
             | Sys.Break -> [],[]
           in
-          if (NCicReduction.are_convertible ~subst ctx ity pty)
+          if (NCicReduction.are_convertible ~subst ctx left right)
           then
             prerr_endline ("OK: " ^ NUri.string_of_uri u)
           else
-            prerr_endline ("FAIL: " ^ NUri.string_of_uri u);
+            (prerr_endline ("FAIL: " ^ NUri.string_of_uri u);
+                prerr_endline 
+                 (Printf.sprintf 
+                   ("\t\tRESULT OF UNIF\n\nsubst:\n%s\nmenv:\n%s\n" ^^ 
+                   "context:\n%s\n%s == %s\n%s == %s\n")
+                 (NCicPp.ppsubst ~metasenv subst)
+                 (NCicPp.ppmetasenv ~subst metasenv)
+                 (NCicPp.ppcontext ~metasenv ~subst ctx)
+                 (NCicPp.ppterm ~metasenv ~subst:[] ~context:ctx left)
+                 (NCicPp.ppterm ~metasenv ~subst:[] ~context:ctx right)
+                 (NCicPp.ppterm ~metasenv ~subst ~context:ctx left)
+                 (NCicPp.ppterm ~metasenv ~subst ~context:ctx right) ))
           (*let inferred_ty = 
             NCicTypeChecker.typeof ~subst:[] ~metasenv:[] [] bo
           in*)
index e686e7eeef38c1669e74fe4b415de82c36091f8d..613448a61a1a59b18cde474687b6973c44a4395f 100644 (file)
@@ -16,8 +16,18 @@ include "nat/plus.ma".
 
 definition hole : ∀A:Type.A → A ≝ λA.λx.x.
 
+axiom foo: 
+  ∀P:Type.∀f:P→P→Prop.∀x:P.
+   (λw. ((∀e:P.f x (w x)) = (∀y:P. f x (hole ? y)))) 
+   (λw:P.hole ? w). (* OK *)
+   
+axiom foo: 
+  ∀P:Type.∀f:P→P→P.∀x,y:P. 
+    (λw.(f x (w x) = f x (w y))) (λw:P.hole ? w). (* OK, restringe Rel1 *)
+
+axiom foo: (λx,y.(λz. z (x+y) + z x) (λw:nat.hole ? w)) = λx,y.x. (* OK *)
 axiom foo: (λx,y.(λz. z x + z (x+y)) (λw:nat.hole ? w)) = λx,y.x. (* KO, delift rels only *) 
-axiom foo: (λx,y.(λz. z (x+y) + z x) (λw:nat.hole ? w)) = λx,y.x. (* OK *) 
 
 
 axiom foo: (λx,y.(λz. z x + z y) (λw:nat.hole ? w)) = λx,y.x. (* OK *) 
index 188d4dc207ff4bf8e4f47d4bf28d8407b12be214..967074a564fd0aaca79b44ea771cd2e0eae74fbf 100644 (file)
@@ -178,11 +178,22 @@ let pack_lc orig =
   | _ -> orig
 ;;
 
+
 let mk_restricted_irl shift len restrictions =
+  let rec aux n =
+    if n = 0 then 0 else
+     if List.mem (n+shift) restrictions then aux (n-1)
+     else 1+aux (n-1)
+  in
+    pack_lc (shift, NCic.Irl (aux len))
+;;
+
+
+let mk_perforated_irl shift len restrictions =
   let rec aux n =
     if n = 0 then [] else
-      if List.mem (n+shift) restrictions then aux (n-1)
-      else (NCic.Rel n)::aux (n-1)
+     if List.mem (n+shift) restrictions then aux (n-1)
+     else (NCic.Rel n) :: aux (n-1)
   in
     pack_lc (shift, NCic.Ctx (List.rev (aux len)))
 ;;
@@ -192,6 +203,11 @@ exception Occur;;
 let rec force_does_not_occur metasenv subst restrictions t =
  let rec aux k ms = function
     | NCic.Rel r when List.mem (r - k) restrictions -> raise Occur
+    | NCic.Rel r as orig ->
+        let amount = 
+          List.length (List.filter (fun x -> x < r - k) restrictions) 
+        in
+        if amount > 0 then ms, NCic.Rel (r - amount) else ms, orig
     | NCic.Meta (n, l) as orig ->
        (* we ignore the subst since restrict will take care of already
         * instantiated/restricted metavariabels *)
@@ -272,7 +288,7 @@ and restrict metasenv subst i restrictions =
           force_does_not_occur metasenv subst restrictions bo in
         let j = newmeta () in
         let subst_entry_j = j, (name, newctx, newty, newbo) in
-        let reloc_irl = mk_restricted_irl 0 (List.length ctx) restrictions in
+        let reloc_irl = mk_perforated_irl 0 (List.length ctx) restrictions in
         let subst_entry_i = i, (name, ctx, NCic.Meta (j, reloc_irl), ty) in
         metasenv,
         subst_entry_j :: List.map 
@@ -295,7 +311,12 @@ and restrict metasenv subst i restrictions =
           force_does_not_occur metasenv subst restrictions ty in
         let j = newmeta () in
         let metasenv_entry = j, (name, newctx, newty) in
-        let reloc_irl = mk_restricted_irl 0 (List.length ctx) restrictions in
+          prerr_endline ("restricting ?" ^ string_of_int i ^ " to ?" ^ 
+            string_of_int j ^ " : " ^ NCicPp.ppterm ~metasenv ~context:newctx
+            ~subst newty ^" in a shorter context:\n" ^
+            NCicPp.ppcontext ~metasenv ~subst newctx);
+        let reloc_irl = 
+          mk_perforated_irl 0 (List.length ctx) restrictions in
         let subst_entry = i, (name, ctx, NCic.Meta (j, reloc_irl), ty) in
         List.map 
           (fun (n,_) as orig -> if i = n then metasenv_entry else orig) 
@@ -354,7 +375,7 @@ let delift metasenv subst context n l t =
                      restrict metasenv subst i restrictions 
                   in
                   (metasenv, subst), 
-                  NCic.Meta(newmeta, mk_restricted_irl shift1 len1 restrictions)
+                  NCic.Meta(newmeta, mk_perforated_irl shift1 len1 restrictions)
               | NCic.Irl _, NCic.Irl _ when shift = 0 -> ms, orig
               | NCic.Irl _, NCic.Irl _ ->
                    ms, NCic.Meta (i, (shift1 - shift, lc1))
@@ -371,6 +392,8 @@ let delift metasenv subst context n l t =
                         | NotInTheList | MetaSubstFailure _ -> ms, j::tbr, tl
                   in
                   let (metasenv, subst), to_be_r, lc1' = deliftl [] 1 ms lc1 in
+                  prerr_endline ("TO BE RESTRICTED: " ^ 
+                   (String.concat "," (List.map string_of_int to_be_r)));
                   let l1 = pack_lc (shift, NCic.Ctx lc1') in
                   if to_be_r = [] then
                     (metasenv, subst), 
index fcc0b953e70ad9f50c6dd3a8f144867bf1261fbb..d4a136597f4d731778bf85341a76e64aa83ee1eb 100644 (file)
@@ -171,7 +171,7 @@ and instantiate test_eq_only metasenv subst context n lc t swap =
      * we could ? := Type_j with j <= i... *)
     let subst = (n, (name, ctx, t, ty)) :: subst in
     pp ("?"^string_of_int n^" := "^NCicPp.ppterm
-      ~metasenv ~subst ~context:ctx t);
+      ~metasenv ~subst ~context:ctx (NCicSubstitution.subst_meta lc t));
     let metasenv = 
       List.filter (fun (m,_) -> not (n = m)) metasenv 
     in