use crate::*;
theories! {
pub Core {
type Bool;
const True: Core::Bool();
const False: Core::Bool();
fn not(Core::Bool()) -> Core::Bool();
#[name = "=>"]
#[right_assoc]
fn implies(Core::Bool(), Core::Bool()) -> Core::Bool();
#[left_assoc]
fn and(Core::Bool(), Core::Bool()) -> Core::Bool();
#[left_assoc]
fn or(Core::Bool(), Core::Bool()) -> Core::Bool();
#[left_assoc]
fn xor(Core::Bool(), Core::Bool()) -> Core::Bool();
#[name = "="]
#[chainable]
fn equals<A>(A, A) -> Core::Bool();
#[pairwise]
fn distinct<A>(A, A) -> Core::Bool();
fn ite<A>(Core::Bool(), A, A) -> A;
}
pub Reals {
type Real;
#[name = "-"]
fn unary_minus(Reals::Real()) -> Reals::Real();
#[name = "-"]
#[left_assoc]
fn minus(Reals::Real(), Reals::Real()) -> Reals::Real();
#[name = "+"]
#[left_assoc]
fn plus(Reals::Real(), Reals::Real()) -> Reals::Real();
#[name = "*"]
#[left_assoc]
fn mult(Reals::Real(), Reals::Real()) -> Reals::Real();
#[name = "/"]
#[left_assoc]
fn div (Reals::Real(), Reals::Real()) -> Reals::Real();
#[name = "<="]
#[chainable]
fn le(Reals::Real(), Reals::Real()) -> Core::Bool();
#[name = "<"]
#[chainable]
fn lt(Reals::Real(), Reals::Real()) -> Core::Bool();
#[name = ">="]
#[chainable]
fn ge(Reals::Real(), Reals::Real()) -> Core::Bool();
#[name = ">"]
#[chainable]
fn gt(Reals::Real(), Reals::Real()) -> Core::Bool();
}
pub Ints {
type Int;
#[name = "-"]
fn unary_minus (Ints::Int()) -> Ints::Int();
#[name = "-"]
#[left_assoc]
fn minus (Ints::Int(), Ints::Int()) -> Ints::Int();
#[name = "+"]
#[left_assoc]
fn plus (Ints::Int(), Ints::Int()) -> Ints::Int();
#[name = "*"]
#[left_assoc]
fn mult (Ints::Int(), Ints::Int()) -> Ints::Int();
#[name = "/"]
#[left_assoc]
fn div (Ints::Int(), Ints::Int()) -> Ints::Int();
#[name = "mod"]
fn mod_ (Ints::Int(), Ints::Int()) -> Ints::Int();
fn abs (Ints::Int()) -> Ints::Int();
#[name = "<="]
#[chainable]
fn le (Ints::Int(), Ints::Int()) -> Core::Bool();
#[name = "<"]
#[chainable]
fn lt (Ints::Int(), Ints::Int()) -> Core::Bool();
#[name = ">="]
#[chainable]
fn ge (Ints::Int(), Ints::Int()) -> Core::Bool();
#[name = ">"]
#[chainable]
fn gt (Ints::Int(), Ints::Int()) -> Core::Bool();
}
pub RealsInts : Ints, Reals {
fn to_real(Ints::Int()) -> Reals::Real();
fn to_int(Reals::Real()) -> Ints::Int();
fn is_int(Reals::Real()) -> Core::Bool();
}
pub Arrays {
type Array(X: Sort::sort(), Y: Sort::sort());
fn select<X, Y>(Arrays::Array(X, Y), X) -> Y;
fn store<X, Y>(Arrays::Array(X, Y), X, Y) -> Arrays::Array(X, Y);
}
}