(************************************************************************) (* * The Coq Proof Assistant / The Coq Development Team *) (* v * INRIA, CNRS and contributors - Copyright 1999-2018 *) (* DAst.make ?loc @@ GApp (ref_xO,[pos_of q]) | (q,true) when not (Bigint.equal q zero) -> DAst.make ?loc @@ GApp (ref_xI,[pos_of q]) | (q,true) -> ref_xH in pos_of x let error_non_positive ?loc = user_err ?loc ~hdr:"interp_positive" (str "Only strictly positive numbers in type \"positive\".") let interp_positive ?loc n = if is_strictly_pos n then pos_of_bignat ?loc n else error_non_positive ?loc (**********************************************************************) (* Printing positive via scopes *) (**********************************************************************) let is_gr c gr = match DAst.get c with | GRef (r, _) -> GlobRef.equal r gr | _ -> false let rec bignat_of_pos x = DAst.with_val (function | GApp (r ,[a]) when is_gr r glob_xO -> mult_2(bignat_of_pos a) | GApp (r ,[a]) when is_gr r glob_xI -> add_1(mult_2(bignat_of_pos a)) | GRef (a, _) when GlobRef.equal a glob_xH -> Bigint.one | _ -> raise Non_closed_number ) x let uninterp_positive (AnyGlobConstr p) = try Some (bignat_of_pos p) with Non_closed_number -> None (************************************************************************) (* Declaring interpreters and uninterpreters for positive *) (************************************************************************) open Notation let at_declare_ml_module f x = Mltop.declare_cache_obj (fun () -> f x) __coq_plugin_name let _ = let scope = "positive_scope" in register_bignumeral_interpretation scope (interp_positive,uninterp_positive); at_declare_ml_module enable_prim_token_interpretation { pt_scope = scope; pt_uid = scope; pt_required = (positive_path,binnums); pt_refs = [glob_xI; glob_xO; glob_xH]; pt_in_match = true }