{
    "title": "Arithmetic operations on integers and real numbers",
    "level": "Low",
    "elements": [
        {
            "pattern": "Adding two integers",
            "module": "",
            "name": "( + )",
            "type": "function",
            "signature": "val (+) : Z.t -> Z.t -> Z.t",
            "description": "Addition on integers",
            "examples": []
        },
        {
            "pattern": "Integer comparison: greater than or equal to",
            "module": "",
            "name": "( >= )",
            "type": "function",
            "signature": "val (>=) : int -> int -> bool",
            "description": "Greater than or equal to on integers",
            "examples": []
        },
        {
            "pattern": "Integer comparison: less than",
            "module": "",
            "name": "( < )",
            "type": "function",
            "signature": "val (<) : int -> int -> bool",
            "description": "Less than on integers",
            "examples": []
        },
        {
            "pattern": "Integer comparison: less than or equal to",
            "module": "",
            "name": "( <= )",
            "type": "function",
            "signature": "val (<=) : int -> int -> bool",
            "description": "Less than or equal to on integers",
            "examples": []
        },
        {
            "pattern": "Integer comparison: greater than",
            "module": "",
            "name": "( > )",
            "type": "function",
            "signature": "val (>) : int -> int -> bool",
            "description": "Greater than on integers",
            "examples": []
        },
        {
            "pattern": "M",
            "module": "",
            "name": "min",
            "type": "function",
            "signature": "val min : int -> int -> int",
            "description": "Minimum of two integers",
            "examples": []
        },
        {
            "pattern": "Integer maximum",
            "module": "",
            "name": "max",
            "type": "function",
            "signature": "val max : int -> int -> int",
            "description": "Maximum of two integers",
            "examples": []
        },
        {
            "pattern": "Integer negation",
            "module": "",
            "name": "( ~- )",
            "type": "function",
            "signature": "val (~-) : Z.t -> Z.t",
            "description": "Negation of an integer",
            "examples": []
        },
        {
            "pattern": "Integer absolute value",
            "module": "",
            "name": "abs",
            "type": "function",
            "signature": "val abs : int -> int",
            "description": "Absolute value of an integer",
            "examples": []
        },
        {
            "pattern": "Integer subtraction",
            "module": "",
            "name": "( - )",
            "type": "function",
            "signature": "val (-) : Z.t -> Z.t -> Z.t",
            "description": "Subtraction on integers",
            "examples": []
        },
        {
            "pattern": "Integer positive identity",
            "module": "",
            "name": "( ~+ )",
            "type": "function",
            "signature": "val (~+) : Z.t -> Z.t",
            "description": "Positive identity of an integer",
            "examples": []
        },
        {
            "pattern": "Integer multiplication",
            "module": "",
            "name": "( * )",
            "type": "function",
            "signature": "val (*) : Z.t -> Z.t -> Z.t",
            "description": "Multiplication on integers",
            "examples": []
        },
        {
            "pattern": "Euclidian division on integers",
            "module": "",
            "name": "( / )",
            "type": "function",
            "signature": "val (/) : Z.t -> Z.t -> Z.t",
            "description": "Euclidian division on integers, see http://smtlib.cs.uiowa.edu/theories-Ints.shtml",
            "examples": []
        },
        {
            "pattern": "Euclidian remainder on integers",
            "module": "",
            "name": "( mod )",
            "type": "function",
            "signature": "val (mod) : Z.t -> Z.t -> Z.t",
            "description": "Euclidian remainder on integers",
            "examples": []
        },
        {
            "pattern": "Total order on integers",
            "module": "",
            "name": "compare",
            "type": "function",
            "signature": "val compare : int -> int -> Z.t",
            "description": "Total order on integers",
            "examples": [
                {
                    "input": "let res = compare 3 5",
                    "output": "val res : Z.t = -1"
                },
                {
                    "input": "let res = compare 5 3",
                    "output": "val res : Z.t = 1"
                }
            ]
        },
        {
            "pattern": "The successor of an integer",
            "module": "",
            "name": "succ",
            "type": "function",
            "signature": "val succ : Z.t -> Z.t",
            "description": "Next integer",
            "examples": []
        },
        {
            "pattern": "The predecessor of an integer",
            "module": "",
            "name": "pred",
            "type": "function",
            "signature": "val pred : Z.t -> Z.t",
            "description": "Previous integer",
            "examples": []
        },
        {
            "pattern": "Real number comparison: less than",
            "module": "",
            "name": "( <. )",
            "type": "function",
            "signature": "val (<.) : real -> real -> bool",
            "description": "Less than on real numbers",
            "examples": []
        },
        {
            "pattern": "Real number comparison: less than or equal to",
            "module": "",
            "name": "( <=. )",
            "type": "function",
            "signature": "val (<=.) : real -> real -> bool",
            "description": "Less than or equal to on real numbers",
            "examples": []
        },
        {
            "pattern": "Real number comparison: greater than",
            "module": "",
            "name": "( >. )",
            "type": "function",
            "signature": "val (>.) : real -> real -> bool",
            "description": "Greater than on real numbers",
            "examples": []
        },
        {
            "pattern": "Real number comparison: greater than or equal to",
            "module": "",
            "name": "( >=. )",
            "type": "function",
            "signature": "val (>=.) : real -> real -> bool",
            "description": "Greater than or equal to on real numbers",
            "examples": []
        },
        {
            "pattern": "The minimum of two real numbers",
            "module": "",
            "name": "min_r",
            "type": "function",
            "signature": "val min_r : real -> real -> real",
            "description": "Minimum of two real numbers",
            "examples": []
        },
        {
            "pattern": "The maximum of two real numbers",
            "module": "",
            "name": "max_r",
            "type": "function",
            "signature": "val max_r : real -> real -> real",
            "description": "Maximum of two real numbers",
            "examples": []
        },
        {
            "pattern": "The sum of two real numbers",
            "module": "",
            "name": "( +. )",
            "type": "function",
            "signature": "val (+.) : real -> real -> real",
            "description": "Addition on real numbers",
            "examples": []
        },
        {
            "pattern": "The difference of two real numbers",
            "module": "",
            "name": "( -. )",
            "type": "function",
            "signature": "val (-.) : real -> real -> real",
            "description": "Subtraction on real numbers",
            "examples": []
        },
        {
            "pattern": "The negation of a real number",
            "module": "",
            "name": "( ~-. )",
            "type": "function",
            "signature": "val (~-.) : Q.t -> Q.t",
            "description": "Negation of a real number",
            "examples": []
        },
        {
            "pattern": "The product of two real numbers",
            "module": "",
            "name": "( *. )",
            "type": "function",
            "signature": "val (*.) : real -> real -> real",
            "description": "Multiplication on real numbers",
            "examples": []
        },
        {
            "pattern": "The division of two real numbers",
            "module": "",
            "name": "( /. )",
            "type": "function",
            "signature": "val (/.) : real -> real -> real",
            "description": "Division on real numbers",
            "examples": []
        }
    ],
    "metadata": {
        "signatures": [
            "val (+) : Z.t -> Z.t -> Z.t",
            "val (>=) : int -> int -> bool",
            "val (<) : int -> int -> bool",
            "val (<=) : int -> int -> bool",
            "val (>) : int -> int -> bool",
            "val min : int -> int -> int",
            "val max : int -> int -> int",
            "val (~-) : Z.t -> Z.t",
            "val abs : int -> int",
            "val (-) : Z.t -> Z.t -> Z.t",
            "val (~+) : Z.t -> Z.t",
            "val (*) : Z.t -> Z.t -> Z.t",
            "val (/) : Z.t -> Z.t -> Z.t",
            "val (mod) : Z.t -> Z.t -> Z.t",
            "val compare : int -> int -> Z.t",
            "val succ : Z.t -> Z.t",
            "val pred : Z.t -> Z.t",
            "val (<.) : real -> real -> bool",
            "val (<=.) : real -> real -> bool",
            "val (>.) : real -> real -> bool",
            "val (>=.) : real -> real -> bool",
            "val min_r : real -> real -> real",
            "val max_r : real -> real -> real",
            "val (+.) : real -> real -> real",
            "val (-.) : real -> real -> real",
            "val (~-.) : Q.t -> Q.t",
            "val (*.) : real -> real -> real",
            "val (/.) : real -> real -> real"
        ]
    }
}