]> matita.cs.unibo.it Git - helm.git/commitdiff
we started the support for the coercions "alle" and "alli"
authorFerruccio Guidi <ferruccio.guidi@unibo.it>
Wed, 17 Dec 2008 19:49:35 +0000 (19:49 +0000)
committerFerruccio Guidi <ferruccio.guidi@unibo.it>
Wed, 17 Dec 2008 19:49:35 +0000 (19:49 +0000)
helm/software/lambda-delta/Makefile
helm/software/lambda-delta/automath/autItem.ml
helm/software/lambda-delta/basic_ag/bagReduction.ml
helm/software/lambda-delta/basic_ag/bagReduction.mli
helm/software/lambda-delta/basic_ag/bagType.ml

index 3b212fa941bdc8ed96d47d7c9d0e451c236f5308..cad9761020a3489d55a3a9857add3f20b3793faf 100644 (file)
@@ -10,7 +10,7 @@ include Makefile.common
 
 test: $(MAIN).opt
        @echo "  HELENA automath/*.aut"
-       $(H)./$(MAIN).opt -S 3 automath/*.aut > log.txt
+       $(H)./$(MAIN).opt -S 3 $(O) automath/*.aut > log.txt
 
 meta: $(MAIN).opt
        @echo "  HELENA -m meta.txt automath/*.aut"
index 19d4e1af14641d0479504ef1844fb61b79fa2c1d..cda1d1c279162685a23ad52378bf978956cfeebb 100644 (file)
@@ -23,6 +23,8 @@ let mp = uri "/l/mp"
 
 let mt = uri "/l/mt"
 
-let con = uri "/l/con"
+let all = uri "/l/all"
 
-let not = uri "/l/not"
+let alle = uri "/l/alle"
+
+let alli = uri "/l/alli"
index 0ec3d2c2bc89f349581d6f2f9f5d580e7162aec5..279ca072f1a38b5b9db5fbf96d7b956a562a1810 100644 (file)
@@ -21,6 +21,7 @@ module S = BagSubstitution
 exception LRefNotFound of B.message
 
 type machine = {
+   i: int;
    c: B.context;
    s: B.term list
 }
@@ -33,23 +34,26 @@ type whd_result =
 
 type ho_whd_result =
    | Sort of int
+   | GRef of U.uri * B.term list
    | Abst of B.term
 
 type ac_result = (int * NUri.uri * Bag.term list) list option
 
 (* Internal functions *******************************************************)
 
+let term_of_whdr = function
+   | Sort_ h             -> B.Sort h
+   | LRef_ (i, _)        -> B.LRef i
+   | GRef_ (_, uri, _)   -> B.GRef uri
+   | Bind_ (l, id, w, t) -> B.bind_abst l id w t
+
 let level = 5
 
 let error i = raise (LRefNotFound (L.items1 (string_of_int i)))
 
-let empty_machine = {c = B.empty_context; s = []}
-
-let contents f c m =
-   let f gl ges = B.contents (f gl ges) m.c in
-   B.contents f c
+let empty_machine = {i = 0; c = B.empty_context; s = []}
 
-let unwind_to_context f c m = B.append f c m.c
+let inc m = {m with i = succ m.i}
 
 let unwind_to_term f m t =
    let map f t (l, id, b) = f (B.Bind (l, id, b, t)) in
@@ -66,7 +70,7 @@ let get f c m i =
       | None        -> error i
    in
    let f c = B.get f c i in
-   unwind_to_context f c m
+   B.append f c m.c
 
 let push f c m l id w = 
    assert (m.s = []);
@@ -92,7 +96,7 @@ let rec whd f c m x = match x with
       begin match m.s with
          | []      -> f m (Bind_ (l, id, w, t))
         | v :: tl -> 
-           let f mc = whd f c {c = mc; s = tl} t in
+           let f mc = whd f c {m with c = mc; s = tl} t in
            B.push f m.c l id (B.Abbr (B.Cast (w, v)))
       end
    | B.Bind (l, id, b, t)         -> 
@@ -107,24 +111,34 @@ let insert f i uri vs = function
 
 let rec ho_whd f c m x =
    let aux m = function
-      | Sort_ h                -> f c (Sort h)
-      | Bind_ (_, _, w, _)     -> 
-         let f c = f c (Abst w) in unwind_to_context f c m
-      | LRef_ (_, Some w)      -> ho_whd f c m w
-      | GRef_ (_, _, B.Abst u) -> ho_whd f c m u
-      | GRef_ (_, _, B.Abbr t) -> ho_whd f c m t
-      | LRef_ (_, None)        -> assert false
-      | GRef_ (_, _, B.Void)   -> assert false
+      | Sort_ h                  -> f (Sort h)
+      | Bind_ (_, _, w, _)       -> 
+         let f w = f (Abst w) in unwind_to_term f m w
+      | LRef_ (_, Some w)        -> ho_whd f c m w
+      | GRef_ (_, uri, B.Abst w) -> 
+         let f = function 
+           | Abst _ as r -> f r 
+           | GRef _ as r -> f r
+           | Sort _      ->
+              let f vs = f (GRef (uri, vs)) in unwind_stack f m
+        in
+        ho_whd f c m w
+      | GRef_ (_, _, B.Abbr v)   -> ho_whd f c m v
+      | LRef_ (_, None)          -> assert false
+      | GRef_ (_, _, B.Void)     -> assert false
    in
    whd aux c m x
    
 let ho_whd f c t =
-   let f c r = L.unbox level; f c r in
+   let f r = L.unbox level; f r in
    L.box level; L.log O.specs level (L.ct_items1 "Now scanning" c t);
    ho_whd f c empty_machine t
 
 let rec are_convertible f xl c m1 t1 m2 t2 =
-   let rec aux m1 r1 m2 r2 = match r1, r2 with
+   let rec aux m1 r1 m2 r2 =
+   let u, t = term_of_whdr r1, term_of_whdr r2 in
+   L.log O.specs level (L.ct_items2 "Now really converting" c u "and" c t);   
+   match r1, r2 with
       | Sort_ h1, Sort_ h2                                 -> 
          if h1 = h2 then f xl else f None
       | LRef_ (i1, _), LRef_ (i2, _)                       ->
@@ -141,14 +155,18 @@ let rec are_convertible f xl c m1 t1 m2 t2 =
         whd (aux_rev m2 r2) c m1 v1      
       | Bind_ (l1, id1, w1, t1), Bind_ (l2, id2, w2, t2)   ->
          let f xl =
-           let h c = S.subst (are_convertible f xl c m1 t1 m2) l1 l2 t2 in
+           let h c =
+              let m1, m2 = inc m1, inc m2 in
+              S.subst (are_convertible f xl c m1 t1 m2) l1 l2 t2
+           in
             if xl = None then f xl else push h c m1 l1 id1 w1
         in
         are_convertible f xl c m1 w1 m2 w2
 (* we detect the AUT-QE reduction rule for type/prop inclusion *)      
-      | GRef_ (_, uri, B.Abst _), Bind_ (l2, _, _, _)      ->
-         let g vs = insert f l2 uri vs xl in
+      | GRef_ (_, uri, B.Abst _), Bind_ (l1, _, _, _)      ->
+         let g vs = insert f l1 uri vs xl in
         if U.eq uri I.imp then unwind_stack g m1 else 
+        if U.eq uri I.all then unwind_stack g m1 else
         begin L.warn (U.string_of_uri uri); f None end
       | _                                                  -> f None
    and aux_rev m2 r2 m1 r1 = aux m1 r1 m2 r2 in
index ed7ae1792b0b64e6ac78edbb7d31d1b40b17fa7f..1425b4e284b7951805cc5755f1bbdce66ec663b3 100644 (file)
@@ -14,12 +14,13 @@ exception LRefNotFound of Bag.message
 
 type ho_whd_result =
    | Sort of int
+   | GRef of NUri.uri * Bag.term list
    | Abst of Bag.term
 
 type ac_result = (int * NUri.uri * Bag.term list) list option
 
 val ho_whd: 
-   (Bag.context -> ho_whd_result -> 'a) -> Bag.context -> Bag.term -> 'a
+   (ho_whd_result -> 'a) -> Bag.context -> Bag.term -> 'a
 
 val are_convertible:
    (ac_result -> 'a) -> Bag.context -> Bag.term -> Bag.term -> 'a
index 80b883ff44612101b47dcead611ef55aa88b438a..8aee519202eac11501752fb8b2c75c0ee3e56dc7 100644 (file)
@@ -55,6 +55,7 @@ let add_coercion f t (i, uri, vs) =
          add f v
       | B.Bind (l, _, _, _) when i = l -> 
          if U.eq uri I.imp then f (mk_gref I.mt (vs @ [x])) else
+         if U.eq uri I.all then f (mk_gref I.alli (vs @ [x])) else
         assert false
       | B.Bind (l, id, B.Abst w, t)    ->
          let f ww =
@@ -128,35 +129,41 @@ let rec b_type_of f g c x =
       let f cc = b_type_of f g cc t in
       B.push f c l id B.Void   
    | B.Appl (v, t)            ->
-      let h xv vv xt tt cc = function
-         | R.Sort _ -> error1 "not a function" c xt
-        | R.Abst w -> 
+      let f xv vv xt tt = function
+        | R.Abst w                             -> 
             L.box (succ level);
-           L.log O.specs (succ level) (L.ct_items1 "Just scanned" cc w);
+           L.log O.specs (succ level) (L.ct_items1 "Just scanned" c w);
            L.unbox (succ level);
            let f = function
-              | Some l -> f (S.sh2 v xv t xt x B.appl) (B.appl xv tt)
-              | None   -> error2 "the term" cc xv "must be of type" cc w
+               | Some [] -> f (S.sh2 v xv t xt x B.appl) (B.appl xv tt)
+              | Some l  ->
+                 L.log O.specs level (L.items1 "Rechecking coerced term");
+                 let f xv = b_type_of f g c (S.sh2 v xv t xt x B.appl) in
+                 add_coercions f xv l
+              | None   -> error2 "The term" c xv "must be of type" c w
            in
-           R.are_convertible f cc w vv     
-      in
-      let f xv vv xt = function
-(* inserting a missing "modus ponens" *)      
-         | B.Appl (y2, B.Appl (y1, B.GRef uri)) when U.eq uri I.imp ->
-            b_type_of f g c (mk_gref I.mp [y1; y2; xv; xt])
-         | B.Appl (y1, B.GRef uri) when U.eq uri I.not ->
-            b_type_of f g c (mk_gref I.mp [y1; B.GRef I.con; xv; xt])   
-        | tt -> R.ho_whd (h xv vv xt tt) c tt
+           R.are_convertible f c w vv
+(* inserting a missing "modus ponens" *)
+        | R.GRef (uri, vs) when U.eq uri I.imp ->
+           L.log O.specs level (L.items1 "Rechecking coerced term");
+           b_type_of f g c (mk_gref I.mp (vs @ [xv; xt]))
+        | R.GRef (uri, vs) when U.eq uri I.all ->
+           L.log O.specs level (L.items1 "Rechecking coerced term");
+           b_type_of f g c (mk_gref I.alle (vs @ [xv; xt]))
+         | _                                    -> 
+           error1 "not a function" c xt
       in
+      let f xv vv xt tt = R.ho_whd (f xv vv xt tt) c tt in
       let f xv vv = b_type_of (f xv vv) g c t in
       type_of f g c v
    | B.Cast (u, t)            ->
       let f xu xt = function 
          | Some [] -> f (S.sh2 u xu t xt x B.cast) xu
         | Some l  ->
-           let f xt = type_of f g c (S.sh2 u xu t xt x B.cast) in
+           L.log O.specs level (L.items1 "Rechecking coerced term");
+           let f xt = b_type_of f g c (S.sh2 u xu t xt x B.cast) in
            add_coercions f xt l
-        | None    -> error2 "the term" c xt "must be of type" c xu
+        | None    -> error2 "The term" c xt "must be of type" c xu
       in
       let f xu xt tt = R.are_convertible (f xu xt) c xu tt in
       let f xu _ = b_type_of (f xu) g c t in