module Stdlib.Data.Nat;

open import Stdlib.Data.String;
open import Stdlib.Data.Bool;

--- Inductive natural numbers. I.e. whole non-negative numbers.
builtin nat
type Nat :=
  | zero : Nat
  | suc : NatNat;

infixl 6 +;
--- Addition for ;Nat;s.
builtin nat-plus
+ : NatNatNat;
+ zero b := b;
+ (suc a) b := suc (a + b);

infixl 7 *;
--- Multiplication for ;Nat;s.
builtin nat-mul
* : NatNatNat;
* zero _ := zero;
* (suc a) b := b + a * b;

--- Truncated subtraction for ;Nat;s.
builtin nat-sub
sub : NatNatNat;
sub zero _ := zero;
sub n zero := n;
sub (suc n) (suc m) := sub n m;

--- Division for ;Nat;s. Returns ;zero; if the first element is ;zero;.
builtin nat-udiv
terminating
udiv : NatNatNat;
udiv zero _ := zero;
udiv n m := suc (udiv (sub n m) m);

--- Division for ;Nat;s.
builtin nat-div
div : NatNatNat;
div n m := udiv (sub (suc n) m) m;

--- Modulo for ;Nat;s.
builtin nat-mod
mod : NatNatNat;
mod n m := sub n (div n m * m);

--- Converts a ;Nat; into a ;String;.
builtin nat-to-string
axiom natToString : Nat -> String;

--- Partial function that converts a ;String; into a ;Nat;.
builtin string-to-nat
axiom stringToNat : String -> Nat;
Last modified on 2023-04-19 22:00 UTC