/// Arithmetic expression tree
pub enum ArithExpr {
Variable(String),
Integer(i64),
Float(f64),
// Binary operations
Add(Box<ArithExpr>, Box<ArithExpr>),
Sub(Box<ArithExpr>, Box<ArithExpr>),
Mul(Box<ArithExpr>, Box<ArithExpr>),
Div(Box<ArithExpr>, Box<ArithExpr>),
Mod(Box<ArithExpr>, Box<ArithExpr>),
// Built-in functions
Abs(Box<ArithExpr>),
Min(Box<ArithExpr>, Box<ArithExpr>),
Max(Box<ArithExpr>, Box<ArithExpr>),
Pow(Box<ArithExpr>, Box<ArithExpr>),
// Type cast: cast(expr, target_type)
Cast(Box<ArithExpr>, ScalarType),
// User-defined function call (inlined before lowering)
FuncCall { name: String, args: Vec<ArithExpr> },
}
/// Is-expression for variable binding
pub struct IsExpr {
pub target: String, // Must be fresh (unbound) variable
pub expr: ArithExpr,
}