summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/theory/strings/regexp_operation.cpp30
1 files changed, 22 insertions, 8 deletions
diff --git a/src/theory/strings/regexp_operation.cpp b/src/theory/strings/regexp_operation.cpp
index aaf1c864f..b4d748a71 100644
--- a/src/theory/strings/regexp_operation.cpp
+++ b/src/theory/strings/regexp_operation.cpp
@@ -1168,17 +1168,31 @@ void RegExpOpr::simplifyPRegExp( Node s, Node r, std::vector< Node > &new_nodes
} else if(r[0].getKind() == kind::REGEXP_SIGMA) {
conc = d_true;
} else {
+ NodeManager* nm = NodeManager::currentNM();
Node se = s.eqNode(d_emptyString);
Node sinr = NodeManager::currentNM()->mkNode(kind::STRING_IN_REGEXP, s, r[0]);
- Node sk1 = NodeManager::currentNM()->mkSkolem( "rs", s.getType(), "created for regular expression star" );
- Node sk2 = NodeManager::currentNM()->mkSkolem( "rs", s.getType(), "created for regular expression star" );
- Node s1nz = sk1.eqNode(d_emptyString).negate();
- Node s2nz = sk2.eqNode(d_emptyString).negate();
- Node s1inr = NodeManager::currentNM()->mkNode(kind::STRING_IN_REGEXP, sk1, r[0]);
- Node s2inrs = NodeManager::currentNM()->mkNode(kind::STRING_IN_REGEXP, sk2, r);
- Node s12 = s.eqNode(NodeManager::currentNM()->mkNode(kind::STRING_CONCAT, sk1, sk2));
- conc = NodeManager::currentNM()->mkNode(kind::AND, s12, s1nz, s2nz, s1inr, s2inrs);
+ conc = d_true;
+ for (bool rev : {false, true})
+ {
+ Node sk1 = NodeManager::currentNM()->mkSkolem(
+ "rs", s.getType(), "created for regular expression star");
+ Node sk2 = NodeManager::currentNM()->mkSkolem(
+ "rs", s.getType(), "created for regular expression star");
+ Node s1nz = sk1.eqNode(d_emptyString).negate();
+ Node s2nz = sk2.eqNode(d_emptyString).negate();
+ Node s1inr = NodeManager::currentNM()->mkNode(
+ kind::STRING_IN_REGEXP, sk1, r[0]);
+ Node s2inrs = NodeManager::currentNM()->mkNode(
+ kind::STRING_IN_REGEXP, sk2, r);
+ Node s12 = s.eqNode(nm->mkNode(
+ kind::STRING_CONCAT, rev ? sk1 : sk2, rev ? sk2 : sk1));
+
+ conc = nm->mkNode(
+ kind::AND,
+ nm->mkNode(kind::AND, s12, s1nz, s2nz, s1inr, s2inrs),
+ conc);
+ }
conc = NodeManager::currentNM()->mkNode(kind::OR, se, sinr, conc);
}
break;
generated by cgit on debian on lair
contact matthew@masot.net with questions or feedback