12using Node = std::shared_ptr<const SymbolicNode>;
22 PeriodInference(
const AssumptionContext& assumptions,
const InferenceEngine& engine,
32 ~Leave() {
context.leave_recursion(); }
38 ~LeaveProof() { --
depth; }
41 if (
const auto* symbol =
dynamic_cast<const VariableNode*
>(node.get())) {
42 if (!symbol->is_constant() &&
91 const auto* symbol =
dynamic_cast<const VariableNode*
>(argument.get());
92 if (symbol && !symbol->is_constant() && symbol->name() ==
variable_ &&
96 auto inner =
infer(argument);
97 if (!inner) {
return inner; }
98 if (inner.value().periodic ==
Tribool::True && inner.value().real_valued)
110 for (
auto* coefficient : {&affine.value()->slope, &affine.value()->offset}) {
113 *coefficient = std::move(normalized.value());
115 const auto& slope = affine.value()->slope;
116 const auto& offset = affine.value()->offset;
117 for (
const auto& coefficient : {slope, offset}) {
139 std::shared_ptr<SymbolicExpr> magnitude;
143 magnitude = SymbolicExpr::multiply(SymbolicExpr::number(-1), slope);
151 SymbolicExpr::multiply(SymbolicExpr::number(2), exact_pi.value());
161 for (
const auto&
name : names) {
163 if (!step)
throw step.error();
171 if (!defined || defined.value() !=
Tribool::True)
return defined;
184 const SymbolicExpr& expression,
const std::string&
variable,
185 const AssumptionContext& assumptions,
const InferenceEngine& engine,
200 const SymbolicExpr& expression,
const std::string&
variable)
const {
209 return proof.value().periodic;
213 const SymbolicExpr& expression,
const std::string&
variable)
const {
222 return std::move(proof.value().period);
函数节点,表示数学函数调用(三角函数、对数、特殊函数等)。
static Result failure(CasErrc code, std::string message, std::string operation={})
const std::string & name() const noexcept
Result< PeriodEvidence > period_from_slope(const Node &node, FunctionNode::FuncType type, const std::shared_ptr< SymbolicExpr > &slope, Tribool nonzero)
Result< PeriodEvidence > arctangent_period(const Node &argument)
Result< PeriodEvidence > affine_period(const Node &node, const Node &argument, FunctionNode::FuncType type)
Result< Tribool > real_defined(const Node &node) const
Result< PeriodEvidence > infer(const Node &node)
PeriodInference(const AssumptionContext &assumptions, const InferenceEngine &engine, const std::string &variable, ComputationContext &context)
bool independent(const Node &node) const
const std::string & variable_
Result< PeriodEvidence > function_period(const Node &node)
detail::AssumptionFacts facts_
const AssumptionContext & assumptions_
Result< PeriodEvidence > declared_period(const Node &node, const VariableNode &symbol)
ComputationContext & context_
Result< PeriodEvidence > periodicity_checked(const SymbolicExpr &expression, const std::string &variable, const AssumptionContext &assumptions, const InferenceEngine &engine, ComputationContext &context)
constexpr const char * periodic_operation
std::optional< SymbolicExpr > period
std::shared_ptr< const SymbolicNode > Node
std::shared_ptr<::LMCAS::SymbolicExpr > make_expression_ptr(SymbolicNodePtr root)
const SymbolicNodePtr & node(const ::LMCAS::SymbolicExpr &expression) noexcept
ExpressionResult constant_expression(const char *name)
ExpressionResult simplify_expression(const ExprPtr &expression, ComputationContext &context)
Result< Tribool > query_nonzero_value(const Node &node, const FactsQuery &facts, Domain domain, ComputationContext &context)
inline ::LMCAS::SymbolicExpr expression_from_node(SymbolicNodePtr root)
Result< Tribool > query_definedness(const Node &node, const FactsQuery &facts, Domain domain, ComputationContext &context, bool *violated_real_restriction)
std::shared_ptr< const Node > make_node(Args &&... args)
Result< Tribool > query_real_value(const Node &node, const FactsQuery &facts, ComputationContext &context)
Result< std::optional< AffineForm > > recognize_affine(const SymbolicExpr &expression, const std::string &variable, ComputationContext &context)
Result< Tribool > query_positive_value(const Node &node, const FactsQuery &facts, ComputationContext &context)
const std::string & variable
const std::vector< Polynomial< BigInt > > const BigInt ComputationContext & context
ExprResult real(const ExprPtr &expression, ComputationContext &context)
Result< T > checked_inference_result(const SymbolicExpr &expr, const std::string &operation, ComputationContext &context, const std::function< Result< T >()> &query)
Result< std::optional< SymbolicExpr > > InferencePeriodResult
Tribool
Tri-state logic value for property queries.
@ Unknown
Property cannot be determined
@ True
Property definitely holds
@ False
Property definitely does not hold
std::size_t std::size_t depth
std::set< std::string > free_variables(const detail::SymbolicNodePtr &expression, detail::RewriteBudget *budget)
Result< Tribool > InferenceTriboolResult
ExprResult function(const std::string &name, std::vector< ExprPtr > arguments)
__attribute__((visibility("default"))) Result< EqvProfile > eqv_profile_from_name(const std const std::string & name