diff --git a/src/anthem/Simplification.cpp b/src/anthem/Simplification.cpp index d7e8bd8..e85a369 100644 --- a/src/anthem/Simplification.cpp +++ b/src/anthem/Simplification.cpp @@ -251,6 +251,28 @@ struct SimplificationRuleEmptyConjunction //////////////////////////////////////////////////////////////////////////////////////////////////// +struct SimplificationRuleOneElementConjunction +{ + static constexpr const auto Description = "[conjunction of only F] === F"; + + static SimplificationResult apply(ast::Formula &formula) + { + if (!formula.is()) + return SimplificationResult::Unchanged; + + auto &and_ = formula.get(); + + if (and_.arguments.size() != 1) + return SimplificationResult::Unchanged; + + formula = std::move(and_.arguments.front()); + + return SimplificationResult::Simplified; + } +}; + +//////////////////////////////////////////////////////////////////////////////////////////////////// + struct SimplificationRuleTrivialExists { static constexpr const auto Description = "exists ... ([#true/#false]) === [#true/#false]"; @@ -278,25 +300,14 @@ void simplify(ast::Exists &exists, ast::Formula &formula) SimplificationRuleTrivialAssignmentInExists::apply(formula); SimplificationRuleAssignmentInExists::apply(formula); - if (!exists.argument.is()) - return; - - auto &and_ = exists.argument.get(); - auto &arguments = and_.arguments; - SimplificationRuleEmptyConjunction::apply(exists.argument); SimplificationRuleTrivialExists::apply(formula); - - // If the argument now is a conjunction with just one element, directly replace the input formula with the argument - if (arguments.size() == 1) - exists.argument = std::move(arguments.front()); + SimplificationRuleOneElementConjunction::apply(exists.argument); // If there are still remaining variables, simplification is over if (!exists.variables.empty()) return; - assert(!arguments.empty()); - // If there is more than one element in the conjunction, replace the input formula with the conjunction formula = std::move(exists.argument); }