diff --git a/apps/UnitTestsApp/src/UnitTests.cpp b/apps/UnitTestsApp/src/UnitTests.cpp index 0645f94a..9136becc 100644 --- a/apps/UnitTestsApp/src/UnitTests.cpp +++ b/apps/UnitTestsApp/src/UnitTests.cpp @@ -786,9 +786,9 @@ TEST(TestBisimilar, MFA_Bisimilar) { ASSERT_TRUE(MemoryFiniteAutomaton::bisimilar(BackRefRegex("[aa*]:1a&1").to_mfa_additional(), BackRefRegex("a[a*a]:1&1").to_mfa_additional()) .value()); - // ASSERT_FALSE(MemoryFiniteAutomaton::bisimilar(BackRefRegex("[a*]:1a*&1").to_mfa_additional(), - // BackRefRegex("a*[a*]:1&1").to_mfa_additional()) - // .value()); + ASSERT_FALSE(MemoryFiniteAutomaton::bisimilar(BackRefRegex("[a*]:1a*&1").to_mfa_additional(), + BackRefRegex("a*[a*]:1&1").to_mfa_additional()) + .value()); ASSERT_TRUE(MemoryFiniteAutomaton::bisimilar(BackRefRegex("[ab]:2cab&2").to_mfa_additional(), BackRefRegex("abc[ab]:2&2").to_mfa_additional()) .value()); diff --git a/libs/Objects/include/Objects/MemoryCommon.h b/libs/Objects/include/Objects/MemoryCommon.h index c2a98fe1..79c0729c 100644 --- a/libs/Objects/include/Objects/MemoryCommon.h +++ b/libs/Objects/include/Objects/MemoryCommon.h @@ -30,6 +30,7 @@ struct CaptureGroup { int index; int class_num; + static const int reset_class = -1; bool operator==(const State& other) const; struct Hasher { diff --git a/libs/Objects/src/MemoryCommon.cpp b/libs/Objects/src/MemoryCommon.cpp index f8da4c06..0f5ec97b 100644 --- a/libs/Objects/src/MemoryCommon.cpp +++ b/libs/Objects/src/MemoryCommon.cpp @@ -42,8 +42,9 @@ CaptureGroup::CaptureGroup(int cell, const std::vector>& _trace for (const auto& trace : _traces) { traces.insert(trace); for (auto st : trace) { - states.insert({st, _state_classes[st]}); - state_classes.insert(_state_classes[st]); + int class_num = (trace.size() > 1) ? _state_classes[st] : State::reset_class; + states.insert({st, class_num}); + state_classes.insert(class_num); } } } @@ -56,7 +57,7 @@ std::unordered_set CaptureGroup::get_states_diff( const std::unordered_set& other_state_classes) const { std::unordered_set res; for (auto st : states) - if (!other_state_classes.count(st.class_num)) + if (st.class_num != State::reset_class && !other_state_classes.count(st.class_num)) res.insert(st.index); for (const auto& trace : traces) diff --git a/libs/Objects/src/MemoryFiniteAutomaton.cpp b/libs/Objects/src/MemoryFiniteAutomaton.cpp index 76dabd27..63b96ff8 100644 --- a/libs/Objects/src/MemoryFiniteAutomaton.cpp +++ b/libs/Objects/src/MemoryFiniteAutomaton.cpp @@ -1534,7 +1534,7 @@ optional MemoryFiniteAutomaton::bisimilarity_checker(const MemoryFiniteAut CGs2_fa(fas[1].get_subautomaton(CGs2[0])); for (int i = 1; i < CGs1.size(); i++) CGs1_fa = FiniteAutomaton::uunion(CGs1_fa, fas[0].get_subautomaton(CGs1[i])); - for (int i = 1; i < CGs1.size(); i++) + for (int i = 1; i < CGs2.size(); i++) CGs2_fa = FiniteAutomaton::uunion(CGs2_fa, fas[1].get_subautomaton(CGs2[i])); if (!FiniteAutomaton::equivalent(CGs1_fa, CGs2_fa)) return false;