diff options
Diffstat (limited to 'omegalib/omega/src/pres_rear.cc')
-rw-r--r-- | omegalib/omega/src/pres_rear.cc | 131 |
1 files changed, 0 insertions, 131 deletions
diff --git a/omegalib/omega/src/pres_rear.cc b/omegalib/omega/src/pres_rear.cc deleted file mode 100644 index 508959d..0000000 --- a/omegalib/omega/src/pres_rear.cc +++ /dev/null @@ -1,131 +0,0 @@ -#include <omega/pres_tree.h> -#include <omega/pres_conj.h> -#include <omega/Relation.h> -#include <omega/omega_i.h> - -namespace omega { - -///////////////////////// -// // -// Rearrange functions // -// // -///////////////////////// - -// -// Rules: -// ~ (f1 | f2 | ... | fn) = ~f1 & ~f2 & ... & fn -// ~ ~ f = f -// Forall v: f = ~ (Exists v: ~ f) -// Exists v: (f1 | ... | fn) = (Exists v: f1) | ... | (Exists v: fn) -// - -void Rel_Body::rearrange() { - assert(children().length()==1); - - skip_finalization_check++; - formula()->rearrange(); - skip_finalization_check--; - - if(pres_debug) { - fprintf(DebugFile, "\n=== Rearranged TREE ===\n"); - prefix_print(DebugFile); - } -} - -void Formula::rearrange() { - // copy list of children, as they may be removed as we work - List<Formula*> kiddies = myChildren; - - for(List_Iterator<Formula*> c(kiddies); c; c++) - (*c)->rearrange(); -} - -// -// Push nots down the tree until quantifier or conjunct, rearrange kids -// -void F_Not::rearrange() { - Formula *child = children().front(); - Formula *new_child, *f; - - switch(child->node_type()) { - case Op_Or: - parent().remove_child(this); - new_child = parent().add_and(); - while(!child->children().empty()) { - f = child->children().remove_front(); - F_Not *new_not = new_child->add_not(); - new_not->add_child(f); - } - delete this; - break; -//case Op_And: -// parent().remove_child(this); -// new_child = parent().add_or(); -// while(!child->myChildren.empty()) { -// f = child->myChildren.remove_front(); -// F_Not *new_not = new_child->add_not(); -// new_not->add_child(f); -// } -// delete this; -// break; - case Op_Not: - parent().remove_child(this); - f = child->children().remove_front(); - parent().add_child(f); - delete this; - f->rearrange(); - return; - default: - new_child = child; - break; - } - - new_child->rearrange(); -} - -// -// Convert a universal quantifier to "not exists not". -// Forall v: f = ~ (Exists v: ~ f) -// -void F_Forall::rearrange() { - Formula &p = parent(); - p.remove_child(this); - - F_Not *topnot = p.add_not(); - F_Exists *exist = topnot->add_exists(); - for (Variable_ID_Iterator VI(myLocals); VI; VI++) - (*VI)->set_kind(Exists_Var); - exist->myLocals.join(myLocals); - - F_Not *botnot = exist->add_not(); - Formula *f = children().remove_front(); - botnot->add_child(f); - - delete this; - - botnot->rearrange(); -} - -// -// Exists v: (f1 | ... | fn) = (Exists v: f1) | ... | (Exists v: fn) -// -void F_Exists::rearrange() { - Formula* child = children().front(); - switch(child->node_type()) { - case Op_Or: - case Op_Conjunct: - case Op_Exists: - child->push_exists(myLocals); - parent().remove_child(this); - parent().add_child(child); - children().remove_front(); - delete this; - break; - default: - break; - } - - child->rearrange(); -} - -} // namespace |