首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >自动简化冗余算术关系

自动简化冗余算术关系
EN

Stack Overflow用户
提问于 2021-03-19 19:34:10
回答 2查看 207关注 0票数 5

我正在寻找一种自动确定的方法,例如,(a < 12) & (a < 3) & (c >= 4)(a < 3) & (c >= 4)是相同的。我在Python中查看了Matlab的符号工具箱和SymPy,但是这些显然只能简化纯粹的布尔逻辑(例如simplify(a & b | b & a) -> ans=(a & b))。

有没有办法像上面描述的那样使用这些象征性的数学工具?

编辑

正如@ answer 12750353的答复中所指出的,我还想简化与布尔OR (例如((a < 12) & (a < 3) & (c >= 4)) | (a < 1) )连接的关系系统。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-03-24 13:06:17

SymPy集可以用于单变量简化,例如((x < 3) & (x < 5)).as_set() -> Interval.open(-oo, 3)和集合可以转换回关系。下面将一个复杂表达式转换为cnf形式,分离相对于自由符号的are,并在保持多元参数不变的同时简化那些是单变量的are。

代码语言:javascript
复制
def f(eq):
    from collections import defaultdict
    from sympy import to_cnf, ordered
    cnf = to_cnf(eq)
    args = defaultdict(list)
    for a in cnf.args:
        args[tuple(ordered(a.free_symbols))].append(a)
    _args = []
    for k in args:
        if len(k) == 1:
            _args.append(cnf.func(*args[k]).as_set().as_relational(k[0]))
        else:
            _args.append(cnf.func(*args[k]))
    return cnf.func(*_args)

例如:

代码语言:javascript
复制
>>> from sympy.abc import a, c
>>> f((a < 1) | ((c >= 4) & (a < 3) & (a < 12)))
(a < 3) & ((c >= 4) | (a < 1))
票数 3
EN

Stack Overflow用户

发布于 2021-03-23 11:39:32

您可以在渐近不等式解中查看一些选项。

我可以用reduce_inequalities来解决你的问题

代码语言:javascript
复制
from sympy.abc import a, c
import sympy.solvers.inequalities as neq
t = neq.reduce_inequalities([a < 12, a < 3, c >= 4])

结果是(4 <= c) & (-oo < a) & (a < 3) & (c < oo)

它也适用于一些更复杂的示例。

只要每个不等式有一个变量。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66714568

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档