#[derive(Eq, Hash, PartialEq)] pub struct PredicateDeclaration { pub name: String, pub arity: usize, } #[derive(PartialEq)] pub struct Predicate { pub declaration: PredicateDeclaration, pub arguments: Vec, } #[derive(PartialEq)] pub struct Exists { pub parameters: Vec, pub argument: Box, } #[derive(PartialEq)] pub struct ForAll { pub parameters: Vec, pub argument: Box, } #[derive(PartialEq)] pub enum ImplicationDirection { LeftToRight, RightToLeft, } #[derive(PartialEq)] pub enum Formula { Exists(Exists), ForAll(ForAll), Not(Box), And(Vec>), Or(Vec>), Implies(Box, Box, ImplicationDirection), Biconditional(Box, Box), Less(Term, Term), LessOrEqual(Term, Term), Greater(Term, Term), GreaterOrEqual(Term, Term), Equal(Term, Term), NotEqual(Term, Term), Boolean(bool), Predicate(Predicate), } #[derive(Eq, Hash, PartialEq)] pub enum Domain { Program, Integer, } #[derive(PartialEq)] pub struct VariableDeclaration { pub name: String, pub domain: Domain, } #[derive(PartialEq)] pub enum Term { Infimum, Supremum, Integer(i64), Symbolic(String), String(String), Variable(VariableDeclaration), Add(Box, Box), Subtract(Box, Box), Multiply(Box, Box), Negative(Box), }