From 454f1760edff4c0fa0d99aca6f4f6dc9b3043377 Mon Sep 17 00:00:00 2001 From: elvis Date: Sun, 22 Jun 2025 20:55:35 +0200 Subject: [PATCH] Invariant --- src/rsprocess/confluence.rs | 36 ++++++++++++++++++++++++++++++++---- 1 file changed, 32 insertions(+), 4 deletions(-) diff --git a/src/rsprocess/confluence.rs b/src/rsprocess/confluence.rs index 6a459ec..2c3b4c6 100644 --- a/src/rsprocess/confluence.rs +++ b/src/rsprocess/confluence.rs @@ -34,8 +34,7 @@ pub fn confluent( // FIXME we take just the first? do we compare all? let (prefix_len, new_hoop) = all_loops.first()?; - if new_hoop.len() != dimension - || !hoop.contains(new_hoop.first().unwrap()) { + if new_hoop.len() != dimension || !hoop.contains(new_hoop.first()?) { return None; } max_distance = cmp::max(max_distance, *prefix_len); @@ -67,11 +66,40 @@ pub fn confluent_named( available_entities, symb)?; - if new_hoop.len() != dimension - || !hoop.contains(new_hoop.first().unwrap()) { + if new_hoop.len() != dimension || !hoop.contains(new_hoop.first()?) { return None; } max_distance = cmp::max(max_distance, prefix_len); } Some((max_distance, dimension, hoop)) } + +// ----------------------------------------------------------------------------- + +pub fn invariant_named( + delta: &RSenvironment, + reaction_rules: &[RSreaction], + entities: &[RSset], + symb: IdType +) -> Option<(Vec, Vec)> { + let (prefix, hoop) = lollipops_decomposed_named(delta, + reaction_rules, + entities.first()?, + symb)?; + let mut invariant = vec![]; + invariant.append(&mut prefix.clone()); + invariant.append(&mut hoop.clone()); + let dimension = hoop.len(); + + for available_entities in entities { + let (new_prefix, new_hoop) = lollipops_decomposed_named(delta, + reaction_rules, + available_entities, + symb)?; + if new_hoop.len() != dimension || !hoop.contains(new_hoop.first()?) { + return None + } + invariant.append(&mut new_prefix.clone()); + } + Some((invariant, hoop)) +}