]> matita.cs.unibo.it Git - helm.git/blob - helm/ocaml/cic/helmLibraryObjects.ml
Partial porting to V8 URIs.
[helm.git] / helm / ocaml / cic / helmLibraryObjects.ml
1 (** {2 Auxiliary functions} *)
2
3 let uri = UriManager.uri_of_string
4
5 let const ?(subst = []) uri = Cic.Const (uri, subst)
6 let var ?(subst = []) uri = Cic.Var (uri, subst)
7 let mutconstruct ?(subst = []) uri typeno consno =
8   Cic.MutConstruct (uri, typeno, consno, subst)
9 let mutind ?(subst = []) uri typeno = Cic.MutInd (uri, typeno, subst)
10
11 let indtyuri_of_uri uri =
12   let index_sharp =  String.index uri '#' in
13   let index_num = index_sharp + 3 in
14   (UriManager.uri_of_string (String.sub uri 0 index_sharp),
15    int_of_string(String.sub uri index_num (String.length uri - index_num)) - 1)
16
17 let indconuri_of_uri uri =
18   let index_sharp =  String.index uri '#' in
19   let index_div = String.rindex uri '/' in
20   let index_con = index_div + 1 in
21     (UriManager.uri_of_string (String.sub uri 0 index_sharp),
22     int_of_string
23       (String.sub uri (index_sharp + 3) (index_div - index_sharp - 3)) - 1,
24     int_of_string
25       (String.sub uri index_con (String.length uri - index_con)))
26
27 let term_of_uri ?(subst = []) uri =
28   let s = UriManager.string_of_uri uri in
29   try
30   (* Constant *)
31   (* TODO explicit substitutions? *)
32   let len = String.length s in
33   let sub = String.sub s (len -4) 4 in
34   if sub = ".con" then
35     const ~subst uri
36   else if sub = ".var" then
37     var ~subst uri
38   else
39     (try
40       (* Inductive Type *)
41       let (uri, typeno) = indtyuri_of_uri s in
42       mutind ~subst uri typeno
43      with
44       | UriManager.IllFormedUri _ | Failure _ | Invalid_argument _ ->
45           (* Constructor of an Inductive Type *)
46           let (uri, typeno, consno) = indconuri_of_uri s in
47           mutconstruct ~subst uri typeno consno)
48  with
49  | Invalid_argument _ | Not_found -> raise (UriManager.IllFormedUri s)
50
51 (** {2 Helm's objects shorthands} *)
52
53 module Logic =
54   struct
55     let eq_SURI = "cic:/Coq/Init/Logic/eq.ind"
56     let eq_URI = uri eq_SURI
57     let eq_XURI = eq_SURI ^ "#xpointer(1/1)"
58     let eq_ind_URI = uri "cic:/Coq/Init/Logic/eq_ind.con"
59     let eq_ind_r_URI = uri "cic:/Coq/Init/Logic/eq_ind_r.con"
60     let true_URI = uri "cic:/Coq/Init/Logic/True.ind"
61     let false_URI = uri "cic:/Coq/Init/Logic/False.ind"
62     let false_ind_URI = uri "cic:/Coq/Init/Logic/False_ind.con"
63     let ex_SURI = "cic:/Coq/Init/Logic/ex.ind"
64     let ex_URI = uri ex_SURI
65     let ex_XURI = ex_SURI ^ "#xpointer(1/1)"
66     let ex_ind_URI = uri "cic:/Coq/Init/Logic/ex_ind.con"
67     let and_SURI = "cic:/Coq/Init/Logic/and.ind"
68     let and_URI = uri and_SURI
69     let and_XURI = and_SURI ^ "#xpointer(1/1)"
70     let and_ind_URI = uri "cic:/Coq/Init/Logic/and_ind.con"
71     let or_SURI = "cic:/Coq/Init/Logic/or.ind"
72     let or_URI = uri or_SURI
73     let or_XURI = or_SURI ^ "#xpointer(1/1)"
74     let not_SURI = "cic:/Coq/Init/Logic/not.con"
75     let not_URI = uri not_SURI
76     let iff_SURI = "cic:/Coq/Init/Logic/iff.con"
77     let iff_URI = uri "cic:/Coq/Init/Logic/iff.con"
78     let sym_eq_URI = uri "cic:/Coq/Init/Logic/sym_eq.con"
79     let trans_eq_URI = uri "cic:/Coq/Init/Logic/trans_eq.con"
80     let absurd_URI = uri "cic:/Coq/Init/Logic/absurd.con"
81   end
82
83 module Logic_Type =
84   struct
85     let eqt_URI = uri "cic:/Coq/Init/Logic_Type/eqT.ind"
86     let sym_eqt_URI = uri "cic:/Coq/Init/Logic_Type/sym_eqT.con"
87
88     let refl_eqt = mutconstruct eqt_URI 0 1
89     let sym_eqt = const sym_eqt_URI
90   end
91
92 module Datatypes =
93   struct
94     let bool_URI = uri "cic:/Coq/Init/Datatypes/bool.ind"
95     let nat_URI = uri "cic:/Coq/Init/Datatypes/nat.ind"
96
97     let trueb = mutconstruct bool_URI 0 1
98     let falseb = mutconstruct bool_URI 0 2
99     let zero = mutconstruct nat_URI 0 1
100     let succ = mutconstruct nat_URI 0 2
101   end
102
103 module Reals =
104   struct
105     let r_URI = uri "cic:/Coq/Reals/Rdefinitions/R.con"
106     let rplus_SURI = "cic:/Coq/Reals/Rdefinitions/Rplus.con"
107     let rplus_URI = uri rplus_SURI
108     let rminus_URI = uri "cic:/Coq/Reals/Rdefinitions/Rminus.con"
109     let rmult_URI = uri "cic:/Coq/Reals/Rdefinitions/Rmult.con"
110     let rdiv_URI = uri "cic:/Coq/Reals/Rdefinitions/Rdiv.con"
111     let ropp_SURI = "cic:/Coq/Reals/Rdefinitions/Ropp.con"
112     let ropp_URI = uri ropp_SURI
113     let rinv_SURI = "cic:/Coq/Reals/Rdefinitions/Rinv.con"
114     let rinv_URI = uri rinv_SURI
115     let r0_URI = uri "cic:/Coq/Reals/Rdefinitions/R0.con"
116     let r1_URI = uri "cic:/Coq/Reals/Rdefinitions/R1.con"
117     let rle_SURI = "cic:/Coq/Reals/Rdefinitions/Rle.con"
118     let rle_URI = uri rle_SURI
119     let rge_SURI = "cic:/Coq/Reals/Rdefinitions/Rge.con"
120     let rge_URI = uri rge_SURI
121     let rlt_SURI = "cic:/Coq/Reals/Rdefinitions/Rlt.con"
122     let rlt_URI = uri rlt_SURI
123     let rgt_SURI = "cic:/Coq/Reals/Rdefinitions/Rgt.con"
124     let rgt_URI = uri rgt_SURI
125     let rtheory_URI = uri "cic:/Coq/Reals/Rbase/RTheory.con"
126     let rinv_r1_URI = uri "cic:/Coq/Reals/Rbase/Rinv_R1.con"
127
128     let r = const r_URI
129     let rplus = const rplus_URI
130     let rmult = const rmult_URI
131     let ropp = const ropp_URI
132     let r0 = const r0_URI
133     let r1 = const r1_URI
134     let rtheory = const rtheory_URI
135   end
136
137 module Peano =
138   struct
139     let plus_SURI = "cic:/Coq/Init/Peano/plus.con"
140     let plus_URI = uri plus_SURI
141     let minus_URI = uri "cic:/Coq/Init/Peano/minus.con"
142     let mult_URI = uri "cic:/Coq/Init/Peano/mult.con"
143     let pred_URI = uri "cic:/Coq/Init/Peano/pred.con"
144     let le_SURI = "cic:/Coq/Init/Peano/le.ind"
145     let le_URI = uri le_SURI
146     let le_XURI = le_SURI ^ "#xpointer(1/1)"
147     let ge_SURI = "cic:/Coq/Init/Peano/ge.con"
148     let ge_URI = uri ge_SURI
149     let lt_SURI = "cic:/Coq/Init/Peano/lt.con"
150     let lt_URI = uri lt_SURI
151     let gt_SURI = "cic:/Coq/Init/Peano/lt.con"
152     let gt_URI = uri gt_SURI
153     let lt_URI = uri "cic:/Coq/Init/Peano/lt.con"
154
155     let plus = const plus_URI
156     let mult = const mult_URI
157     let pred = const pred_URI
158   end
159
160 module BinInt =
161   struct
162     let zplus_SURI = "cic:/Coq/ZArith/BinInt/Zplus.con"
163   end
164
165 (** {2 Helpers for creating common terms}
166  *  (e.g. numbers)} *)
167
168 exception NegativeInteger
169
170 let build_nat n =
171   if n < 0 then raise NegativeInteger;
172   let rec aux = function
173     | 0 -> Datatypes.zero
174     | n -> Cic.Appl [ Datatypes.succ; (aux (n - 1)) ]
175   in
176   aux n
177
178 let build_real n =
179   if n < 0 then raise NegativeInteger;
180   let rec aux = function
181     | 0 -> Reals.r0
182     | 1 -> Reals.r1 (* to avoid trailing "+ 0" *)
183     | n -> Cic.Appl [ Reals.rplus; Reals.r1; (aux (n - 1)) ]
184   in
185   aux n
186