Search in sources :

Example 6 with OrExpr

use of org.batfish.z3.expr.OrExpr in project batfish by batfish.

the class SimplifierTest method testSimplifyOr1.

/**
 * Test that an OR node with a single child (other than TRUE or FALSE) simplifies to that child.
 */
@Test
public void testSimplifyOr1() {
    BooleanExpr p1 = newAtom();
    OrExpr or = new OrExpr(of(p1));
    assertThat(simplifyBooleanExpr(or), equalTo(p1));
}
Also used : BooleanExpr(org.batfish.z3.expr.BooleanExpr) Simplifier.simplifyBooleanExpr(org.batfish.z3.expr.visitors.Simplifier.simplifyBooleanExpr) OrExpr(org.batfish.z3.expr.OrExpr) Test(org.junit.Test)

Example 7 with OrExpr

use of org.batfish.z3.expr.OrExpr in project batfish by batfish.

the class SimplifierTest method testSimplifyOrTrue.

/**
 * Test that an OR node with a TRUE child simplifies to TRUE.
 */
@Test
public void testSimplifyOrTrue() {
    BooleanExpr p1 = newAtom();
    OrExpr or = new OrExpr(of(p1, TrueExpr.INSTANCE));
    assertThat(simplifyBooleanExpr(or), equalTo(TrueExpr.INSTANCE));
}
Also used : BooleanExpr(org.batfish.z3.expr.BooleanExpr) Simplifier.simplifyBooleanExpr(org.batfish.z3.expr.visitors.Simplifier.simplifyBooleanExpr) OrExpr(org.batfish.z3.expr.OrExpr) Test(org.junit.Test)

Example 8 with OrExpr

use of org.batfish.z3.expr.OrExpr in project batfish by batfish.

the class Simplifier method visitOrExpr.

@Override
public BooleanExpr visitOrExpr(OrExpr orExpr) {
    boolean changed = false;
    List<BooleanExpr> oldDisjuncts = orExpr.getDisjuncts();
    ImmutableList.Builder<BooleanExpr> newDisjunctsBuilder = ImmutableList.builder();
    // first check for nested ORs
    if (oldDisjuncts.stream().anyMatch(Predicates.instanceOf(OrExpr.class))) {
        return simplifyBooleanExpr(new OrExpr(oldDisjuncts.stream().flatMap(disjunct -> disjunct instanceof OrExpr ? ((OrExpr) disjunct).getDisjuncts().stream() : Stream.of(disjunct)).collect(ImmutableList.toImmutableList())));
    }
    // no nested ORs, so just simplify all disjuncts
    for (BooleanExpr disjunct : oldDisjuncts) {
        BooleanExpr simplifiedDisjunct = simplifyBooleanExpr(disjunct);
        if (disjunct != simplifiedDisjunct) {
            changed = true;
        }
        if (simplifiedDisjunct == TrueExpr.INSTANCE) {
            return TrueExpr.INSTANCE;
        } else if (simplifiedDisjunct != FalseExpr.INSTANCE) {
            newDisjunctsBuilder.add(simplifiedDisjunct);
        } else {
            changed = true;
        }
    }
    List<BooleanExpr> newDisjuncts = newDisjunctsBuilder.build();
    if (newDisjuncts.size() == 0) {
        return FalseExpr.INSTANCE;
    } else if (newDisjuncts.size() == 1) {
        return newDisjuncts.get(0);
    } else if (!changed) {
        return orExpr;
    } else {
        return new OrExpr(newDisjuncts);
    }
}
Also used : Statement(org.batfish.z3.expr.Statement) PrefixMatchExpr(org.batfish.z3.expr.PrefixMatchExpr) OrExpr(org.batfish.z3.expr.OrExpr) TrueExpr(org.batfish.z3.expr.TrueExpr) IntExpr(org.batfish.z3.expr.IntExpr) TransformationRuleStatement(org.batfish.z3.expr.TransformationRuleStatement) GenericStatementVisitor(org.batfish.z3.expr.GenericStatementVisitor) ImmutableList(com.google.common.collect.ImmutableList) ExtractExpr(org.batfish.z3.expr.ExtractExpr) Predicates(com.google.common.base.Predicates) StateExpr(org.batfish.z3.expr.StateExpr) HeaderSpaceMatchExpr(org.batfish.z3.expr.HeaderSpaceMatchExpr) IfExpr(org.batfish.z3.expr.IfExpr) BooleanExpr(org.batfish.z3.expr.BooleanExpr) Expr(org.batfish.z3.expr.Expr) BitVecExpr(org.batfish.z3.expr.BitVecExpr) FalseExpr(org.batfish.z3.expr.FalseExpr) IpSpaceMatchExpr(org.batfish.z3.expr.IpSpaceMatchExpr) IfThenElse(org.batfish.z3.expr.IfThenElse) NotExpr(org.batfish.z3.expr.NotExpr) VarIntExpr(org.batfish.z3.expr.VarIntExpr) Comment(org.batfish.z3.expr.Comment) BasicRuleStatement(org.batfish.z3.expr.BasicRuleStatement) SaneExpr(org.batfish.z3.expr.SaneExpr) AndExpr(org.batfish.z3.expr.AndExpr) List(java.util.List) Stream(java.util.stream.Stream) LitIntExpr(org.batfish.z3.expr.LitIntExpr) CurrentIsOriginalExpr(org.batfish.z3.expr.CurrentIsOriginalExpr) EqExpr(org.batfish.z3.expr.EqExpr) QueryStatement(org.batfish.z3.expr.QueryStatement) RangeMatchExpr(org.batfish.z3.expr.RangeMatchExpr) IdExpr(org.batfish.z3.expr.IdExpr) ListExpr(org.batfish.z3.expr.ListExpr) ImmutableList(com.google.common.collect.ImmutableList) BooleanExpr(org.batfish.z3.expr.BooleanExpr) OrExpr(org.batfish.z3.expr.OrExpr)

Aggregations

OrExpr (org.batfish.z3.expr.OrExpr)7 Test (org.junit.Test)6 BooleanExpr (org.batfish.z3.expr.BooleanExpr)5 Simplifier.simplifyBooleanExpr (org.batfish.z3.expr.visitors.Simplifier.simplifyBooleanExpr)3 BasicRuleStatement (org.batfish.z3.expr.BasicRuleStatement)2 Predicates (com.google.common.base.Predicates)1 ImmutableList (com.google.common.collect.ImmutableList)1 BoolExpr (com.microsoft.z3.BoolExpr)1 List (java.util.List)1 Stream (java.util.stream.Stream)1 AndExpr (org.batfish.z3.expr.AndExpr)1 BitVecExpr (org.batfish.z3.expr.BitVecExpr)1 Comment (org.batfish.z3.expr.Comment)1 CurrentIsOriginalExpr (org.batfish.z3.expr.CurrentIsOriginalExpr)1 EqExpr (org.batfish.z3.expr.EqExpr)1 Expr (org.batfish.z3.expr.Expr)1 ExtractExpr (org.batfish.z3.expr.ExtractExpr)1 FalseExpr (org.batfish.z3.expr.FalseExpr)1 GenericStatementVisitor (org.batfish.z3.expr.GenericStatementVisitor)1 HeaderSpaceMatchExpr (org.batfish.z3.expr.HeaderSpaceMatchExpr)1