bdd reachable_states(bdd I, bdd T) { bdd C, by, bx = bddfalse; bdd tmp1; do { bdd_addref(bx); by = bx; #if 1 tmp1 = bdd_addref( bdd_apply(T, bx, bddop_and) ); C = bdd_addref( bdd_exist(tmp1, normvarset) ); bdd_delref(tmp1); #else C = bdd_addref( bdd_appex(bx, T, bddop_and, normvar, N*3) ); #endif tmp1 = bdd_addref( bdd_replace(C, pairs) ); bdd_delref(C); C = tmp1; tmp1 = bdd_apply(I, C, bddop_or); bdd_delref(C); bdd_delref(bx); bx = tmp1; /*printf("."); fflush(stdout);*/ } while(bx != by); printf("\n"); return bx; }
/* ML type: bdd -> pairSet -> bdd */ EXTERNML value mlbdd_bdd_replace(value r, value pair) /* ML */ { return mlbdd_make(bdd_replace(Bdd_val(r), PairSet_val(pair))); }