Skip to content

Commit 606754c

Browse files
fix #2262
Signed-off-by: Nikolaj Bjorner <[email protected]>
1 parent bd46c52 commit 606754c

File tree

3 files changed

+37
-51
lines changed

3 files changed

+37
-51
lines changed

src/math/automata/automaton.h

Lines changed: 23 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -348,6 +348,7 @@ class automaton {
348348
//
349349
void compress() {
350350
SASSERT(!m_delta.empty());
351+
TRACE("seq", display(tout););
351352
for (unsigned i = 0; i < m_delta.size(); ++i) {
352353
for (unsigned j = 0; j < m_delta[i].size(); ++j) {
353354
move const& mv = m_delta[i][j];
@@ -460,6 +461,7 @@ class automaton {
460461
}
461462
}
462463
sinkify_dead_states();
464+
TRACE("seq", display(tout););
463465
}
464466

465467
bool is_sequence(unsigned& length) const {
@@ -559,9 +561,8 @@ class automaton {
559561
template<class D>
560562
std::ostream& display(std::ostream& out, D& displayer = D()) const {
561563
out << "init: " << init() << "\n";
562-
out << "final: ";
563-
for (unsigned i = 0; i < m_final_states.size(); ++i) out << m_final_states[i] << " ";
564-
out << "\n";
564+
out << "final: " << m_final_states << "\n";
565+
565566
for (unsigned i = 0; i < m_delta.size(); ++i) {
566567
moves const& mvs = m_delta[i];
567568
for (move const& mv : mvs) {
@@ -577,6 +578,22 @@ class automaton {
577578
}
578579
private:
579580

581+
std::ostream& display(std::ostream& out) const {
582+
out << "init: " << init() << "\n";
583+
out << "final: " << m_final_states << "\n";
584+
585+
for (unsigned i = 0; i < m_delta.size(); ++i) {
586+
moves const& mvs = m_delta[i];
587+
for (move const& mv : mvs) {
588+
out << i << " -> " << mv.dst() << " ";
589+
if (mv.t()) {
590+
out << "if *** ";
591+
}
592+
out << "\n";
593+
}
594+
}
595+
return out;
596+
}
580597
void sinkify_dead_states() {
581598
uint_set dead_states;
582599
for (unsigned i = 0; i < m_delta.size(); ++i) {
@@ -604,7 +621,9 @@ class automaton {
604621
}
605622
to_remove.reset();
606623
}
607-
TRACE("seq", tout << "remove: " << dead_states << "\n";);
624+
TRACE("seq", tout << "remove: " << dead_states << "\n";
625+
tout << "final: " << m_final_states << "\n";
626+
);
608627
for (unsigned s : dead_states) {
609628
CTRACE("seq", !m_delta[s].empty(), tout << "live state " << s << "\n";);
610629
m_delta[s].reset();

src/math/automata/symbolic_automata_def.h

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -379,9 +379,21 @@ typename symbolic_automata<T, M>::automaton_t* symbolic_automata<T, M>::mk_produ
379379
pair2id.insert(init_pair, 0);
380380
moves_t mvs;
381381
unsigned_vector final;
382-
if (a.is_final_state(a.init()) && b.is_final_state(b.init())) {
383-
final.push_back(0);
382+
unsigned_vector a_init, b_init;
383+
a.get_epsilon_closure(a.init(), a_init);
384+
for (unsigned ia : a_init) {
385+
if (a.is_final_state(ia)) {
386+
b.get_epsilon_closure(b.init(), b_init);
387+
for (unsigned ib : b_init) {
388+
if (b.is_final_state(ib)) {
389+
final.push_back(0);
390+
break;
391+
}
392+
}
393+
break;
394+
}
384395
}
396+
385397
unsigned n = 1;
386398
moves_t mvsA, mvsB;
387399
while (!todo.empty()) {

src/util/critical_flet.h

Lines changed: 0 additions & 45 deletions
This file was deleted.

0 commit comments

Comments
 (0)