diff --git a/rsprocess/src/boolean.rs b/rsprocess/src/boolean.rs index 5f38d41..fc247da 100644 --- a/rsprocess/src/boolean.rs +++ b/rsprocess/src/boolean.rs @@ -16,6 +16,21 @@ pub enum BooleanFunction { Or(Box, Box), } +impl BooleanFunction { + pub fn evaluate(&self, assignments: &BTreeMap) -> bool { + match self { + | Self::False => false, + | Self::True => true, + | Self::Not(bf) => !bf.evaluate(assignments), + | Self::Variable(i) => *assignments.get(i).unwrap_or(&false), + | Self::And(bf1, bf2) => + bf1.evaluate(assignments) && bf2.evaluate(assignments), + | Self::Or(bf1, bf2) => + bf1.evaluate(assignments) || bf2.evaluate(assignments), + } + } +} + impl PrintableWithTranslator for BooleanFunction { fn print( &self, @@ -258,6 +273,22 @@ pub struct BooleanNetwork { update_rules: BTreeMap, } +impl BooleanNetwork { + pub fn step(&self) -> BooleanNetwork { + BooleanNetwork { + initial_state: { + BTreeMap::from_iter( + self.update_rules + .iter() + .map(|(el, bf)| (*el, bf.evaluate(&self.initial_state))) + .collect::>(), + ) + }, + update_rules: self.update_rules.clone(), + } + } +} + impl PrintableWithTranslator for BooleanNetwork { fn print( &self,