conjure_core/rules/normalisers/
sum.rs

1//! Normalising rules for `Sum`
2
3use conjure_core::ast::Expression as Expr;
4use conjure_core::rule_engine::{register_rule, ApplicationResult, Reduction};
5
6use crate::ast::SymbolTable;
7use crate::rule_engine::ApplicationError::RuleNotApplicable;
8
9/// Removes sums with a single argument.
10///
11/// ```text
12/// sum([a]) ~> a
13/// ```
14#[register_rule(("Base", 8800))]
15fn remove_unit_vector_sum(expr: &Expr, _: &SymbolTable) -> ApplicationResult {
16    let Expr::Sum(_, e) = expr else {
17        return Err(RuleNotApplicable);
18    };
19
20    let exprs = e.as_ref().clone().unwrap_list().ok_or(RuleNotApplicable)?;
21
22    if exprs.len() == 1 {
23        Ok(Reduction::pure(exprs[0].clone()))
24    } else {
25        Err(RuleNotApplicable)
26    }
27}