6#include "delpi/symbolic/Formula.h"
10#include <unordered_map>
13#include "delpi/util/error.h"
14#include "delpi/util/hash.hpp"
19 : expression_{std::move(expression)}, kind_{kind}, rhs_{std::move(rhs)} {}
24template <MapFromTo<Variable, mpq_
class> T>
45bool Formula::equal_to(
const Formula& o)
const noexcept {
46 if (
this == &o)
return true;
47 if (kind_ != o.kind_)
return false;
48 if (rhs_ != o.rhs_)
return false;
49 return expression_.equal_to(o.expression_);
51bool Formula::less(
const Formula& o)
const noexcept {
52 if (
this == &o)
return false;
53 if (kind_ != o.kind_)
return kind_ < o.kind_;
54 if (rhs_ != o.rhs_)
return rhs_ < o.rhs_;
55 return expression_.less(o.expression_);
57std::size_t Formula::hash() const noexcept {
return hash::hash_combine(expression_.hash(), kind_, rhs_); }
59Formula Formula::operator-()
const {
return Formula{-expression_, -kind_, -rhs_}; }
60Formula Formula::operator!()
const {
return Formula{expression_, !kind_, rhs_}; }
61std::strong_ordering Formula::operator<=>(
const Formula& o)
const {
62 if (less(o))
return std::strong_ordering::less;
63 if (o.less(*
this))
return std::strong_ordering::greater;
64 return std::strong_ordering::equal;
67Formula operator==(
const Variable& lhs,
const Variable& rhs) {
return Formula{lhs - rhs, FormulaKind::Eq, 0}; }
68Formula operator!=(
const Variable& lhs,
const Variable& rhs) {
return Formula{lhs - rhs, FormulaKind::Neq, 0}; }
69Formula operator<(
const Variable& lhs,
const Variable& rhs) {
return Formula{lhs - rhs, FormulaKind::Lt, 0}; }
70Formula operator<=(
const Variable& lhs,
const Variable& rhs) {
return Formula{lhs - rhs, FormulaKind::Leq, 0}; }
71Formula operator>(
const Variable& lhs,
const Variable& rhs) {
return Formula{lhs - rhs, FormulaKind::Gt, 0}; }
72Formula operator>=(
const Variable& lhs,
const Variable& rhs) {
return Formula{lhs - rhs, FormulaKind::Geq, 0}; }
74Formula operator==(
const Expression& lhs,
const Expression& rhs) {
return Formula{lhs - rhs, FormulaKind::Eq, 0}; }
75Formula operator!=(
const Expression& lhs,
const Expression& rhs) {
return Formula{lhs - rhs, FormulaKind::Neq, 0}; }
76Formula operator<(
const Expression& lhs,
const Expression& rhs) {
return Formula{lhs - rhs, FormulaKind::Lt, 0}; }
77Formula operator<=(
const Expression& lhs,
const Expression& rhs) {
return Formula{lhs - rhs, FormulaKind::Leq, 0}; }
78Formula operator>(
const Expression& lhs,
const Expression& rhs) {
return Formula{lhs - rhs, FormulaKind::Gt, 0}; }
79Formula operator>=(
const Expression& lhs,
const Expression& rhs) {
return Formula{lhs - rhs, FormulaKind::Geq, 0}; }
81Formula operator==(mpq_class lhs,
const Expression& rhs) {
return Formula{rhs, FormulaKind::Eq, std::move(lhs)}; }
82Formula operator!=(mpq_class lhs,
const Expression& rhs) {
return Formula{rhs, FormulaKind::Neq, std::move(lhs)}; }
83Formula operator<(mpq_class lhs,
const Expression& rhs) {
return Formula{rhs, FormulaKind::Gt, std::move(lhs)}; }
84Formula operator<=(mpq_class lhs,
const Expression& rhs) {
return Formula{rhs, FormulaKind::Geq, std::move(lhs)}; }
85Formula operator>(mpq_class lhs,
const Expression& rhs) {
return Formula{rhs, FormulaKind::Lt, std::move(lhs)}; }
86Formula operator>=(mpq_class lhs,
const Expression& rhs) {
return Formula{rhs, FormulaKind::Leq, std::move(lhs)}; }
88Formula operator==(
const Expression& lhs, mpq_class rhs) {
return Formula{lhs, FormulaKind::Eq, std::move(rhs)}; }
89Formula operator!=(
const Expression& lhs, mpq_class rhs) {
return Formula{lhs, FormulaKind::Neq, std::move(rhs)}; }
90Formula operator<(
const Expression& lhs, mpq_class rhs) {
return Formula{lhs, FormulaKind::Lt, std::move(rhs)}; }
91Formula operator<=(
const Expression& lhs, mpq_class rhs) {
return Formula{lhs, FormulaKind::Leq, std::move(rhs)}; }
92Formula operator>(
const Expression& lhs, mpq_class rhs) {
return Formula{lhs, FormulaKind::Gt, std::move(rhs)}; }
93Formula operator>=(
const Expression& lhs, mpq_class rhs) {
return Formula{lhs, FormulaKind::Geq, std::move(rhs)}; }
95std::ostream& operator<<(std::ostream& os,
const Formula& formula) {
96 return os <<
"(" << formula.expression() <<
" " << formula.kind() <<
" " << formula.rhs() <<
")";
99template bool Formula::Evaluate(
const std::map<Variable, mpq_class>& env)
const;
100template bool Formula::Evaluate(
const std::unordered_map<Variable, mpq_class>& env)
const;
Represents a symbolic form of an expression.
Global namespace for the delpi library.
FormulaKind
Kinds of symbolic formulas.