X-Git-Url: http://matita.cs.unibo.it/gitweb/?a=blobdiff_plain;f=helm%2Fsoftware%2Flambda-delta%2Fbasic_ag%2FbagReduction.ml;fp=helm%2Fsoftware%2Flambda-delta%2Fbasic_ag%2FbagReduction.ml;h=4e147ae6d247f5fb6b34faddd07ab598098a8e9b;hb=94c6cfe7e6b833190904c6b546668d716978a812;hp=fc1efcd775000d784810b0a6dc3394354322aeef;hpb=29cfb9e2961e62c836cb50217905c0594a074e81;p=helm.git diff --git a/helm/software/lambda-delta/basic_ag/bagReduction.ml b/helm/software/lambda-delta/basic_ag/bagReduction.ml index fc1efcd77..4e147ae6d 100644 --- a/helm/software/lambda-delta/basic_ag/bagReduction.ml +++ b/helm/software/lambda-delta/basic_ag/bagReduction.ml @@ -17,7 +17,7 @@ module O = BagOutput module E = BagEnvironment module S = BagSubstitution -exception LRefNotFound of B.message +exception TypeError of B.message type machine = { i: int; @@ -45,15 +45,17 @@ let term_of_whdr = function let level = 5 -let error i = raise (LRefNotFound (L.items1 (string_of_int i))) +let error i = + let s = Printf.sprintf "local reference not found %u" i in + raise (TypeError (L.items1 s)) let log1 s c t = let sc, st = s ^ " in the context", "the term" in L.log O.specs level (L.ct_items1 sc c st t) -let log2 s c u t = - let sc, su, st = s ^ " in the context", "the term", "and the term" in - L.log O.specs level (L.ct_items2 sc c su u st t) +let log2 s cu u ct t = + let s1, s2, s3 = s ^ " in the context", "the term", "and in the context" in + L.log O.specs level (L.ct_items2 s1 cu s2 u s3 ct s2 t) let empty_machine = {i = 0; c = B.empty_context; s = []} @@ -113,8 +115,6 @@ let rec whd f c m x = (* Interface functions ******************************************************) -let nsi = ref false - let rec ho_whd f c m x = (* L.warn "entering R.ho_whd"; *) let aux m = function @@ -134,23 +134,25 @@ let ho_whd f c t = L.box level; log1 "Now scanning" c t; ho_whd f c empty_machine t -let rec are_convertible f a c m1 t1 m2 t2 = +let rec are_convertible f ~si a c m1 t1 m2 t2 = (* L.warn "entering R.are_convertible"; *) let rec aux m1 r1 m2 r2 = (* L.warn "entering R.are_convertible_aux"; *) let u, t = term_of_whdr r1, term_of_whdr r2 in - log2 "Now really converting" c u t; + log2 "Now really converting" c u c t; match r1, r2 with | Sort_ h1, Sort_ h2 -> if h1 = h2 then f a else f false | LRef_ (i1, _), LRef_ (i2, _) -> - if i1 = i2 then are_convertible_stacks f a c m1 m2 else f false + if i1 = i2 then are_convertible_stacks f ~si a c m1 m2 else f false | GRef_ (a1, _, B.Abst _), GRef_ (a2, _, B.Abst _) -> - if a1 = a2 then are_convertible_stacks f a c m1 m2 else f false + if a1 = a2 then are_convertible_stacks f ~si a c m1 m2 else f false | GRef_ (a1, _, B.Abbr v1), GRef_ (a2, _, B.Abbr v2) -> if a1 = a2 then - let f a = if a then f a else are_convertible f true c m1 v1 m2 v2 in - are_convertible_stacks f a c m1 m2 + let f a = + if a then f a else are_convertible f ~si true c m1 v1 m2 v2 + in + are_convertible_stacks f ~si a c m1 m2 else if a1 < a2 then whd (aux m1 r1) c m2 v2 else whd (aux_rev m2 r2) c m1 v1 @@ -162,25 +164,25 @@ let rec are_convertible f a c m1 t1 m2 t2 = let l = B.new_location () in let h c = let m1, m2 = inc m1, inc m2 in - let f t1 = S.subst (are_convertible f a c m1 t1 m2) l l2 t2 in + let f t1 = S.subst (are_convertible f ~si a c m1 t1 m2) l l2 t2 in S.subst f l l1 t1 in let f r = if r then push "!" h c m1 l id1 w1 else f false in - are_convertible f a c m1 w1 m2 w2 + are_convertible f ~si a c m1 w1 m2 w2 (* we detect the AUT-QE reduction rule for type/prop inclusion *) - | Sort_ _, Bind_ (l2, id2, w2, t2) when !nsi -> + | Sort_ _, Bind_ (l2, id2, w2, t2) when si -> let m1, m2 = inc m1, inc m2 in - let f c = are_convertible f a c m1 (term_of_whdr r1) m2 t2 in + let f c = are_convertible f ~si a c m1 (term_of_whdr r1) m2 t2 in push "nsi" f c m2 l2 id2 w2 | _ -> f false and aux_rev m2 r2 m1 r1 = aux m1 r1 m2 r2 in let g m1 r1 = whd (aux m1 r1) c m2 t2 in if a = false then f false else whd g c m1 t1 -and are_convertible_stacks f a c m1 m2 = +and are_convertible_stacks f ~si a c m1 m2 = (* L.warn "entering R.are_convertible_stacks"; *) let mm1, mm2 = {m1 with s = []}, {m2 with s = []} in - let map f a v1 v2 = are_convertible f a c mm1 v1 mm2 v2 in + let map f a v1 v2 = are_convertible f ~si a c mm1 v1 mm2 v2 in if List.length m1.s <> List.length m2.s then begin (* L.warn (Printf.sprintf "Different lengths: %u %u" @@ -191,7 +193,7 @@ and are_convertible_stacks f a c m1 m2 = else C.list_fold_left2 f map a m1.s m2.s -let are_convertible f c u t = +let are_convertible f ?(si=false) c u t = let f b = L.unbox level; f b in - L.box level; log2 "Now converting" c u t; - are_convertible f true c empty_machine u empty_machine t + L.box level; log2 "Now converting" c u c t; + are_convertible f ~si true c empty_machine u empty_machine t