pub mod arith;
pub mod array;
pub mod basic;
pub mod bv;
pub mod manager;
pub mod node;
pub mod parameter;
pub mod pp;
pub mod query;
pub mod translation;
pub use arith::{ArithOp, ArithSortKind};
pub use basic::{BasicOp, BasicSortKind};
pub use bv::{BvOp, BvSortKind};
pub use manager::AstManager;
pub use node::{AppData, AstNode, DeclInfo, FuncDeclData, FuncDeclFlags, SortData, VarData};
pub use parameter::Parameter;
pub const BASIC_FAMILY_ID: FamilyId = 0;
pub type FamilyId = i32;
pub const NULL_FAMILY_ID: FamilyId = -1;
pub type DeclKind = i32;
pub const NULL_DECL_KIND: DeclKind = -1;
#[derive(Clone, Copy, PartialEq, Eq, Hash, Debug)]
#[repr(u8)]
pub enum AstKind {
App = 0,
Var = 1,
Quantifier = 2,
Sort = 3,
FuncDecl = 4,
}
impl AstKind {
pub const fn name(self) -> &'static str {
match self {
AstKind::App => "application",
AstKind::Var => "variable",
AstKind::Quantifier => "quantifier",
AstKind::Sort => "sort",
AstKind::FuncDecl => "declaration",
}
}
}
#[derive(Clone, Copy, PartialEq, Eq, Hash, PartialOrd, Ord, Debug)]
pub struct AstId(pub u32);
#[derive(Clone, Copy, PartialEq, Eq, Hash, Debug)]
pub enum SortSize {
Finite(u64),
VeryBig,
Infinite,
}
impl SortSize {
#[inline]
pub const fn finite(n: u64) -> SortSize {
SortSize::Finite(n)
}
#[inline]
pub const fn infinite() -> SortSize {
SortSize::Infinite
}
#[inline]
pub const fn very_big() -> SortSize {
SortSize::VeryBig
}
#[inline]
pub const fn is_finite(self) -> bool {
matches!(self, SortSize::Finite(_))
}
#[inline]
pub const fn is_infinite(self) -> bool {
matches!(self, SortSize::Infinite)
}
#[inline]
pub const fn is_very_big(self) -> bool {
matches!(self, SortSize::VeryBig)
}
#[inline]
pub const fn size(self) -> u64 {
match self {
SortSize::Finite(n) => n,
_ => 0,
}
}
#[inline]
pub const fn is_very_big_base2(power: u32) -> bool {
power >= 64
}
}
impl Default for SortSize {
#[inline]
fn default() -> SortSize {
SortSize::Infinite
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn ast_kind_discriminants_match_z3() {
assert_eq!(AstKind::App as u8, 0);
assert_eq!(AstKind::Var as u8, 1);
assert_eq!(AstKind::Quantifier as u8, 2);
assert_eq!(AstKind::Sort as u8, 3);
assert_eq!(AstKind::FuncDecl as u8, 4);
assert_eq!(AstKind::Sort.name(), "sort");
}
#[test]
fn sort_size_variants() {
assert!(SortSize::finite(8).is_finite());
assert_eq!(SortSize::finite(8).size(), 8);
assert!(SortSize::infinite().is_infinite());
assert!(SortSize::very_big().is_very_big());
assert!(SortSize::is_very_big_base2(64));
assert!(!SortSize::is_very_big_base2(63));
assert_eq!(SortSize::default(), SortSize::Infinite);
}
}