diff --git a/src/anthem/Simplification.cpp b/src/anthem/Simplification.cpp index e4f69b4..7f6ffdb 100644 --- a/src/anthem/Simplification.cpp +++ b/src/anthem/Simplification.cpp @@ -379,9 +379,34 @@ struct SimplificationRuleSubsumptionInBiconditionals //////////////////////////////////////////////////////////////////////////////////////////////////// +struct SimplificationRuleDoubleNegation +{ + static constexpr const auto Description = "not not F === F"; + + static SimplificationResult apply(ast::Formula &formula) + { + if (!formula.is()) + return SimplificationResult::Unchanged; + + auto ¬_ = formula.get(); + + if (!not_.argument.is()) + return SimplificationResult::Unchanged; + + auto ¬Not = not_.argument.get(); + + formula = std::move(notNot.argument); + + return SimplificationResult::Simplified; + } +}; + +//////////////////////////////////////////////////////////////////////////////////////////////////// + const auto simplifyWithDefaultRules = simplify < + SimplificationRuleDoubleNegation, SimplificationRuleTrivialAssignmentInExists, SimplificationRuleAssignmentInExists, SimplificationRuleEmptyConjunction, diff --git a/tests/TestHiddenPredicateElimination.cpp b/tests/TestHiddenPredicateElimination.cpp index 04d0089..a6cfa0e 100644 --- a/tests/TestHiddenPredicateElimination.cpp +++ b/tests/TestHiddenPredicateElimination.cpp @@ -103,9 +103,10 @@ TEST_CASE("[hidden predicate elimination] Hidden predicates are correctly elimin "#show a/1."; anthem::translate("input", input, context); + // TODO: simplify further CHECK(output.str() == "forall V1 (a(V1) <-> not d(V1))\n" - "forall V2 (d(V2) <-> not not d(V2))\n" + "forall V2 (d(V2) <-> d(V2))\n" "forall V3 (e(V3) <-> e(V3))\n"); }