//Checks that the proof graph has no issues void ProofGraph::checkProof() { //Visit graph from sink keeping track of edges and nodes std::deque<ProofNode*> q; ProofNode* n; q.push_back(graph[root]); do { n=q.front(); q.pop_front(); //End current level, change level and set new end if(!visited[n->getId()]) { checkClause(n->getId()); if(n->getAnt1()!=NULL || n->getAnt2()!=NULL) { if(n->getAnt1()!=NULL) q.push_back(n->getAnt1()); if(n->getAnt2()!=NULL) q.push_back(n->getAnt2()); } visited[n->getId()]=true; } } while(!q.empty()); visited.reset(); }
// // Check if a formula is a clause // bool Cnfizer::checkClause( Enode * e, set< enodeid_t > & check_cache ) { assert( e ); if ( e->isLit( ) ) { check_cache.insert( e->getId( ) ); // Don't check again return true; } if ( !e->isOr( ) ) return false; if ( check_cache.find( e->getId( ) ) != check_cache.end( ) ) // Already visited term return true; bool is_clause = true; for ( Enode * list = e->getCdr( ) ; list != egraph.enil && is_clause ; list = list->getCdr( ) ) is_clause = checkClause( list->getCar( ), check_cache ); if ( !is_clause ) return false; check_cache.insert( e->getId( ) ); // Don't check again return true; }
// // Check if a formula is a conjunction of clauses // bool Cnfizer::checkConj( Enode * e, set< enodeid_t > & check_cache ) { if ( !e->isAnd( ) ) return false; if ( check_cache.find( e->getId( ) ) != check_cache.end( ) ) // Already visited term return true; Enode * list = e->getCdr( ); for ( ; list != egraph.enil ; list = list->getCdr( ) ) { Enode * arg = list->getCar( ); if( !checkConj( arg, check_cache ) && !checkClause( arg, check_cache ) ) return false; } check_cache.insert( e->getId( ) ); return true; }
// // Check whether a formula is in cnf // bool Cnfizer::checkCnf( Enode * formula ) { set< enodeid_t > check_cache; bool res = checkConj( formula, check_cache ) || checkClause( formula, check_cache ); return res; }