1 (** {2 Auxiliary functions} *)
3 let uri = UriManager.uri_of_string
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)
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)
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),
23 (String.sub uri (index_sharp + 3) (index_div - index_sharp - 3)) - 1,
25 (String.sub uri index_con (String.length uri - index_con)))
27 let term_of_uri ?(subst = []) uri =
28 let s = UriManager.string_of_uri uri in
31 (* TODO explicit substitutions? *)
32 let len = String.length s in
33 let sub = String.sub s (len -4) 4 in
36 else if sub = ".var" then
41 let (uri, typeno) = indtyuri_of_uri s in
42 mutind ~subst uri typeno
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)
49 | Invalid_argument _ | Not_found -> raise (UriManager.IllFormedUri s)
51 (** {2 Helm's objects shorthands} *)
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"
85 let bool_URI = uri "cic:/Coq/Init/Datatypes/bool.ind"
86 let nat_URI = uri "cic:/Coq/Init/Datatypes/nat.ind"
88 let trueb = mutconstruct bool_URI 0 1
89 let falseb = mutconstruct bool_URI 0 2
90 let zero = mutconstruct nat_URI 0 1
91 let succ = mutconstruct nat_URI 0 2
96 let r_URI = uri "cic:/Coq/Reals/Rdefinitions/R.con"
97 let rplus_SURI = "cic:/Coq/Reals/Rdefinitions/Rplus.con"
98 let rplus_URI = uri rplus_SURI
99 let rminus_URI = uri "cic:/Coq/Reals/Rdefinitions/Rminus.con"
100 let rmult_URI = uri "cic:/Coq/Reals/Rdefinitions/Rmult.con"
101 let rdiv_URI = uri "cic:/Coq/Reals/Rdefinitions/Rdiv.con"
102 let ropp_SURI = "cic:/Coq/Reals/Rdefinitions/Ropp.con"
103 let ropp_URI = uri ropp_SURI
104 let rinv_SURI = "cic:/Coq/Reals/Rdefinitions/Rinv.con"
105 let rinv_URI = uri rinv_SURI
106 let r0_URI = uri "cic:/Coq/Reals/Rdefinitions/R0.con"
107 let r1_URI = uri "cic:/Coq/Reals/Rdefinitions/R1.con"
108 let rle_SURI = "cic:/Coq/Reals/Rdefinitions/Rle.con"
109 let rle_URI = uri rle_SURI
110 let rge_SURI = "cic:/Coq/Reals/Rdefinitions/Rge.con"
111 let rge_URI = uri rge_SURI
112 let rlt_SURI = "cic:/Coq/Reals/Rdefinitions/Rlt.con"
113 let rlt_URI = uri rlt_SURI
114 let rgt_SURI = "cic:/Coq/Reals/Rdefinitions/Rgt.con"
115 let rgt_URI = uri rgt_SURI
116 let rtheory_URI = uri "cic:/Coq/Reals/Rbase/RTheory.con"
117 let rinv_r1_URI = uri "cic:/Coq/Reals/Rbase/Rinv_R1.con"
120 let rplus = const rplus_URI
121 let rmult = const rmult_URI
122 let ropp = const ropp_URI
123 let r0 = const r0_URI
124 let r1 = const r1_URI
125 let rtheory = const rtheory_URI
130 let plus_SURI = "cic:/Coq/Init/Peano/plus.con"
131 let plus_URI = uri plus_SURI
132 let minus_URI = uri "cic:/Coq/Init/Peano/minus.con"
133 let mult_URI = uri "cic:/Coq/Init/Peano/mult.con"
134 let pred_URI = uri "cic:/Coq/Init/Peano/pred.con"
135 let le_SURI = "cic:/Coq/Init/Peano/le.ind"
136 let le_URI = uri le_SURI
137 let le_XURI = le_SURI ^ "#xpointer(1/1)"
138 let ge_SURI = "cic:/Coq/Init/Peano/ge.con"
139 let ge_URI = uri ge_SURI
140 let lt_SURI = "cic:/Coq/Init/Peano/lt.con"
141 let lt_URI = uri lt_SURI
142 let gt_SURI = "cic:/Coq/Init/Peano/lt.con"
143 let gt_URI = uri gt_SURI
144 let lt_URI = uri "cic:/Coq/Init/Peano/lt.con"
146 let plus = const plus_URI
147 let mult = const mult_URI
148 let pred = const pred_URI
153 let zplus_SURI = "cic:/Coq/ZArith/BinInt/Zplus.con"
156 (** {2 Helpers for creating common terms}
159 exception NegativeInteger
162 if n < 0 then raise NegativeInteger;
163 let rec aux = function
164 | 0 -> Datatypes.zero
165 | n -> Cic.Appl [ Datatypes.succ; (aux (n - 1)) ]
170 if n < 0 then raise NegativeInteger;
171 let rec aux = function
173 | 1 -> Reals.r1 (* to avoid trailing "+ 0" *)
174 | n -> Cic.Appl [ Reals.rplus; Reals.r1; (aux (n - 1)) ]