Do not parse ->/lambda unless --uf-ho enabled (#4544)
authorAndres Noetzli <andres.noetzli@gmail.com>
Mon, 1 Jun 2020 16:41:16 +0000 (09:41 -0700)
committerGitHub <noreply@github.com>
Mon, 1 Jun 2020 16:41:16 +0000 (11:41 -0500)
Fixes #4477. Logic ALL includes higher-order but we currently do not
support solving higher-order problems unless --uf-ho is enabled. This
commit changes the condition under which we parse -> and lambda to
only enabled parsing of those symbols if the logic allows higher-order
constraints and --uf-ho is enabled.

src/parser/smt2/Smt2.g
src/parser/smt2/smt2.cpp
src/parser/smt2/smt2.h
test/regress/CMakeLists.txt
test/regress/regress0/ho/issue4477.smt2 [new file with mode: 0644]

index d591c29deb09edbe7d3c89041e4f37a6ff5b7558..95f4b1a67b47ec946ba453cffbf814fea78fb1e8 100644 (file)
@@ -2630,8 +2630,8 @@ CHAR_TOK : { PARSER_STATE->isTheoryEnabled(theory::THEORY_STRINGS) }? 'char';
 TUPLE_CONST_TOK: { PARSER_STATE->isTheoryEnabled(theory::THEORY_DATATYPES) }? 'mkTuple';
 TUPLE_SEL_TOK: { PARSER_STATE->isTheoryEnabled(theory::THEORY_DATATYPES) }? 'tupSel';
 
-HO_ARROW_TOK : { PARSER_STATE->getLogic().isHigherOrder() }? '->';
-HO_LAMBDA_TOK : { PARSER_STATE->getLogic().isHigherOrder() }? 'lambda';
+HO_ARROW_TOK : { PARSER_STATE->isHoEnabled() }? '->';
+HO_LAMBDA_TOK : { PARSER_STATE->isHoEnabled() }? 'lambda';
 
 /**
  * A sequence of printable ASCII characters (except backslash) that starts
index 91260d1db2a53cd6b24013577b953426c4c457e9..9ca2194f447b33001d98d2d70fc8d8f076a732b3 100644 (file)
@@ -315,6 +315,12 @@ bool Smt2::isTheoryEnabled(theory::TheoryId theory) const
   return d_logic.isTheoryEnabled(theory);
 }
 
+bool Smt2::isHoEnabled() const
+{
+  return getLogic().isHigherOrder()
+         && d_solver->getExprManager()->getOptions().getUfHo();
+}
+
 bool Smt2::logicIsSet() {
   return d_logicSet;
 }
index 35d0886018b4c7d9ebe0d7fc88b602619acaf275..af1e367953b88211c62dd131157d5ccd685de5bf 100644 (file)
@@ -98,6 +98,13 @@ class Smt2 : public Parser
 
   bool isTheoryEnabled(theory::TheoryId theory) const;
 
+  /**
+   * Checks if higher-order support is enabled.
+   *
+   * @return true if higher-order support is enabled, false otherwise
+   */
+  bool isHoEnabled() const;
+
   bool logicIsSet() override;
 
   /**
index 38c60e0e3b7a501dbc5fbd34b269156ff17cf61f..10a1b6ba0b08f709894ed9333e354eaf31807698 100644 (file)
@@ -539,6 +539,7 @@ set(regress_0_tests
   regress0/ho/ho-matching-nested-app.smt2
   regress0/ho/ho-std-fmf.smt2
   regress0/ho/hoa0008.smt2
+  regress0/ho/issue4477.smt2
   regress0/ho/ite-apply-eq.smt2
   regress0/ho/lambda-equality-non-canon.smt2
   regress0/ho/match-middle.smt2
diff --git a/test/regress/regress0/ho/issue4477.smt2 b/test/regress/regress0/ho/issue4477.smt2
new file mode 100644 (file)
index 0000000..7162d26
--- /dev/null
@@ -0,0 +1,11 @@
+; REQUIRES: no-competition
+; SCRUBBER: grep -o "Symbol '->' not declared"
+; EXPECT: Symbol '->' not declared 
+; EXIT: 1
+(set-logic ALL)
+(declare-sort s 0)
+(declare-fun a () s)
+(declare-fun b () s)
+(declare-fun c (s) s)
+(assert (forall ((d (-> s s))) (distinct (d a) (c a) b)))
+(check-sat)