1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51
use std::collections::BTreeSet; use l_group_formulas::literal::Literal; use l_group_formulas::short_free_group_term::ShortFreeGroupTerm; use l_group_formulas::Term; #[derive(Debug)] pub struct TinyTruncatedGroup { pub generators: BTreeSet<Literal>, pub elements: Box<BTreeSet<ShortFreeGroupTerm>> } impl TinyTruncatedGroup { pub fn new(generators: BTreeSet<Literal>) -> TinyTruncatedGroup { let mut literals = BTreeSet::new(); let mut elements = BTreeSet::new(); for x in &generators { literals.insert(ShortFreeGroupTerm::from(*x)); literals.insert(ShortFreeGroupTerm::from(x.inverse())); elements.insert(ShortFreeGroupTerm::from(*x)); elements.insert(ShortFreeGroupTerm::from(x.inverse())); } let mut new_elements = BTreeSet::new(); for literal in &literals { for t in &elements { new_elements.insert(*t * *literal); } } for x in &new_elements { elements.insert(*x); } TinyTruncatedGroup { generators: generators, elements: Box::new(elements) } } } pub trait ElementsExceptIdentity { fn elements_except_identity(&self) -> BTreeSet<ShortFreeGroupTerm>; } impl ElementsExceptIdentity for TinyTruncatedGroup { fn elements_except_identity(&self) -> BTreeSet<ShortFreeGroupTerm> { let mut all_elements = self.elements.clone(); all_elements.remove(&ShortFreeGroupTerm::new(None, None, None)); return *all_elements; } }