rl_tatam/
expr.rs

1use std::collections::HashSet;
2
3use super::*;
4use naming::*;
5use rl_model::model::expr::*;
6
7pub fn expr_to_tatam(skillset: &Skillset, expr: &Expr) -> String {
8    match expr {
9        Expr::True => "true".into(),
10        Expr::False => "false".into(),
11        Expr::ResourceEq(id, state) => {
12            let resource = skillset.get(id.resolved()).unwrap();
13            let state = skillset.get(state.resolved()).unwrap();
14            format!(
15                "({} = {})",
16                resource_var(skillset, resource),
17                resource_state(skillset, state)
18            )
19        }
20        Expr::ResourceNe(id, state) => {
21            let resource = skillset.get(id.resolved()).unwrap();
22            let state = skillset.get(state.resolved()).unwrap();
23            format!(
24                "({} != {})",
25                resource_var(skillset, resource),
26                resource_state(skillset, state)
27            )
28        }
29        Expr::Not(e) => format!("(not {})", expr_to_tatam(skillset, e)),
30        Expr::And(l, r) => format!(
31            "({} and {})",
32            expr_to_tatam(skillset, l),
33            expr_to_tatam(skillset, r)
34        ),
35        Expr::Or(l, r) => format!(
36            "({} or {})",
37            expr_to_tatam(skillset, l),
38            expr_to_tatam(skillset, r)
39        ),
40        Expr::Implies(l, r) => format!(
41            "({} implies {})",
42            expr_to_tatam(skillset, l),
43            expr_to_tatam(skillset, r)
44        ),
45    }
46}
47
48pub fn next_expr_to_tatam(skillset: &Skillset, expr: &Expr) -> String {
49    match expr {
50        Expr::True => "true".into(),
51        Expr::False => "false".into(),
52        Expr::ResourceEq(id, state) => {
53            let resource = skillset.get(id.resolved()).unwrap();
54            let state = skillset.get(state.resolved()).unwrap();
55            format!(
56                "({}' = {})",
57                resource_var(skillset, resource),
58                resource_state(skillset, state)
59            )
60        }
61        Expr::ResourceNe(id, state) => {
62            let resource = skillset.get(id.resolved()).unwrap();
63            let state = skillset.get(state.resolved()).unwrap();
64            format!(
65                "({}' != {})",
66                resource_var(skillset, resource),
67                resource_state(skillset, state)
68            )
69        }
70        Expr::Not(e) => format!("(not {})", next_expr_to_tatam(skillset, e)),
71        Expr::And(l, r) => format!(
72            "({} and {})",
73            next_expr_to_tatam(skillset, l),
74            next_expr_to_tatam(skillset, r)
75        ),
76        Expr::Or(l, r) => format!(
77            "({} or {})",
78            next_expr_to_tatam(skillset, l),
79            next_expr_to_tatam(skillset, r)
80        ),
81        Expr::Implies(l, r) => format!(
82            "({} implies {})",
83            next_expr_to_tatam(skillset, l),
84            next_expr_to_tatam(skillset, r)
85        ),
86    }
87}
88
89pub fn expr_resources(expr: &Expr) -> HashSet<ResourceId> {
90    match expr {
91        Expr::True => HashSet::default(),
92        Expr::False => HashSet::default(),
93        Expr::ResourceEq(r, _) => {
94            let mut resources = HashSet::default();
95            resources.insert(r.resolved());
96            resources
97        }
98        Expr::ResourceNe(r, _) => {
99            let mut resources = HashSet::default();
100            resources.insert(r.resolved());
101            resources
102        }
103        Expr::Not(e) => expr_resources(e),
104        Expr::And(l, r) => {
105            let mut resources = HashSet::default();
106            resources.extend(expr_resources(l));
107            resources.extend(expr_resources(r));
108            resources
109        }
110        Expr::Or(l, r) => {
111            let mut resources = HashSet::default();
112            resources.extend(expr_resources(l));
113            resources.extend(expr_resources(r));
114            resources
115        }
116        Expr::Implies(l, r) => {
117            let mut resources = HashSet::default();
118            resources.extend(expr_resources(l));
119            resources.extend(expr_resources(r));
120            resources
121        }
122    }
123}