1
use merc_syntax::ComplexSort;
2
use merc_syntax::SortExpression;
3

            
4
/// Returns true iff the sort is finite.
5
pub fn is_finite(sort: &SortExpression) -> bool {
6
    match sort {
7
        SortExpression::Product { lhs, rhs } => is_finite(lhs) && is_finite(rhs),
8
        SortExpression::Function { domain, range: _ } => is_finite(domain),
9
        SortExpression::Struct { inner } => inner
10
            .iter()
11
            .all(|decl| decl.args.iter().all(|(_, sort)| is_finite(sort))),
12
        SortExpression::Simple(sort) => match sort {
13
            merc_syntax::Sort::Bool => true,
14
            _ => false, // All number sorts are infinite.
15
        },
16
        SortExpression::Complex(complex_sort, sort_expression) => {
17
            (*complex_sort == ComplexSort::Set || *complex_sort == ComplexSort::FSet) && is_finite(sort_expression)
18
        }
19
        SortExpression::FlattenedFunction { domain, range: _ } => domain.iter().all(|sort| is_finite(sort)),
20
        SortExpression::Reference(_) | SortExpression::Resolved(_, _) => {
21
            unreachable!("is_finite should not be called on reference sorts")
22
        }
23
    }
24
}