(************************************************************************) (* * 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 *) (************************************************************************) let _ = Notation.declare_numeral_interpreter "positive_scope" (positive_path,binnums) interp_positive ([DAst.make @@ GRef (glob_xI, None); DAst.make @@ GRef (glob_xO, None); DAst.make @@ GRef (glob_xH, None)], uninterp_positive, true)