diff --git a/src/anthem/Simplification.cpp b/src/anthem/Simplification.cpp index 18dc3e3..58da9b3 100644 --- a/src/anthem/Simplification.cpp +++ b/src/anthem/Simplification.cpp @@ -101,6 +101,28 @@ struct ReplaceVariableInFormulaVisitor : public ast::RecursiveFormulaVisitor ” void simplify(ast::Exists &exists, ast::Formula &formula) { + // Simplify formulas like “exists X (X = Y)” to “#true” + // TODO: check that this covers all cases + if (exists.argument.is()) + { + const auto &comparison = exists.argument.get(); + + if (comparison.operator_ != ast::Comparison::Operator::Equal) + return; + + const auto matchingAssignment = std::find_if(exists.variables.cbegin(), exists.variables.cend(), + [&](const auto &variableDeclaration) + { + return matchesVariableDeclaration(comparison.left, *variableDeclaration) + || matchesVariableDeclaration(comparison.right, *variableDeclaration); + }); + + if (matchingAssignment != exists.variables.cend()) + formula = ast::Formula::make(true); + + return; + } + if (!exists.argument.is()) return;