/// This function takes a target expression and a vector of ranges and creates an expression representing the ranges with the target expression as the subject
/// This function confirms that all of the input expressions are log SATInts, and returns vectors for each input of their bits
/// The vector lengths is either `n` for bit_count = Some(n), otherwise the length of the longest operand
// TODO: In the future it may be possible to optimize operations between integers with different bit sizes
// TODO: this file should be encoding agnostic so this needs to moved to the log_int_ops.rs file, do this once the direct ints have been merged to main though
/// Converts an integer decision variable to SATInt form, creating a new representation of boolean variables if
fn integer_decision_representation_direct(expr: &Expr, symbols: &SymbolTable) -> ApplicationResult {
fn integer_decision_representation_order(expr: &Expr, symbols: &SymbolTable) -> ApplicationResult {
fn integer_decision_representation_log(expr: &Expr, symbols: &SymbolTable) -> ApplicationResult {
//TODO: Adding constant optimization to all int operations should hopefully make this rule redundant
/// Given two vectors of expressions, extend the shorter one by repeating its last element until both are the same length