17 const std::shared_ptr<const SymbolicNode>
domain_;
28 std::shared_ptr<const SymbolicNode> dom, std::shared_ptr<const SymbolicNode> pred)
32 throw std::invalid_argument(
"QuantifierNode domain and predicate cannot be null");
35 throw std::invalid_argument(
"QuantifierNode bound variable cannot be empty");
42 const std::shared_ptr<const SymbolicNode>&
domain() const noexcept {
return domain_; }
43 const std::shared_ptr<const SymbolicNode>&
predicate() const noexcept {
63 return static_cast<int>(
quantifier_type_) <
static_cast<int>(o.quantifier_type_) ? -1 : 1;
66 if (cmp != 0)
return cmp;
67 cmp =
domain_->compare(*o.domain_);
68 if (cmp != 0)
return cmp;
75 std::shared_ptr<const SymbolicNode>
clone()
const override {
85 const std::shared_ptr<const SymbolicNode>
domain_;
95 std::shared_ptr<const SymbolicNode> pred)
99 throw std::invalid_argument(
"SetBuilderNode domain and predicate cannot be null");
102 throw std::invalid_argument(
"SetBuilderNode element variable cannot be empty");
108 const std::shared_ptr<const SymbolicNode>&
domain() const noexcept {
return domain_; }
109 const std::shared_ptr<const SymbolicNode>&
predicate() const noexcept {
117 std::size_t seed = 0;
128 if (cmp != 0)
return cmp;
129 cmp =
domain_->compare(*o.domain_);
130 if (cmp != 0)
return cmp;
137 std::shared_ptr<const SymbolicNode>
clone()
const override {
145 const std::vector<std::shared_ptr<const SymbolicNode>>
elements_;
151 std::vector<std::shared_ptr<const SymbolicNode>>
elements) {
153 if (!
element)
throw std::invalid_argument(
"finite set elements cannot be null");
156 [](
const auto& lhs,
const auto&
rhs) { return lhs->compare(*rhs) < 0; });
158 [](
const auto& lhs,
const auto&
rhs) {
159 return lhs->equals(*rhs);
166 const std::vector<std::shared_ptr<const SymbolicNode>>&
elements() const noexcept {
171 [&](
const auto& candidate) { return candidate->equals(element); });
177 std::size_t seed =
static_cast<std::size_t
>(
type_priority());
183 const auto count = std::min(
elements_.size(),
set.elements_.size());
184 for (std::size_t index = 0; index < count; ++index) {
185 const int comparison =
elements_[index]->compare(*
set.elements_[index]);
186 if (comparison != 0)
return comparison;
189 return elements_.size() <
set.elements_.size() ? -1 : 1;
195 visitor.
visit(*
this);
197 std::shared_ptr<const SymbolicNode>
clone()
const override {
198 std::vector<std::shared_ptr<const SymbolicNode>>
elements;
207 const std::shared_ptr<const SymbolicNode>
lower_;
208 const std::shared_ptr<const SymbolicNode>
upper_;
213 std::shared_ptr<const SymbolicNode>
upper,
217 if (!
lower_ || !
upper_)
throw std::invalid_argument(
"interval endpoints cannot be null");
229 std::size_t seed =
static_cast<std::size_t
>(
type_priority());
241 visitor.
visit(*
this);
243 std::shared_ptr<const SymbolicNode>
clone()
const override {
251 const std::shared_ptr<const SymbolicNode>
element_;
252 const std::shared_ptr<const SymbolicNode>
set_;
254 std::shared_ptr<const SymbolicNode>
set)
256 if (!
element_ || !
set_)
throw std::invalid_argument(
"membership operands cannot be null");
261 const auto&
set() const noexcept {
return set_; }
266 std::size_t seed =
static_cast<std::size_t
>(
type_priority());
274 return comparison != 0 ? comparison :
set_->compare(*
membership.set_);
280 visitor.
visit(*
this);
282 std::shared_ptr<const SymbolicNode>
clone()
const override {
289 const std::shared_ptr<const SymbolicNode>
value_;
300 if (!
value_)
throw std::invalid_argument(
"quantity value cannot be null");
301 if (
scale_to_base_.is_zero())
throw std::invalid_argument(
"quantity scale cannot be zero");
313 std::size_t seed =
static_cast<std::size_t
>(
type_priority());
321 const auto& quantity =
static_cast<const QuantityNode&
>(other);
322 int comparison =
dimension_.to_string().compare(quantity.dimension_.to_string());
323 if (comparison != 0)
return comparison;
327 return comparison != 0 ? comparison :
value_->compare(*quantity.value_);
333 visitor.
visit(*
this);
335 std::shared_ptr<const SymbolicNode>
clone()
const override {
const std::vector< std::shared_ptr< const SymbolicNode > > & elements() const noexcept
static std::vector< std::shared_ptr< const SymbolicNode > > canonicalize(std::vector< std::shared_ptr< const SymbolicNode > > elements)
const std::vector< std::shared_ptr< const SymbolicNode > > elements_
int compare_same_type(const SymbolicNode &other) const override
std::size_t compute_hash() const override
int type_priority() const override
void accept(LMCAS::detail::SymbolicVisitor &visitor) const override
LMCAS_AST_NODE_FACTORY_FRIEND
FiniteSetNode(std::vector< std::shared_ptr< const SymbolicNode > > elements)
bool contains(const SymbolicNode &element) const
std::shared_ptr< const SymbolicNode > clone() const override
LMCAS_AST_NODE_FACTORY_FRIEND
int compare_same_type(const SymbolicNode &other) const override
void accept(LMCAS::detail::SymbolicVisitor &visitor) const override
std::size_t compute_hash() const override
bool upper_closed() const noexcept
const std::shared_ptr< const SymbolicNode > lower_
int type_priority() const override
IntervalNode(std::shared_ptr< const SymbolicNode > lower, std::shared_ptr< const SymbolicNode > upper, bool lower_closed, bool upper_closed)
std::shared_ptr< const SymbolicNode > clone() const override
bool lower_closed() const noexcept
const std::shared_ptr< const SymbolicNode > upper_
const auto & lower() const noexcept
const auto & upper() const noexcept
int type_priority() const override
std::shared_ptr< const SymbolicNode > clone() const override
int compare_same_type(const SymbolicNode &other) const override
LMCAS_AST_NODE_FACTORY_FRIEND
const auto & set() const noexcept
void accept(LMCAS::detail::SymbolicVisitor &visitor) const override
const std::shared_ptr< const SymbolicNode > set_
MembershipNode(std::shared_ptr< const SymbolicNode > element, std::shared_ptr< const SymbolicNode > set)
const auto & element() const noexcept
const std::shared_ptr< const SymbolicNode > element_
std::size_t compute_hash() const override
std::size_t compute_hash() const override
int compare_same_type(const SymbolicNode &other) const override
std::shared_ptr< const SymbolicNode > clone() const override
Type quantifier_type() const noexcept
const std::string & bound_var() const noexcept
const std::shared_ptr< const SymbolicNode > & predicate() const noexcept
const std::shared_ptr< const SymbolicNode > predicate_
void accept(LMCAS::detail::SymbolicVisitor &visitor) const override
const std::string bound_var_
LMCAS_AST_NODE_FACTORY_FRIEND
QuantifierNode(Type qt, std::string var, std::shared_ptr< const SymbolicNode > dom, std::shared_ptr< const SymbolicNode > pred)
构造量词节点。
int type_priority() const override
const std::shared_ptr< const SymbolicNode > domain_
const Type quantifier_type_
const std::shared_ptr< const SymbolicNode > & domain() const noexcept
const auto & value() const noexcept
const Rational & scale_to_base() const noexcept
int compare_same_type(const SymbolicNode &other) const override
void accept(LMCAS::detail::SymbolicVisitor &visitor) const override
LMCAS_AST_NODE_FACTORY_FRIEND
std::size_t compute_hash() const override
int type_priority() const override
const std::string & display_unit() const noexcept
const std::shared_ptr< const SymbolicNode > value_
const Rational scale_to_base_
QuantityNode(std::shared_ptr< const SymbolicNode > value, LMCAS::DimensionSignature dimension, Rational scale_to_base, std::string display_unit)
const std::string display_unit_
const auto & dimension() const noexcept
std::shared_ptr< const SymbolicNode > clone() const override
const LMCAS::DimensionSignature dimension_
int compare_same_type(const SymbolicNode &other) const override
const std::shared_ptr< const SymbolicNode > & domain() const noexcept
LMCAS_AST_NODE_FACTORY_FRIEND
std::shared_ptr< const SymbolicNode > clone() const override
const std::shared_ptr< const SymbolicNode > & predicate() const noexcept
const std::string element_var_
SetBuilderNode(std::string var, std::shared_ptr< const SymbolicNode > dom, std::shared_ptr< const SymbolicNode > pred)
构造集合构造器节点。
const std::shared_ptr< const SymbolicNode > domain_
std::size_t compute_hash() const override
const std::shared_ptr< const SymbolicNode > predicate_
int type_priority() const override
void accept(LMCAS::detail::SymbolicVisitor &visitor) const override
const std::string & element_var() const noexcept
virtual void visit(const NumberNode &node)=0
std::shared_ptr< const Node > make_node(Args &&... args)
void hash_combine(std::size_t &seed, std::size_t value)
将一个哈希值混合到种子中,用于组合多个字段的哈希.
ExprResult membership(const ExprPtr &element, const ExprPtr &set, bool negated)