#ifndef __ANTHEM__SIMPLIFICATION_VISITORS_H #define __ANTHEM__SIMPLIFICATION_VISITORS_H #include #include namespace anthem { namespace ast { //////////////////////////////////////////////////////////////////////////////////////////////////// // // Simplification Visitor // //////////////////////////////////////////////////////////////////////////////////////////////////// template struct FormulaSimplificationVisitor { template SimplificationResult visit(And &and_, Formula &formula, Arguments &&... arguments) { for (auto &argument : and_.arguments) if (argument.accept(*this, argument, std::forward(arguments)...) == SimplificationResult::Simplified) return SimplificationResult::Simplified; return T::accept(formula, std::forward(arguments)...); } template SimplificationResult visit(Biconditional &biconditional, Formula &formula, Arguments &&... arguments) { if (biconditional.left.accept(*this, biconditional.left, std::forward(arguments)...) == SimplificationResult::Simplified) return SimplificationResult::Simplified; if (biconditional.right.accept(*this, biconditional.right, std::forward(arguments)...) == SimplificationResult::Simplified) return SimplificationResult::Simplified; return T::accept(formula, std::forward(arguments)...); } template SimplificationResult visit(Boolean &, Formula &formula, Arguments &&... arguments) { return T::accept(formula, std::forward(arguments)...); } template SimplificationResult visit(Comparison &, Formula &formula, Arguments &&... arguments) { return T::accept(formula, std::forward(arguments)...); } template SimplificationResult visit(Exists &exists, Formula &formula, Arguments &&... arguments) { if (exists.argument.accept(*this, exists.argument, std::forward(arguments)...) == SimplificationResult::Simplified) return SimplificationResult::Simplified; return T::accept(formula, std::forward(arguments)...); } template SimplificationResult visit(ForAll &forAll, Formula &formula, Arguments &&... arguments) { if (forAll.argument.accept(*this, forAll.argument, std::forward(arguments)...) == SimplificationResult::Simplified) return SimplificationResult::Simplified; return T::accept(formula, std::forward(arguments)...); } template SimplificationResult visit(Implies &implies, Formula &formula, Arguments &&... arguments) { if (implies.antecedent.accept(*this, implies.antecedent, std::forward(arguments)...) == SimplificationResult::Simplified) return SimplificationResult::Simplified; if (implies.consequent.accept(*this, implies.consequent, std::forward(arguments)...) == SimplificationResult::Simplified) return SimplificationResult::Simplified; return T::accept(formula, std::forward(arguments)...); } template SimplificationResult visit(In &, Formula &formula, Arguments &&... arguments) { return T::accept(formula, std::forward(arguments)...); } template SimplificationResult visit(Not ¬_, Formula &formula, Arguments &&... arguments) { if (not_.argument.accept(*this, not_.argument, std::forward(arguments)...) == SimplificationResult::Simplified) return SimplificationResult::Simplified; return T::accept(formula, std::forward(arguments)...); } template SimplificationResult visit(Or &or_, Formula &formula, Arguments &&... arguments) { for (auto &argument : or_.arguments) if (argument.accept(*this, argument, std::forward(arguments)...) == SimplificationResult::Simplified) return SimplificationResult::Simplified; return T::accept(formula, std::forward(arguments)...); } template SimplificationResult visit(Predicate &, Formula &formula, Arguments &&... arguments) { return T::accept(formula, std::forward(arguments)...); } }; //////////////////////////////////////////////////////////////////////////////////////////////////// template struct TermSimplificationVisitor { template SimplificationResult visit(BinaryOperation &binaryOperation, Term &term, Arguments &&... arguments) { if (binaryOperation.left.accept(*this, binaryOperation.left, std::forward(arguments)...) == SimplificationResult::Simplified) return SimplificationResult::Simplified; if (binaryOperation.right.accept(*this, binaryOperation.right, std::forward(arguments)...) == SimplificationResult::Simplified) return SimplificationResult::Simplified; return T::accept(term, std::forward(arguments)...); } template SimplificationResult visit(Boolean &, Term &term, Arguments &&... arguments) { return T::accept(term, std::forward(arguments)...); } template SimplificationResult visit(Function &function, Term &term, Arguments &&... arguments) { for (auto &argument : function.arguments) if (argument.accept(*this, argument, std::forward(arguments)...) == SimplificationResult::Simplified) return SimplificationResult::Simplified; return T::accept(term, std::forward(arguments)...); } template SimplificationResult visit(Integer &, Term &term, Arguments &&... arguments) { return T::accept(term, std::forward(arguments)...); } template SimplificationResult visit(Interval &interval, Term &term, Arguments &&... arguments) { if (interval.from.accept(*this, interval.from, std::forward(arguments)...) == SimplificationResult::Simplified) return SimplificationResult::Simplified; if (interval.to.accept(*this, interval.to, std::forward(arguments)...) == SimplificationResult::Simplified) return SimplificationResult::Simplified; return T::accept(term, std::forward(arguments)...); } template SimplificationResult visit(SpecialInteger &, Term &term, Arguments &&... arguments) { return T::accept(term, std::forward(arguments)...); } template SimplificationResult visit(String &, Term &term, Arguments &&... arguments) { return T::accept(term, std::forward(arguments)...); } template SimplificationResult visit(Variable &, Term &term, Arguments &&... arguments) { return T::accept(term, std::forward(arguments)...); } }; //////////////////////////////////////////////////////////////////////////////////////////////////// } } #endif