(************************************************************************) (* * The Rocq Prover / The Rocq Development Team *) (* v * Copyright INRIA, CNRS and contributors *) (* <O___,, * (see version control and CREDITS file for authors & dates) *) (* \VV/ **************************************************************) (* // * This file is distributed under the terms of the *) (* * GNU Lesser General Public License Version 2.1 *) (* * (see LICENSE file for the text of the license) *) (************************************************************************)
open Util open Names
let make_dir l = DirPath.make (List.rev_map Id.of_string l)
(************************************************************************) (* Rocq reference API *) (************************************************************************) let rocq = Libnames.rocq_init_string (* "Corelib" *)
let init_dir = [ rocq; "Init"]
let jmeq_module_name = ["Stdlib";"Logic";"JMeq"]
let table : GlobRef.t CString.Map.t ref =
Summary.ref ~name:"rocqlib_registered" CString.Map.empty
let get_lib_refs () =
CString.Map.bindings !table
let has_ref s = CString.Map.mem s !table
let check_ref s gr = match CString.Map.find s !table with
| r -> GlobRef.UserOrd.equal r gr
| exception Not_found -> false
let check_ind_ref s ind = check_ref s (GlobRef.IndRef ind)
exception NotFoundRef ofstring
let () = CErrors.register_handler (function
| NotFoundRef s -> Some Pp.(str "not found in table: " ++ str s)
| _ -> None)
let lib_ref s = try CString.Map.find s !table with Not_found -> raise (NotFoundRef s)
let lib_ref_opt s = CString.Map.find_opt s !table
let add_ref s c =
table := CString.Map.add s c !table
let cache_ref (s,c) =
add_ref s c
let (inRocqlibRef : Libobject.locality * (string * GlobRef.t) -> Libobject.obj) = letopen Libobject in
declare_object @@ object_with_locality "COQLIBREF"
~cache:cache_ref
~subst:(Some ident_subst_function)
~discharge:(fun x -> x)
(** Replaces a binding ! *) let register_ref local s c =
Lib.add_leaf @@ inRocqlibRef (local,(s,c))
(************************************************************************) (* Generic functions to find Rocq objects *)
(* For tactics/commands requiring vernacular libraries *)
let check_required_library d = let dir = make_dir d in try let _ : Mod_declarations.module_body = Global.lookup_module (ModPath.MPfile dir) in
() with Not_found -> let in_current_dir = match Lib.current_mp () with
| MPfile dp -> DirPath.equal dir dp
| _ -> false in ifnot in_current_dir then
CErrors.user_err Pp.(str "Library " ++ DirPath.print dir
++ str " has to be required first.")
(************************************************************************) (* Specific Rocq objects *) (************************************************************************)
let logic_module_name = init_dir@["Logic"]
let datatypes_module_name = init_dir@["Datatypes"]
(** Identity *)
(* Sigma data *) type rocq_sigma_data = {
proj1 : GlobRef.t;
proj2 : GlobRef.t;
elim : GlobRef.t;
intro : GlobRef.t;
typ : GlobRef.t }
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung ist noch experimentell.