1
use conjure_cp::{
2
    ast::{
3
        Atom, Expression as Expr, Metadata, Moo, SymbolTable, SymbolTablePtr,
4
        ac_operators::ACOperatorKind, comprehension::ComprehensionBuilder,
5
    },
6
    bug,
7
    rule_engine::{
8
        ApplicationError::RuleNotApplicable, ApplicationResult, Reduction, register_rule,
9
    },
10
};
11

            
12
// A subsetEq B ~~> and([ i in B | i <- A ])
13
#[register_rule("Base", 8700, [SubsetEq])]
14
1958068
fn subseteq_set(expr: &Expr, scope: &SymbolTable) -> ApplicationResult {
15
1958068
    match expr {
16
6
        Expr::SubsetEq(_, a, b) => {
17
6
            let scope_ptr = SymbolTablePtr::new();
18
6
            *scope_ptr.write() = scope.clone();
19
6
            let mut comp_builder = ComprehensionBuilder::new(scope_ptr);
20

            
21
6
            let quant_name = comp_builder
22
6
                .generator_symboltable()
23
6
                .write()
24
6
                .clone()
25
6
                .gen_sym();
26

            
27
6
            comp_builder = comp_builder.expression_generator(quant_name.clone(), a.clone().into());
28
6
            let Some(quant_ptr) = comp_builder
29
6
                .generator_symboltable()
30
6
                .read()
31
6
                .lookup_local(&quant_name)
32
            else {
33
                bug!("Could not find quantified variable name in subseteq rule symbol table")
34
            };
35

            
36
6
            let return_expr = Expr::In(
37
6
                Metadata::new(),
38
6
                Moo::new(Expr::Atomic(Metadata::new(), Atom::new_ref(quant_ptr))),
39
6
                b.clone(),
40
6
            );
41

            
42
6
            let comp = comp_builder.with_return_value(return_expr, Some(ACOperatorKind::And));
43

            
44
6
            Ok(Reduction::pure(Expr::And(
45
6
                Metadata::new(),
46
6
                Moo::new(Expr::Comprehension(Metadata::new(), Moo::new(comp))),
47
6
            )))
48
        }
49
1958062
        _ => Err(RuleNotApplicable),
50
    }
51
1958068
}