LMCAS
Lamina Computer Algebra System
载入中...
搜索中...
未找到
facts_query_adapters.cpp
浏览该文件的文档.
5
6#include <limits>
7#include <new>
8
9namespace LMCAS::detail {
10
11Result<bool> ScopedFacts::shadows(const std::shared_ptr<const SymbolicNode>& node,
13 auto access = context.consume_steps(0, "facts.scoped");
14 if (!access) { return Result<bool>::failure(access.error()); }
15 try {
16 RewriteBudget budget(context, context.limits().max_recursion_depth,
17 std::numeric_limits<std::size_t>::max(), "facts.scoped");
19 } catch (const CasError& error) {
20 return Result<bool>::failure(error);
21 } catch (const std::bad_alloc&) {
23 "scoped facts allocation failed", "facts.scoped");
24 }
25}
26
27Result<Tribool> ScopedFacts::is_positive(const std::shared_ptr<const SymbolicNode>& node,
29 auto hidden = shadows(node, context);
30 if (!hidden) { return Result<Tribool>::failure(hidden.error()); }
32}
33
34Result<Tribool> ScopedFacts::is_negative(const std::shared_ptr<const SymbolicNode>& node,
36 auto hidden = shadows(node, context);
37 if (!hidden) { return Result<Tribool>::failure(hidden.error()); }
39}
40
41Result<Tribool> ScopedFacts::is_nonnegative(const std::shared_ptr<const SymbolicNode>& node,
43 auto hidden = shadows(node, context);
44 if (!hidden) { return Result<Tribool>::failure(hidden.error()); }
46}
47
48Result<Tribool> ScopedFacts::is_nonzero(const std::shared_ptr<const SymbolicNode>& node,
50 auto hidden = shadows(node, context);
51 if (!hidden) { return Result<Tribool>::failure(hidden.error()); }
52 return hidden.value() ? Result<Tribool>(Tribool::Unknown) : outer_.is_nonzero(node, context);
53}
54
55Result<Tribool> ScopedFacts::is_real(const std::shared_ptr<const SymbolicNode>& node,
57 auto hidden = shadows(node, context);
58 if (!hidden) { return Result<Tribool>::failure(hidden.error()); }
59 return hidden.value() ? Result<Tribool>(Tribool::Unknown) : outer_.is_real(node, context);
60}
61
62namespace {
63
64class NoFacts final : public FactsQuery {
65public:
66 Result<Tribool> is_positive(const std::shared_ptr<const SymbolicNode>&, ComputationContext& context) const override {
67 return unknown(context);
68 }
69
70 Result<Tribool> is_negative(const std::shared_ptr<const SymbolicNode>&, ComputationContext& context) const override {
71 return unknown(context);
72 }
73
74 Result<Tribool> is_nonnegative(const std::shared_ptr<const SymbolicNode>&, ComputationContext& context) const override {
75 return unknown(context);
76 }
77
78 Result<Tribool> is_nonzero(const std::shared_ptr<const SymbolicNode>&, ComputationContext& context) const override {
79 return unknown(context);
80 }
81
82 Result<Tribool> is_real(const std::shared_ptr<const SymbolicNode>&, ComputationContext& context) const override {
83 return unknown(context);
84 }
85
86private:
88 auto access = context.consume_steps(0, "facts.empty");
89 if (!access) { return Result<Tribool>::failure(access.error()); }
90 return Tribool::Unknown;
91 }
92};
93
94}
95
96const FactsQuery& no_facts() noexcept {
97 static const NoFacts facts;
98 return facts;
99}
100
101}
virtual Result< Tribool > is_real(const std::shared_ptr< const SymbolicNode > &node, ComputationContext &context) const =0
virtual Result< Tribool > is_nonnegative(const std::shared_ptr< const SymbolicNode > &node, ComputationContext &context) const =0
virtual Result< Tribool > is_positive(const std::shared_ptr< const SymbolicNode > &node, ComputationContext &context) const =0
virtual Result< Tribool > is_nonzero(const std::shared_ptr< const SymbolicNode > &node, ComputationContext &context) const =0
virtual Result< Tribool > is_negative(const std::shared_ptr< const SymbolicNode > &node, ComputationContext &context) const =0
static Result failure(CasErrc code, std::string message, std::string operation={})
Result< Tribool > is_real(const std::shared_ptr< const SymbolicNode > &node, ComputationContext &context) const override
Result< Tribool > is_nonzero(const std::shared_ptr< const SymbolicNode > &node, ComputationContext &context) const override
Result< Tribool > is_negative(const std::shared_ptr< const SymbolicNode > &node, ComputationContext &context) const override
Result< bool > shadows(const std::shared_ptr< const SymbolicNode > &node, ComputationContext &context) const
Result< Tribool > is_positive(const std::shared_ptr< const SymbolicNode > &node, ComputationContext &context) const override
Result< Tribool > is_nonnegative(const std::shared_ptr< const SymbolicNode > &node, ComputationContext &context) const override
Result< Tribool > is_positive(const std::shared_ptr< const SymbolicNode > &, ComputationContext &context) const override
Result< Tribool > is_nonzero(const std::shared_ptr< const SymbolicNode > &, ComputationContext &context) const override
Result< Tribool > is_real(const std::shared_ptr< const SymbolicNode > &, ComputationContext &context) const override
Result< Tribool > is_negative(const std::shared_ptr< const SymbolicNode > &, ComputationContext &context) const override
Result< Tribool > is_nonnegative(const std::shared_ptr< const SymbolicNode > &, ComputationContext &context) const override
多元 Hensel 提升(单变量步)
const SymbolicNodePtr & node(const ::LMCAS::SymbolicExpr &expression) noexcept
const FactsQuery & no_facts() noexcept
RewriteBudget const FactsQuery & facts
std::size_t std::size_t ComputationContext & context
bool expression_depends_on_variable(const detail::SymbolicNodePtr &expression, const std::string &variable, detail::RewriteBudget *budget)
@ Unknown
Property cannot be determined