LMCAS
Lamina Computer Algebra System
载入中...
搜索中...
未找到
facts_query.hpp
浏览该文件的文档.
1#pragma once
2
3#include "assumption.hpp"
4#include "result.hpp"
5#include <memory>
6#include <optional>
7#include <string>
8#include <string_view>
9#include <vector>
10
11namespace LMCAS {
12
13class SymbolicNode;
14class SymbolicExpr;
17public:
18 virtual Result<Tribool> is_positive(const std::shared_ptr<const SymbolicNode>& node, ComputationContext& context) const = 0;
19 virtual Result<Tribool> is_negative(const std::shared_ptr<const SymbolicNode>& node, ComputationContext& context) const = 0;
20 virtual Result<Tribool> is_nonnegative(const std::shared_ptr<const SymbolicNode>& node, ComputationContext& context) const = 0;
21 virtual Result<Tribool> is_nonzero(const std::shared_ptr<const SymbolicNode>& node, ComputationContext& context) const = 0;
22 virtual Result<Tribool> is_real(const std::shared_ptr<const SymbolicNode>& node, ComputationContext& context) const = 0;
23
24protected:
25 ~FactsQuery() = default;
26};
27
28namespace detail {
29const FactsQuery& no_facts() noexcept;
30
31/**
32 * @brief 为绑定体提供词法作用域,隔离同名自由变量的外层事实。
33 * 无关表达式继续借用外层事实及其关系推论;栈上视图串联保留嵌套作用域。
34 */
35class ScopedFacts final : public FactsQuery {
36public:
37 ScopedFacts(const FactsQuery& outer, std::string_view bound_name)
38 : outer_(outer), bound_name_(bound_name) {}
39
40 Result<Tribool> is_positive(const std::shared_ptr<const SymbolicNode>& node, ComputationContext& context) const override;
41 Result<Tribool> is_negative(const std::shared_ptr<const SymbolicNode>& node, ComputationContext& context) const override;
42 Result<Tribool> is_nonnegative(const std::shared_ptr<const SymbolicNode>& node, ComputationContext& context) const override;
43 Result<Tribool> is_nonzero(const std::shared_ptr<const SymbolicNode>& node, ComputationContext& context) const override;
44 Result<Tribool> is_real(const std::shared_ptr<const SymbolicNode>& node, ComputationContext& context) const override;
45
46private:
47 Result<bool> shadows(const std::shared_ptr<const SymbolicNode>& node, ComputationContext& context) const;
49 const std::string bound_name_;
50};
52 const std::shared_ptr<const SymbolicNode>& node, const FactsQuery& facts, Domain domain,
53 ComputationContext& context, bool* violated_real_restriction = nullptr);
55 const std::shared_ptr<const SymbolicNode>& node, const FactsQuery& facts, Domain domain, ComputationContext& context);
57 const std::shared_ptr<const SymbolicNode>& node, const FactsQuery& facts, ComputationContext& context);
59 const std::shared_ptr<const SymbolicNode>& node, const FactsQuery& facts, ComputationContext& context);
61 const std::shared_ptr<const SymbolicNode>& node, const FactsQuery& facts, ComputationContext& context);
62
63/**
64 * @brief 返回完整定义域约束:空向量表示已证明,nullopt 表示无法完整表达。
65 * @note 非空向量表示条件合取;空定义域用假谓词表示。
66 */
68 const std::shared_ptr<const SymbolicNode>& expression, const FactsQuery& facts,
70
71}
72}
Core enumerations and forward declarations for the Assumption System.
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
~FactsQuery()=default
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
ScopedFacts(const FactsQuery &outer, std::string_view bound_name)
Result< Tribool > is_nonnegative(const std::shared_ptr< const SymbolicNode > &node, ComputationContext &context) const override
多元 Hensel 提升(单变量步)
const SymbolicNodePtr & node(const ::LMCAS::SymbolicExpr &expression) noexcept
Result< Tribool > query_nonzero_value(const Node &node, const FactsQuery &facts, Domain domain, ComputationContext &context)
RewriteBudget const FactsQuery Domain domain
const FactsQuery & no_facts() noexcept
Result< Tribool > query_definedness(const Node &node, const FactsQuery &facts, Domain domain, ComputationContext &context, bool *violated_real_restriction)
RewriteBudget const FactsQuery & facts
Result< std::optional< std::vector< std::shared_ptr< SymbolicExpr > > > > domain_constraints(const Node &node, const FactsQuery &facts, Domain domain, ComputationContext &context)
Result< Tribool > query_real_value(const Node &node, const FactsQuery &facts, ComputationContext &context)
Result< Tribool > query_nonnegative_value(const Node &node, const FactsQuery &facts, ComputationContext &context)
std::size_t std::size_t ComputationContext & context
Result< Tribool > query_positive_value(const Node &node, const FactsQuery &facts, ComputationContext &context)
const std::vector< Polynomial< BigInt > > const BigInt ComputationContext & context
Domain
Mathematical domain hierarchy (least specific → most specific). Complex ⊃ Real ⊃ Algebraic ⊃ Rational...