(** {2 Auxiliary functions} *) let uri = UriManager.uri_of_string let const ?(subst = []) uri = Cic.Const (uri, subst) let var ?(subst = []) uri = Cic.Var (uri, subst) let mutconstruct ?(subst = []) uri typeno consno = Cic.MutConstruct (uri, typeno, consno, subst) let mutind ?(subst = []) uri typeno = Cic.MutInd (uri, typeno, subst) let indtyuri_of_uri uri = let index_sharp = String.index uri '#' in let index_num = index_sharp + 3 in (UriManager.uri_of_string (String.sub uri 0 index_sharp), int_of_string(String.sub uri index_num (String.length uri - index_num)) - 1) let indconuri_of_uri uri = let index_sharp = String.index uri '#' in let index_div = String.rindex uri '/' in let index_con = index_div + 1 in (UriManager.uri_of_string (String.sub uri 0 index_sharp), int_of_string (String.sub uri (index_sharp + 3) (index_div - index_sharp - 3)) - 1, int_of_string (String.sub uri index_con (String.length uri - index_con))) let term_of_uri ?(subst = []) uri = let s = UriManager.string_of_uri uri in try (* Constant *) (* TODO explicit substitutions? *) let len = String.length s in let sub = String.sub s (len -4) 4 in if sub = ".con" then const ~subst uri else if sub = ".var" then var ~subst uri else (try (* Inductive Type *) let (uri, typeno) = indtyuri_of_uri s in mutind ~subst uri typeno with | UriManager.IllFormedUri _ | Failure _ | Invalid_argument _ -> (* Constructor of an Inductive Type *) let (uri, typeno, consno) = indconuri_of_uri s in mutconstruct ~subst uri typeno consno) with | Invalid_argument _ | Not_found -> raise (UriManager.IllFormedUri s) (** {2 Helm's objects shorthands} *) module Logic = struct let eq_URI = uri "cic:/Coq/Init/Logic/eq.ind" let true_URI = uri "cic:/Coq/Init/Logic/True.ind" let false_URI = uri "cic:/Coq/Init/Logic/False.ind" end module Logic_Type = struct let eqt_URI = uri "cic:/Coq/Init/Logic_Type/eqT.ind" let sym_eqt_URI = uri "cic:/Coq/Init/Logic_Type/sym_eqT.con" let refl_eqt = mutconstruct eqt_URI 0 1 let sym_eqt = const sym_eqt_URI end module Datatypes = struct let bool_URI = uri "cic:/Coq/Init/Datatypes/bool.ind" let nat_URI = uri "cic:/Coq/Init/Datatypes/nat.ind" let trueb = mutconstruct bool_URI 0 1 let falseb = mutconstruct bool_URI 0 2 let zero = mutconstruct nat_URI 0 1 let succ = mutconstruct nat_URI 0 2 end module Reals = struct let r_URI = uri "cic:/Coq/Reals/Rdefinitions/R.con" let rplus_URI = uri "cic:/Coq/Reals/Rdefinitions/Rplus.con" let rmult_URI = uri "cic:/Coq/Reals/Rdefinitions/Rmult.con" let ropp_URI = uri "cic:/Coq/Reals/Rdefinitions/Ropp.con" let r0_URI = uri "cic:/Coq/Reals/Rdefinitions/R0.con" let r1_URI = uri "cic:/Coq/Reals/Rdefinitions/R1.con" let rtheory_URI = uri "cic:/Coq/Reals/Rbase/RTheory.con" let r = const r_URI let rplus = const rplus_URI let rmult = const rmult_URI let ropp = const ropp_URI let r0 = const r0_URI let r1 = const r1_URI let rtheory = const rtheory_URI end module Peano = struct let plus_URI = uri "cic:/Coq/Init/Peano/plus.con" let mult_URI = uri "cic:/Coq/Init/Peano/mult.con" let pred_URI = uri "cic:/Coq/Init/Peano/pred.con" let plus = const plus_URI let mult = const mult_URI let pred = const pred_URI end (** {2 Helpers for creating common terms} * (e.g. numbers)} *) exception NegativeInteger let build_nat n = if n < 0 then raise NegativeInteger; let rec aux = function | 0 -> Datatypes.zero | n -> Cic.Appl [ Datatypes.succ; (aux (n - 1)) ] in aux n let build_real n = if n < 0 then raise NegativeInteger; let rec aux = function | 0 -> Reals.r0 | 1 -> Reals.r1 (* to avoid trailing "+ 0" *) | n -> Cic.Appl [ Reals.rplus; Reals.r1; (aux (n - 1)) ] in aux n