Minor fixes to quantifiers proofs (#5151)
authorAndrew Reynolds <andrew.j.reynolds@gmail.com>
Mon, 28 Sep 2020 23:33:03 +0000 (18:33 -0500)
committerGitHub <noreply@github.com>
Mon, 28 Sep 2020 23:33:03 +0000 (18:33 -0500)
Includes minor changes to the proof checker and a fix in the instantiate module.

src/expr/proof_rule.h
src/theory/quantifiers/instantiate.cpp
src/theory/quantifiers/proof_checker.cpp

index c621bffdcf397fb51b77cdc0f5a77db9984da6bb..9324f68c2423534d18503040e99feed311bb7237 100644 (file)
@@ -563,7 +563,7 @@ enum class PfRule : uint32_t
   // Conclusion: (= F true)
   TRUE_INTRO,
   // ======== True elim
-  // Children: (P:(= F true)
+  // Children: (P:(= F true))
   // Arguments: none
   // ----------------------------------------
   // Conclusion: F
@@ -575,7 +575,7 @@ enum class PfRule : uint32_t
   // Conclusion: (= F false)
   FALSE_INTRO,
   // ======== False elim
-  // Children: (P:(= F false)
+  // Children: (P:(= F false))
   // Arguments: none
   // ----------------------------------------
   // Conclusion: (not F)
@@ -630,11 +630,11 @@ enum class PfRule : uint32_t
 
   //================================================= Quantifiers rules
   // ======== Witness intro
-  // Children: (P:F[t])
-  // Arguments: (t)
+  // Children: (P:(exists ((x T)) F[x]))
+  // Arguments: none
   // ----------------------------------------
-  // Conclusion: (= t (witness ((x T)) F[x]))
-  // where x is a BOUND_VARIABLE unique to the pair F,t.
+  // Conclusion: (= k (witness ((x T)) F[x]))
+  // where k is the Skolem form of (witness ((x T)) F[x]).
   WITNESS_INTRO,
   // ======== Exists intro
   // Children: (P:F[t])
@@ -650,7 +650,7 @@ enum class PfRule : uint32_t
   // Conclusion: F*sigma
   // sigma maps x1 ... xn to their representative skolems obtained by
   // SkolemManager::mkSkolemize, returned in the skolems argument of that
-  // method.
+  // method. Alternatively, can use negated forall as a premise.
   SKOLEMIZE,
   // ======== Instantiate
   // Children: (P:(forall ((x1 T1) ... (xn Tn)) F))
index 0abcd98cb96c524120919fa15274315f73379048..f88c2e7a061cdb0aab1788a07d2db9b946f9e69d 100644 (file)
@@ -272,7 +272,7 @@ bool Instantiate::addInstantiation(
                          "Instantiate::getInstantiation:qpreprocess",
                          false,
                          PfRule::THEORY_PREPROCESS);
-      pfTmp->addStep(body, PfRule::EQ_RESOLVE, {orig_body, proven}, {body});
+      pfTmp->addStep(body, PfRule::EQ_RESOLVE, {orig_body, proven}, {});
     }
   }
   Trace("inst-debug") << "...preprocess to " << body << std::endl;
index 5ba39059193b84ca2e7fc5cd420b4519ff217aea..e2a416120522b21fa7610e21c3551bfea6317407 100644 (file)
@@ -36,23 +36,30 @@ Node QuantifiersProofRuleChecker::checkInternal(
     PfRule id, const std::vector<Node>& children, const std::vector<Node>& args)
 {
   NodeManager* nm = NodeManager::currentNM();
+  SkolemManager* sm = nm->getSkolemManager();
   // compute what was proven
-  if (id == PfRule::WITNESS_INTRO || id == PfRule::EXISTS_INTRO)
+  if (id == PfRule::EXISTS_INTRO)
   {
     Assert(children.size() == 1);
     Assert(args.size() == 1);
-    SkolemManager* sm = nm->getSkolemManager();
     Node p = children[0];
     Node t = args[0];
-    Node exists = sm->mkExistential(t, p);
-    if (id == PfRule::EXISTS_INTRO)
+    return sm->mkExistential(t, p);
+  }
+  else if (id == PfRule::WITNESS_INTRO)
+  {
+    Assert(children.size() == 1);
+    Assert(args.empty());
+    if (children[0].getKind() != EXISTS || children[0][0].getNumChildren() != 1)
     {
-      return exists;
+      return Node::null();
     }
     std::vector<Node> skolems;
-    sm->mkSkolemize(exists, skolems, "k");
+    sm->mkSkolemize(children[0], skolems, "k");
     Assert(skolems.size() == 1);
-    return skolems[0];
+    Node witness = SkolemManager::getWitnessForm(skolems[0]);
+    Assert(witness.getKind() == WITNESS && witness[0] == children[0][0]);
+    return skolems[0].eqNode(witness);
   }
   else if (id == PfRule::SKOLEMIZE)
   {
@@ -64,7 +71,6 @@ Node QuantifiersProofRuleChecker::checkInternal(
     {
       return Node::null();
     }
-    SkolemManager* sm = nm->getSkolemManager();
     Node exists;
     if (children[0].getKind() == EXISTS)
     {