/// It stores as much as possible in the term pool. Due to variables it cannot be fully compressed.
/// For variables it stores the position in the lhs of a rewrite rule where the concrete term can be
/// For the rewrite rule and(true, true) = true, the SCTT of the rhs will be of type Compressed, with
/// For the rewrite rule minus(x, 0) = x, the SCTT of the rhs will be of type Variable, storing position
pub fn evaluate_with<'a>(&'a self, builder: &mut SCCTBuilder, t: &ATermRef<'_>, tp: &mut TermPool) -> ATerm {
// TODO: Figure out if this can be done properly. This is safe because evaluate will always leave the
let builder: &mut TermBuilder<&'a SemiCompressedTermTree, &'a Symbol> = unsafe { std::mem::transmute(builder) };
pub fn convert_variables(tp: &mut TermPool, t: &ATerm, variables: &AHashSet<String>) -> ATerm {