16 std::vector<std::shared_ptr<const
SymbolicNode>>{})))) {}
18ExprSet::ExprSet(ConstExprPtr expression)
19 : expression_(std::move(expression)) {
20 const auto&
node =
static_cast<const FiniteSetNode&
>(*detail::node(*expression_));
21 elements_.reserve(
node.elements().size());
22 for (
const auto& element :
node.elements()) {
23 elements_.push_back(std::make_shared<const SymbolicExpr>(
24 detail::expression_from_node(element)));
28Result<ExprSet> ExprSet::make(std::vector<ExprPtr> elements) {
30 for (
const auto& element : elements) {
33 "set<Expr> elements cannot be null",
38 if (!expression) {
return Result<ExprSet>::failure(expression.error()); }
39 return Result<ExprSet>::success(
40 ExprSet(std::make_shared<const SymbolicExpr>(*expression.value())));
43bool ExprSet::contains(
const SymbolicExpr& expression)
const {
44 const auto&
node =
static_cast<const FiniteSetNode&
>(*detail::node(*expression_));
45 return node.contains(*detail::node(expression));
48bool ExprSet::subset_of(
const ExprSet& other)
const {
49 for (
const auto& element : elements_) {
50 if (!other.contains(*element)) {
57ExprSet ExprSet::set_union(
const ExprSet& other)
const {
60 return ExprSet(std::make_shared<const SymbolicExpr>(*result.value()));
63ExprSet ExprSet::intersection(
const ExprSet& other)
const {
66 return ExprSet(std::make_shared<const SymbolicExpr>(*result.value()));
69ExprSet ExprSet::difference(
const ExprSet& other)
const {
72 return ExprSet(std::make_shared<const SymbolicExpr>(*result.value()));
75ExprSet ExprSet::symmetric_difference(
const ExprSet& other)
const {
78 return ExprSet(std::make_shared<const SymbolicExpr>(*result.value()));
84 return ExprSet::make(std::move(elements));
85 }
catch (
const std::bad_alloc&) {
87 "set<Expr> allocation failed",
89 }
catch (
const std::exception& error) {
100 "set<Expr> membership element cannot be null",
109 if (!result) {
return result; }
114 const ExprSet&
rhs) {
119 const NumberDomainSet&
domain) {
133 const ExprSet& lhs,
const ExprSet&
rhs)
143 std::make_shared<const SymbolicExpr>(*expression.value())));
144 }
catch (
const std::bad_alloc&) {
152 const ExprSet& lhs,
const ExprSet&
rhs)
162 std::make_shared<const SymbolicExpr>(*expression.value())));
163 }
catch (
const std::bad_alloc&) {
166 "set<Expr> intersection allocation failed",
172 const ExprSet& lhs,
const ExprSet&
rhs)
182 std::make_shared<const SymbolicExpr>(*expression.value())));
183 }
catch (
const std::bad_alloc&) {
186 "set<Expr> difference allocation failed",
192 const ExprSet& lhs,
const ExprSet&
rhs)
202 std::make_shared<const SymbolicExpr>(*expression.value())));
203 }
catch (
const std::bad_alloc&) {
206 "set<Expr> symmetric difference allocation failed",
static Result failure(CasErrc code, std::string message, std::string operation={})
static Result success(T value)
const SymbolicNodePtr & node(const ::LMCAS::SymbolicExpr &expression) noexcept
inline ::LMCAS::SymbolicExpr expression_from_node(SymbolicNodePtr root)
std::shared_ptr< const Node > make_node(Args &&... args)
const std::vector< Polynomial< BigInt > > const BigInt ComputationContext & context
ExprSetResult expr_set(std::vector< ExprPtr > elements)
Result< bool > expr_set_contains(const ExprSet &set, const ExprPtr &element)
Result< bool > expr_set_subset(const ExprSet &lhs, const ExprSet &rhs)
ExprSetResult expr_set_symmetric_difference(const ExprSet &lhs, const ExprSet &rhs)
ExprSetResult expr_set_intersection(const ExprSet &lhs, const ExprSet &rhs)
Result< bool > expr_set_not_contains(const ExprSet &set, const ExprPtr &element)
SymbolicSetResult finite_set_difference(const SymbolicExpr &lhs, const SymbolicExpr &rhs, ComputationContext &context)
Result< bool > expr_set_subset_domain(const ExprSet &set, const NumberDomainSet &domain)
bool contains(const SymbolicExpr &expression, const std::string &variable)
const NumberDomainSet & domain
SymbolicSetResult make_finite_set(std::vector< std::shared_ptr< SymbolicExpr > > elements, ComputationContext &context)
std::shared_ptr< SymbolicExpr > ExprPtr
ExprSetResult expr_set_difference(const ExprSet &lhs, const ExprSet &rhs)
SymbolicSetResult finite_set_intersection(const SymbolicExpr &lhs, const SymbolicExpr &rhs, ComputationContext &context)
Result< ExprSet > ExprSetResult
constexpr const char * kExprSetOperation
ExprSetResult expr_set_union(const ExprSet &lhs, const ExprSet &rhs)
ExprSetResult expr_set_failure(CasErrc code, std::string message, const char *operation)
SymbolicSetResult finite_set_symmetric_difference(const SymbolicExpr &lhs, const SymbolicExpr &rhs, ComputationContext &context)
SymbolicSetResult finite_set_union(const SymbolicExpr &lhs, const SymbolicExpr &rhs, ComputationContext &context)