1 Commits

Author SHA1 Message Date
1372652d1c Version bump for release 0.1.8 RC 2 2018-04-11 23:26:39 +02:00
11 changed files with 70 additions and 203 deletions

View File

@@ -1,11 +1,11 @@
# Change Log # Change Log
## 0.1.8 RC 3 (2018-04-12) ## 0.1.8 RC 2 (2018-04-11)
### Features ### Features
* more and advanced simplification rules * more and advanced simplification rules
* adds support for exponentiation (power) and modulus (absolute value) * adds support for exponentiation operator
* new examples: prime numbers, permutation generator, and graph coloring (extended) * new examples: prime numbers, permutation generator, and graph coloring (extended)
## 0.1.7 (2018-04-08) ## 0.1.7 (2018-04-08)

View File

@@ -70,7 +70,7 @@ int main(int argc, char **argv)
if (version) if (version)
{ {
std::cout << "anthem version 0.1.8-rc.3" << std::endl; std::cout << "anthem version 0.1.8-rc.2" << std::endl;
return EXIT_SUCCESS; return EXIT_SUCCESS;
} }

View File

@@ -293,30 +293,6 @@ struct String
//////////////////////////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////////////////////////
struct UnaryOperation
{
enum class Operator
{
Absolute
};
explicit UnaryOperation(Operator operator_, Term &&argument)
: operator_{operator_},
argument{std::move(argument)}
{
}
UnaryOperation(const UnaryOperation &other) = delete;
UnaryOperation &operator=(const UnaryOperation &other) = delete;
UnaryOperation(UnaryOperation &&other) noexcept = default;
UnaryOperation &operator=(UnaryOperation &&other) noexcept = default;
Operator operator_;
Term argument;
};
////////////////////////////////////////////////////////////////////////////////////////////////////
struct Variable struct Variable
{ {
explicit Variable(VariableDeclaration *declaration) explicit Variable(VariableDeclaration *declaration)

View File

@@ -37,7 +37,6 @@ struct Or;
struct Predicate; struct Predicate;
struct SpecialInteger; struct SpecialInteger;
struct String; struct String;
struct UnaryOperation;
struct Variable; struct Variable;
struct VariableDeclaration; struct VariableDeclaration;
using VariableDeclarationPointer = std::unique_ptr<VariableDeclaration>; using VariableDeclarationPointer = std::unique_ptr<VariableDeclaration>;
@@ -69,7 +68,6 @@ using Term = Clingo::Variant<
Interval, Interval,
SpecialInteger, SpecialInteger,
String, String,
UnaryOperation,
Variable>; Variable>;
//////////////////////////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////////////////////////

View File

@@ -165,14 +165,6 @@ struct RecursiveTermVisitor
return T::accept(string, term, std::forward<Arguments>(arguments)...); return T::accept(string, term, std::forward<Arguments>(arguments)...);
} }
template <class... Arguments>
ReturnType visit(UnaryOperation &unaryOperation, Term &term, Arguments &&... arguments)
{
unaryOperation.argument.accept(*this, unaryOperation.argument, std::forward<Arguments>(arguments)...);
return T::accept(unaryOperation, term, std::forward<Arguments>(arguments)...);
}
template <class... Arguments> template <class... Arguments>
ReturnType visit(Variable &variable, Term &term, Arguments &&... arguments) ReturnType visit(Variable &variable, Term &term, Arguments &&... arguments)
{ {

View File

@@ -382,19 +382,6 @@ struct TermEqualityVisitor
: Tristate::False; : Tristate::False;
} }
Tristate visit(const UnaryOperation &unaryOperation, const Term &otherTerm)
{
if (!otherTerm.is<UnaryOperation>())
return Tristate::Unknown;
const auto &otherUnaryOperation = otherTerm.get<UnaryOperation>();
if (unaryOperation.operator_ != otherUnaryOperation.operator_)
return Tristate::Unknown;
return equal(unaryOperation.argument, otherUnaryOperation.argument);
}
Tristate visit(const Variable &variable, const Term &otherTerm) Tristate visit(const Variable &variable, const Term &otherTerm)
{ {
if (!otherTerm.is<Variable>()) if (!otherTerm.is<Variable>())

View File

@@ -48,23 +48,6 @@ ast::BinaryOperation::Operator translate(Clingo::AST::BinaryOperator binaryOpera
//////////////////////////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////////////////////////
ast::UnaryOperation::Operator translate(Clingo::AST::UnaryOperator unaryOperator, const Clingo::AST::Term &term)
{
switch (unaryOperator)
{
case Clingo::AST::UnaryOperator::Absolute:
return ast::UnaryOperation::Operator::Absolute;
case Clingo::AST::UnaryOperator::Minus:
throw TranslationException(term.location, "binary operation “minus” currently unsupported");
case Clingo::AST::UnaryOperator::Negation:
throw TranslationException(term.location, "binary operation “negation” currently unsupported");
}
throw TranslationException(term.location, "unknown unary operation");
}
////////////////////////////////////////////////////////////////////////////////////////////////////
ast::Term translate(const Clingo::AST::Term &term, RuleContext &ruleContext, const ast::VariableStack &variableStack); ast::Term translate(const Clingo::AST::Term &term, RuleContext &ruleContext, const ast::VariableStack &variableStack);
//////////////////////////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////////////////////////
@@ -123,6 +106,12 @@ struct TermTranslateVisitor
return ast::Term::make<ast::Variable>(ruleContext.freeVariables.back().get()); return ast::Term::make<ast::Variable>(ruleContext.freeVariables.back().get());
} }
std::optional<ast::Term> visit(const Clingo::AST::UnaryOperation &, const Clingo::AST::Term &term, RuleContext &, const ast::VariableStack &)
{
throw TranslationException(term.location, "“unary operation” terms currently unsupported");
return std::nullopt;
}
std::optional<ast::Term> visit(const Clingo::AST::BinaryOperation &binaryOperation, const Clingo::AST::Term &term, RuleContext &ruleContext, const ast::VariableStack &variableStack) std::optional<ast::Term> visit(const Clingo::AST::BinaryOperation &binaryOperation, const Clingo::AST::Term &term, RuleContext &ruleContext, const ast::VariableStack &variableStack)
{ {
const auto operator_ = translate(binaryOperation.binary_operator, term); const auto operator_ = translate(binaryOperation.binary_operator, term);
@@ -132,14 +121,6 @@ struct TermTranslateVisitor
return ast::Term::make<ast::BinaryOperation>(operator_, std::move(left), std::move(right)); return ast::Term::make<ast::BinaryOperation>(operator_, std::move(left), std::move(right));
} }
std::optional<ast::Term> visit(const Clingo::AST::UnaryOperation &unaryOperation, const Clingo::AST::Term &term, RuleContext &ruleContext, const ast::VariableStack &variableStack)
{
const auto operator_ = translate(unaryOperation.unary_operator, term);
auto argument = translate(unaryOperation.argument, ruleContext, variableStack);
return ast::Term::make<ast::UnaryOperation>(operator_, std::move(argument));
}
std::optional<ast::Term> visit(const Clingo::AST::Interval &interval, const Clingo::AST::Term &, RuleContext &ruleContext, const ast::VariableStack &variableStack) std::optional<ast::Term> visit(const Clingo::AST::Interval &interval, const Clingo::AST::Term &, RuleContext &ruleContext, const ast::VariableStack &variableStack)
{ {
auto left = translate(interval.left, ruleContext, variableStack); auto left = translate(interval.left, ruleContext, variableStack);

View File

@@ -41,39 +41,37 @@ struct PrintContext
//////////////////////////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////////////////////////
output::ColorStream &print(output::ColorStream &stream, const BinaryOperation::Operator operator_, PrintContext &printContext, bool omitParentheses = false); output::ColorStream &print(output::ColorStream &stream, const BinaryOperation::Operator operator_, PrintContext &printContext);
output::ColorStream &print(output::ColorStream &stream, const BinaryOperation &binaryOperation, PrintContext &printContext, bool omitParentheses = false); output::ColorStream &print(output::ColorStream &stream, const BinaryOperation &binaryOperation, PrintContext &printContext);
output::ColorStream &print(output::ColorStream &stream, const Boolean &boolean, PrintContext &printContext, bool omitParentheses = false); output::ColorStream &print(output::ColorStream &stream, const Boolean &boolean, PrintContext &printContext);
output::ColorStream &print(output::ColorStream &stream, const Comparison &comparison, PrintContext &printContext, bool omitParentheses = false); output::ColorStream &print(output::ColorStream &stream, const Comparison &comparison, PrintContext &printContext);
output::ColorStream &print(output::ColorStream &stream, Comparison::Operator operator_, PrintContext &printContext, bool omitParentheses = false); output::ColorStream &print(output::ColorStream &stream, const Constant &constant, PrintContext &printContext);
output::ColorStream &print(output::ColorStream &stream, const Constant &constant, PrintContext &printContext, bool omitParentheses = false); output::ColorStream &print(output::ColorStream &stream, const Function &function, PrintContext &printContext);
output::ColorStream &print(output::ColorStream &stream, const Function &function, PrintContext &printContext, bool omitParentheses = false); output::ColorStream &print(output::ColorStream &stream, const In &in, PrintContext &printContext);
output::ColorStream &print(output::ColorStream &stream, const In &in, PrintContext &printContext, bool omitParentheses = false); output::ColorStream &print(output::ColorStream &stream, const Integer &integer, PrintContext &printContext);
output::ColorStream &print(output::ColorStream &stream, const Integer &integer, PrintContext &printContext, bool omitParentheses = false); output::ColorStream &print(output::ColorStream &stream, const Interval &interval, PrintContext &printContext);
output::ColorStream &print(output::ColorStream &stream, const Interval &interval, PrintContext &printContext, bool omitParentheses = false); output::ColorStream &print(output::ColorStream &stream, const Predicate &predicate, PrintContext &printContext);
output::ColorStream &print(output::ColorStream &stream, const Predicate &predicate, PrintContext &printContext, bool omitParentheses = false); output::ColorStream &print(output::ColorStream &stream, const SpecialInteger &specialInteger, PrintContext &printContext);
output::ColorStream &print(output::ColorStream &stream, const SpecialInteger &specialInteger, PrintContext &printContext, bool omitParentheses = false); output::ColorStream &print(output::ColorStream &stream, const String &string, PrintContext &printContext);
output::ColorStream &print(output::ColorStream &stream, const String &string, PrintContext &printContext, bool omitParentheses = false); output::ColorStream &print(output::ColorStream &stream, const Variable &variable, PrintContext &printContext);
output::ColorStream &print(output::ColorStream &stream, const UnaryOperation &unaryOperation, PrintContext &printContext, bool omitParentheses = false); output::ColorStream &print(output::ColorStream &stream, const VariableDeclaration &variableDeclaration, PrintContext &printContext);
output::ColorStream &print(output::ColorStream &stream, const Variable &variable, PrintContext &printContext, bool omitParentheses = false);
output::ColorStream &print(output::ColorStream &stream, const VariableDeclaration &variableDeclaration, PrintContext &printContext, bool omitParentheses = false);
output::ColorStream &print(output::ColorStream &stream, const And &and_, PrintContext &printContext, bool omitParentheses = false); output::ColorStream &print(output::ColorStream &stream, const And &and_, PrintContext &printContext);
output::ColorStream &print(output::ColorStream &stream, const Biconditional &biconditional, PrintContext &printContext, bool omitParentheses = false); output::ColorStream &print(output::ColorStream &stream, const Biconditional &biconditional, PrintContext &printContext);
output::ColorStream &print(output::ColorStream &stream, const Exists &exists, PrintContext &printContext, bool omitParentheses = false); output::ColorStream &print(output::ColorStream &stream, const Exists &exists, PrintContext &printContext);
output::ColorStream &print(output::ColorStream &stream, const ForAll &forAll, PrintContext &printContext, bool omitParentheses = false); output::ColorStream &print(output::ColorStream &stream, const ForAll &forAll, PrintContext &printContext);
output::ColorStream &print(output::ColorStream &stream, const Implies &implies, PrintContext &printContext, bool omitParentheses = false); output::ColorStream &print(output::ColorStream &stream, const Implies &implies, PrintContext &printContext);
output::ColorStream &print(output::ColorStream &stream, const Not &not_, PrintContext &printContext, bool omitParentheses = false); output::ColorStream &print(output::ColorStream &stream, const Not &not_, PrintContext &printContext);
output::ColorStream &print(output::ColorStream &stream, const Or &or_, PrintContext &printContext, bool omitParentheses = false); output::ColorStream &print(output::ColorStream &stream, const Or &or_, PrintContext &printContext);
output::ColorStream &print(output::ColorStream &stream, const Formula &formula, PrintContext &printContext, bool omitParentheses = false); output::ColorStream &print(output::ColorStream &stream, const Formula &formula, PrintContext &printContext);
output::ColorStream &print(output::ColorStream &stream, const Term &term, PrintContext &printContext, bool omitParentheses = false); output::ColorStream &print(output::ColorStream &stream, const Term &term, PrintContext &printContext);
//////////////////////////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////////////////////////
// Primitives // Primitives
//////////////////////////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////////////////////////
inline output::ColorStream &print(output::ColorStream &stream, BinaryOperation::Operator operator_, PrintContext &, bool) inline output::ColorStream &print(output::ColorStream &stream, BinaryOperation::Operator operator_, PrintContext &)
{ {
switch (operator_) switch (operator_)
{ {
@@ -96,18 +94,14 @@ inline output::ColorStream &print(output::ColorStream &stream, BinaryOperation::
//////////////////////////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////////////////////////
inline output::ColorStream &print(output::ColorStream &stream, const BinaryOperation &binaryOperation, PrintContext &printContext, bool omitParentheses) inline output::ColorStream &print(output::ColorStream &stream, const BinaryOperation &binaryOperation, PrintContext &printContext)
{ {
if (!omitParentheses || printContext.context.parenthesisStyle == ParenthesisStyle::Full)
stream << "("; stream << "(";
print(stream, binaryOperation.left, printContext); print(stream, binaryOperation.left, printContext);
stream << " "; stream << " ";
print(stream, binaryOperation.operator_, printContext); print(stream, binaryOperation.operator_, printContext);
stream << " "; stream << " ";
print(stream, binaryOperation.right, printContext); print(stream, binaryOperation.right, printContext);
if (!omitParentheses || printContext.context.parenthesisStyle == ParenthesisStyle::Full)
stream << ")"; stream << ")";
return stream; return stream;
@@ -115,7 +109,7 @@ inline output::ColorStream &print(output::ColorStream &stream, const BinaryOpera
//////////////////////////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////////////////////////
inline output::ColorStream &print(output::ColorStream &stream, const Boolean &boolean, PrintContext &, bool) inline output::ColorStream &print(output::ColorStream &stream, const Boolean &boolean, PrintContext &)
{ {
if (boolean.value) if (boolean.value)
return (stream << output::Boolean("#true")); return (stream << output::Boolean("#true"));
@@ -125,7 +119,7 @@ inline output::ColorStream &print(output::ColorStream &stream, const Boolean &bo
//////////////////////////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////////////////////////
inline output::ColorStream &print(output::ColorStream &stream, Comparison::Operator operator_, PrintContext &, bool) inline output::ColorStream &print(output::ColorStream &stream, Comparison::Operator operator_, PrintContext &)
{ {
switch (operator_) switch (operator_)
{ {
@@ -148,7 +142,7 @@ inline output::ColorStream &print(output::ColorStream &stream, Comparison::Opera
//////////////////////////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////////////////////////
inline output::ColorStream &print(output::ColorStream &stream, const Comparison &comparison, PrintContext &printContext, bool) inline output::ColorStream &print(output::ColorStream &stream, const Comparison &comparison, PrintContext &printContext)
{ {
if (printContext.context.parenthesisStyle == ParenthesisStyle::Full) if (printContext.context.parenthesisStyle == ParenthesisStyle::Full)
stream << "("; stream << "(";
@@ -167,14 +161,14 @@ inline output::ColorStream &print(output::ColorStream &stream, const Comparison
//////////////////////////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////////////////////////
inline output::ColorStream &print(output::ColorStream &stream, const Constant &constant, PrintContext &, bool) inline output::ColorStream &print(output::ColorStream &stream, const Constant &constant, PrintContext &)
{ {
return (stream << constant.name); return (stream << constant.name);
} }
//////////////////////////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////////////////////////
inline output::ColorStream &print(output::ColorStream &stream, const Function &function, PrintContext &printContext, bool) inline output::ColorStream &print(output::ColorStream &stream, const Function &function, PrintContext &printContext)
{ {
stream << function.name; stream << function.name;
@@ -201,7 +195,7 @@ inline output::ColorStream &print(output::ColorStream &stream, const Function &f
//////////////////////////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////////////////////////
inline output::ColorStream &print(output::ColorStream &stream, const In &in, PrintContext &printContext, bool) inline output::ColorStream &print(output::ColorStream &stream, const In &in, PrintContext &printContext)
{ {
if (printContext.context.parenthesisStyle == ParenthesisStyle::Full) if (printContext.context.parenthesisStyle == ParenthesisStyle::Full)
stream << "("; stream << "(";
@@ -218,14 +212,14 @@ inline output::ColorStream &print(output::ColorStream &stream, const In &in, Pri
//////////////////////////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////////////////////////
inline output::ColorStream &print(output::ColorStream &stream, const Integer &integer, PrintContext &, bool) inline output::ColorStream &print(output::ColorStream &stream, const Integer &integer, PrintContext &)
{ {
return (stream << output::Number<int>(integer.value)); return (stream << output::Number<int>(integer.value));
} }
//////////////////////////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////////////////////////
inline output::ColorStream &print(output::ColorStream &stream, const Interval &interval, PrintContext &printContext, bool) inline output::ColorStream &print(output::ColorStream &stream, const Interval &interval, PrintContext &printContext)
{ {
if (printContext.context.parenthesisStyle == ParenthesisStyle::Full) if (printContext.context.parenthesisStyle == ParenthesisStyle::Full)
stream << "("; stream << "(";
@@ -242,7 +236,7 @@ inline output::ColorStream &print(output::ColorStream &stream, const Interval &i
//////////////////////////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////////////////////////
inline output::ColorStream &print(output::ColorStream &stream, const Predicate &predicate, PrintContext &printContext, bool) inline output::ColorStream &print(output::ColorStream &stream, const Predicate &predicate, PrintContext &printContext)
{ {
stream << predicate.name; stream << predicate.name;
@@ -266,7 +260,7 @@ inline output::ColorStream &print(output::ColorStream &stream, const Predicate &
//////////////////////////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////////////////////////
inline output::ColorStream &print(output::ColorStream &stream, const SpecialInteger &specialInteger, PrintContext &, bool) inline output::ColorStream &print(output::ColorStream &stream, const SpecialInteger &specialInteger, PrintContext &)
{ {
switch (specialInteger.type) switch (specialInteger.type)
{ {
@@ -281,37 +275,14 @@ inline output::ColorStream &print(output::ColorStream &stream, const SpecialInte
//////////////////////////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////////////////////////
inline output::ColorStream &print(output::ColorStream &stream, const String &string, PrintContext &, bool) inline output::ColorStream &print(output::ColorStream &stream, const String &string, PrintContext &)
{ {
return (stream << output::String(string.text.c_str())); return (stream << output::String(string.text.c_str()));
} }
//////////////////////////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////////////////////////
inline output::ColorStream &print(output::ColorStream &stream, const UnaryOperation &unaryOperation, PrintContext &printContext, bool) inline output::ColorStream &print(output::ColorStream &stream, const Variable &variable, PrintContext &printContext)
{
switch (unaryOperation.operator_)
{
case UnaryOperation::Operator::Absolute:
stream << "|";
break;
}
print(stream, unaryOperation.argument, printContext, true);
switch (unaryOperation.operator_)
{
case UnaryOperation::Operator::Absolute:
stream << "|";
break;
}
return stream;
}
////////////////////////////////////////////////////////////////////////////////////////////////////
inline output::ColorStream &print(output::ColorStream &stream, const Variable &variable, PrintContext &printContext, bool)
{ {
assert(variable.declaration != nullptr); assert(variable.declaration != nullptr);
@@ -320,7 +291,7 @@ inline output::ColorStream &print(output::ColorStream &stream, const Variable &v
//////////////////////////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////////////////////////
inline output::ColorStream &print(output::ColorStream &stream, const VariableDeclaration &variableDeclaration, PrintContext &printContext, bool) inline output::ColorStream &print(output::ColorStream &stream, const VariableDeclaration &variableDeclaration, PrintContext &printContext)
{ {
const auto printVariableDeclaration = const auto printVariableDeclaration =
[&stream, &variableDeclaration](const auto *prefix, auto &variableIDs) -> output::ColorStream & [&stream, &variableDeclaration](const auto *prefix, auto &variableIDs) -> output::ColorStream &
@@ -356,9 +327,8 @@ inline output::ColorStream &print(output::ColorStream &stream, const VariableDec
// Expressions // Expressions
//////////////////////////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////////////////////////
inline output::ColorStream &print(output::ColorStream &stream, const And &and_, PrintContext &printContext, bool omitParentheses) inline output::ColorStream &print(output::ColorStream &stream, const And &and_, PrintContext &printContext)
{ {
if (!omitParentheses || printContext.context.parenthesisStyle == ParenthesisStyle::Full)
stream << "("; stream << "(";
for (auto i = and_.arguments.cbegin(); i != and_.arguments.cend(); i++) for (auto i = and_.arguments.cbegin(); i != and_.arguments.cend(); i++)
@@ -369,7 +339,6 @@ inline output::ColorStream &print(output::ColorStream &stream, const And &and_,
print(stream, *i, printContext); print(stream, *i, printContext);
} }
if (!omitParentheses || printContext.context.parenthesisStyle == ParenthesisStyle::Full)
stream << ")"; stream << ")";
return stream; return stream;
@@ -377,16 +346,12 @@ inline output::ColorStream &print(output::ColorStream &stream, const And &and_,
//////////////////////////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////////////////////////
inline output::ColorStream &print(output::ColorStream &stream, const Biconditional &biconditional, PrintContext &printContext, bool omitParentheses) inline output::ColorStream &print(output::ColorStream &stream, const Biconditional &biconditional, PrintContext &printContext)
{ {
if (!omitParentheses || printContext.context.parenthesisStyle == ParenthesisStyle::Full)
stream << "("; stream << "(";
print(stream, biconditional.left, printContext); print(stream, biconditional.left, printContext);
stream << " <-> "; stream << " <-> ";
print(stream, biconditional.right, printContext); print(stream, biconditional.right, printContext);
if (!omitParentheses || printContext.context.parenthesisStyle == ParenthesisStyle::Full)
stream << ")"; stream << ")";
return stream; return stream;
@@ -394,7 +359,7 @@ inline output::ColorStream &print(output::ColorStream &stream, const Bicondition
//////////////////////////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////////////////////////
inline output::ColorStream &print(output::ColorStream &stream, const Exists &exists, PrintContext &printContext, bool) inline output::ColorStream &print(output::ColorStream &stream, const Exists &exists, PrintContext &printContext)
{ {
if (printContext.context.parenthesisStyle == ParenthesisStyle::Full) if (printContext.context.parenthesisStyle == ParenthesisStyle::Full)
stream << "("; stream << "(";
@@ -420,7 +385,7 @@ inline output::ColorStream &print(output::ColorStream &stream, const Exists &exi
//////////////////////////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////////////////////////
inline output::ColorStream &print(output::ColorStream &stream, const ForAll &forAll, PrintContext &printContext, bool) inline output::ColorStream &print(output::ColorStream &stream, const ForAll &forAll, PrintContext &printContext)
{ {
if (printContext.context.parenthesisStyle == ParenthesisStyle::Full) if (printContext.context.parenthesisStyle == ParenthesisStyle::Full)
stream << "("; stream << "(";
@@ -446,16 +411,12 @@ inline output::ColorStream &print(output::ColorStream &stream, const ForAll &for
//////////////////////////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////////////////////////
inline output::ColorStream &print(output::ColorStream &stream, const Implies &implies, PrintContext &printContext, bool omitParentheses) inline output::ColorStream &print(output::ColorStream &stream, const Implies &implies, PrintContext &printContext)
{ {
if (!omitParentheses || printContext.context.parenthesisStyle == ParenthesisStyle::Full)
stream << "("; stream << "(";
print(stream, implies.antecedent, printContext); print(stream, implies.antecedent, printContext);
stream << " -> "; stream << " -> ";
print(stream, implies.consequent, printContext); print(stream, implies.consequent, printContext);
if (!omitParentheses || printContext.context.parenthesisStyle == ParenthesisStyle::Full)
stream << ")"; stream << ")";
return stream; return stream;
@@ -463,7 +424,7 @@ inline output::ColorStream &print(output::ColorStream &stream, const Implies &im
//////////////////////////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////////////////////////
inline output::ColorStream &print(output::ColorStream &stream, const Not &not_, PrintContext &printContext, bool) inline output::ColorStream &print(output::ColorStream &stream, const Not &not_, PrintContext &printContext)
{ {
if (printContext.context.parenthesisStyle == ParenthesisStyle::Full) if (printContext.context.parenthesisStyle == ParenthesisStyle::Full)
stream << "("; stream << "(";
@@ -479,9 +440,8 @@ inline output::ColorStream &print(output::ColorStream &stream, const Not &not_,
//////////////////////////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////////////////////////
inline output::ColorStream &print(output::ColorStream &stream, const Or &or_, PrintContext &printContext, bool omitParentheses) inline output::ColorStream &print(output::ColorStream &stream, const Or &or_, PrintContext &printContext)
{ {
if (!omitParentheses || printContext.context.parenthesisStyle == ParenthesisStyle::Full)
stream << "("; stream << "(";
for (auto i = or_.arguments.cbegin(); i != or_.arguments.cend(); i++) for (auto i = or_.arguments.cbegin(); i != or_.arguments.cend(); i++)
@@ -492,7 +452,6 @@ inline output::ColorStream &print(output::ColorStream &stream, const Or &or_, Pr
print(stream, *i, printContext); print(stream, *i, printContext);
} }
if (!omitParentheses || printContext.context.parenthesisStyle == ParenthesisStyle::Full)
stream << ")"; stream << ")";
return stream; return stream;
@@ -506,24 +465,24 @@ template<class Variant>
struct VariantPrintVisitor struct VariantPrintVisitor
{ {
template<class T> template<class T>
output::ColorStream &visit(const T &x, output::ColorStream &stream, PrintContext &printContext, bool omitParentheses) output::ColorStream &visit(const T &x, output::ColorStream &stream, PrintContext &printContext)
{ {
return print(stream, x, printContext, omitParentheses); return print(stream, x, printContext);
} }
}; };
//////////////////////////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////////////////////////
inline output::ColorStream &print(output::ColorStream &stream, const Formula &formula, PrintContext &printContext, bool omitParentheses) inline output::ColorStream &print(output::ColorStream &stream, const Formula &formula, PrintContext &printContext)
{ {
return formula.accept(VariantPrintVisitor<Formula>(), stream, printContext, omitParentheses); return formula.accept(VariantPrintVisitor<Formula>(), stream, printContext);
} }
//////////////////////////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////////////////////////
inline output::ColorStream &print(output::ColorStream &stream, const Term &term, PrintContext &printContext, bool omitParentheses) inline output::ColorStream &print(output::ColorStream &stream, const Term &term, PrintContext &printContext)
{ {
return term.accept(VariantPrintVisitor<Term>(), stream, printContext, omitParentheses); return term.accept(VariantPrintVisitor<Term>(), stream, printContext);
} }
//////////////////////////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////////////////////////

View File

@@ -159,13 +159,6 @@ String prepareCopy(const String &other)
//////////////////////////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////////////////////////
UnaryOperation prepareCopy(const UnaryOperation &other)
{
return UnaryOperation(other.operator_, prepareCopy(other.argument));
}
////////////////////////////////////////////////////////////////////////////////////////////////////
Variable prepareCopy(const Variable &other) Variable prepareCopy(const Variable &other)
{ {
return Variable(other.declaration); return Variable(other.declaration);
@@ -327,12 +320,6 @@ struct FixDanglingVariablesInTermVisitor
{ {
} }
template <class... Arguments>
void visit(UnaryOperation &unaryOperation, Arguments &&... arguments)
{
unaryOperation.argument.accept(*this, std::forward<Arguments>(arguments)...);
}
void visit(Variable &variable, ScopedFormula &scopedFormula, VariableStack &variableStack, void visit(Variable &variable, ScopedFormula &scopedFormula, VariableStack &variableStack,
std::map<VariableDeclaration *, VariableDeclaration *> &replacements) std::map<VariableDeclaration *, VariableDeclaration *> &replacements)
{ {

View File

@@ -178,11 +178,6 @@ struct CollectFreeVariablesVisitor
{ {
} }
void visit(UnaryOperation &unaryOperation, VariableStack &variableStack, std::vector<VariableDeclaration *> &freeVariables)
{
unaryOperation.argument.accept(*this, variableStack, freeVariables);
}
void visit(Variable &variable, VariableStack &variableStack, std::vector<VariableDeclaration *> &freeVariables) void visit(Variable &variable, VariableStack &variableStack, std::vector<VariableDeclaration *> &freeVariables)
{ {
if (variableStack.contains(*variable.declaration)) if (variableStack.contains(*variable.declaration))

View File

@@ -184,12 +184,4 @@ TEST_CASE("[completion] Rules are completed", "[completion]")
CHECK(output.str() == "forall V1, V2 not color(V1, V2)\nforall U1, U2, U3 (not color(U1, U2) or not color(U1, U3) or U2 = U3)\n"); CHECK(output.str() == "forall V1, V2 not color(V1, V2)\nforall U1, U2, U3 (not color(U1, U2) or not color(U1, U3) or U2 = U3)\n");
} }
SECTION("absolute value operation")
{
input << "adj(X, Y) :- X = 1..n, Y = 1..n, |X - Y| = 1.";
anthem::translate("input", input, context);
CHECK(output.str() == "forall V1, V2 (adj(V1, V2) <-> (V1 in 1..n and V2 in 1..n and |V1 - V2| = 1))\n");
}
} }