conjure_core/rules/normalisers/
neg_minus.rs1use conjure_core::ast::Expression as Expr;
30use conjure_core::rule_engine::{
31 register_rule, ApplicationError::RuleNotApplicable, ApplicationResult, Reduction,
32};
33use uniplate::{Biplate, Uniplate as _};
34use Expr::*;
35
36use crate::ast::{Atom, Literal as Lit, SymbolTable};
37use crate::metadata::Metadata;
38use std::collections::VecDeque;
39
40#[register_rule(("Base", 8400))]
46fn elmininate_double_negation(expr: &Expr, _: &SymbolTable) -> ApplicationResult {
47 match expr {
48 Neg(_, a) if matches!(**a, Neg(_, _)) => Ok(Reduction::pure(a.children()[0].clone())),
49 _ => Err(RuleNotApplicable),
50 }
51}
52
53#[register_rule(("Base", 8400))]
59fn distribute_negation_over_sum(expr: &Expr, _: &SymbolTable) -> ApplicationResult {
60 let inner_expr = match expr {
61 Neg(_, e) if matches!(**e, Sum(_, _)) => Ok(*e.clone()),
62 _ => Err(RuleNotApplicable),
63 }?;
64
65 let mut child_vecs: VecDeque<Vec<Expr>> = inner_expr.children_bi();
66
67 if child_vecs.is_empty() {
68 return Err(RuleNotApplicable);
69 }
70
71 for child in child_vecs[0].iter_mut() {
72 *child = Neg(Metadata::new(), Box::new(child.clone()))
73 }
74
75 Ok(Reduction::pure(inner_expr.with_children_bi(child_vecs)))
76}
77
78#[register_rule(("Base", 8400))]
84fn simplify_negation_of_product(expr: &Expr, _: &SymbolTable) -> ApplicationResult {
85 let Expr::Neg(_, expr1) = expr.clone() else {
86 return Err(RuleNotApplicable);
87 };
88
89 let Expr::Product(_, mut factors) = *expr1 else {
90 return Err(RuleNotApplicable);
91 };
92
93 factors.push(Expr::Atomic(Metadata::new(), Atom::Literal(Lit::Int(-1))));
94
95 Ok(Reduction::pure(Expr::Product(Metadata::new(), factors)))
96}
97
98#[register_rule(("Base", 8400))]
104fn minus_to_sum(expr: &Expr, _: &SymbolTable) -> ApplicationResult {
105 let (lhs, rhs) = match expr {
106 Minus(_, lhs, rhs) => Ok((lhs.clone(), rhs.clone())),
107 _ => Err(RuleNotApplicable),
108 }?;
109
110 Ok(Reduction::pure(Sum(
111 Metadata::new(),
112 vec![*lhs, Neg(Metadata::new(), rhs)],
113 )))
114}