2 ||M|| This file is part of HELM, an Hypertextual, Electronic
3 ||A|| Library of Mathematics, developed at the Computer Science
4 ||T|| Department, University of Bologna, Italy.
6 ||T|| HELM is free software; you can redistribute it and/or
7 ||A|| modify it under the terms of the GNU General Public License
8 \ / version 2 or (at your option) any later version.
9 \ / This software is distributed as is, NO WARRANTY.
10 V_______________________________________________________________ *)
19 module E = BrgEnvironment
20 module S = BrgSubstitution
21 module R = BrgReduction
23 (* Internal functions *******************************************************)
28 let sc, st = s ^ " in the context", "the term" in
29 L.log O.specs level (L.ct_items1 sc c st t)
32 let sc = "In the context" in
33 raise (R.TypeError (L.ct_items1 sc c st t))
35 (* Interface functions ******************************************************)
37 let rec b_type_of f ~si g c x =
38 log1 "Now checking" c x;
41 let f h = f x (B.Sort (a, h)) in H.apply f g h
44 | Some (_, B.Abst w) ->
45 S.lift (f x) (succ i) (0) w
46 | Some (_, B.Abbr (B.Cast (_, w, _))) ->
47 S.lift (f x) (succ i) (0) w
48 | Some (_, B.Abbr _) -> assert false
50 error1 "reference to excluded variable" c x
52 error1 "variable not found" c x
57 | _, _, B.Abst w -> f x w
58 | _, _, B.Abbr (B.Cast (_, w, _)) -> f x w
59 | _, _, B.Abbr _ -> assert false
61 error1 "reference to excluded object" c x
64 | B.Bind (a, B.Abbr v, t) ->
66 f (A.sh2 v xv t xt x (B.bind_abbr a)) (B.bind_abbr a xv tt)
68 let f xv cc = b_type_of (f xv) ~si g cc t in
69 let f xv = B.push (f xv) c a (B.Abbr xv) in
70 let f xv vv = match xv with
72 | _ -> assert false (* f (B.Cast ([], vv, xv)) *)
75 | B.Bind (a, B.Abst u, t) ->
77 f (A.sh2 u xu t xt x (B.bind_abst a)) (B.bind_abst a xu tt)
79 let f xu cc = b_type_of (f xu) ~si g cc t in
80 let f xu _ = B.push (f xu) c a (B.Abst xu) in
82 | B.Bind (a, B.Void, t) ->
84 f (A.sh1 t xt x (B.bind a B.Void)) (B.bind a B.Void tt)
86 let f cc = b_type_of f ~si g cc t in
90 let f () = f (A.sh2 v xv t xt x (B.appl a)) (B.appl a xv tt) in
91 R.assert_conversion f ~si ~rt:true c tt vv xv
93 let f xv vv = b_type_of (f xv vv) ~si g c t in
97 let f () = f (A.sh2 u xu t xt x (B.cast a)) xu in
98 R.assert_conversion f ~si c xu tt xt
100 let f xu _ = b_type_of (f xu) ~si g c t in
103 and type_of f ?(si=false) g c x =
104 let f t u = L.unbox level; f t u in
105 L.box level; b_type_of f ~si g c x