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}