Algorithm 简化布尔表达式算法

Algorithm 简化布尔表达式算法,algorithm,boolean-logic,boolean,boolean-expression,Algorithm,Boolean Logic,Boolean,Boolean Expression,有人知道简化布尔表达式的算法吗 我记得布尔代数和卡诺特映射,但这是为数字硬件设计的,所有的东西都是布尔的。我想要的东西,考虑到一些子表达式不是布尔的 例如: a == 1 && a == 3 这可以转换为纯布尔表达式: a1 && a3 但这是一个不可约的表达式,而只要有一点算术知识,每个人都可以确定表达式是: false 有人知道一些链接?第一次使用谷歌找到这篇文章: 当然,这不涉及非布尔子表达式。但后一部分的一般形式确实很难,因为绝对没有算法来检查任

有人知道简化布尔表达式的算法吗

我记得布尔代数和卡诺特映射,但这是为数字硬件设计的,所有的东西都是布尔的。我想要的东西,考虑到一些子表达式不是布尔的

例如:

a == 1 && a == 3
这可以转换为纯布尔表达式:

a1 && a3 
但这是一个不可约的表达式,而只要有一点算术知识,每个人都可以确定表达式是:

false

有人知道一些链接?

第一次使用谷歌找到这篇文章:


当然,这不涉及非布尔子表达式。但后一部分的一般形式确实很难,因为绝对没有算法来检查任意算术表达式是真是假或是其他什么。您所要求的内容深入到您可能感兴趣的领域,并且


我认为Symphy能够解决和简化布尔表达式,查看源代码可能会很有用。

可能的不同值的数量是有限的和已知的吗?如果是这样,您可以将每个表达式转换为布尔表达式。例如,如果a有3个不同的值,那么你可以有变量
a1
a2
,和
a3
,其中
a1
为真意味着
a==1
,等等。一旦你这样做了,你就可以依赖Quine-McCluskey算法(这对于更大的例子可能比卡诺图更好)。这是给奎因·麦克罗斯基的


我不能说这个设计是否会简化事情或使它们变得更复杂,但你可能想至少考虑一下。

< P>你的具体例子将由A解决。(它将确定变量的任何设置都不能使表达式为真;因此它总是假的。更一般的简化不适用于此类解算器。)显示表达式等价于
true
false
当然是NP难的,即使不将算术引入交易,所以,即使有这么多实用的软件也很酷。这个问题取决于范围内的算术知识的多少。

这个问题有两个部分,逻辑简化和表示简化

为了简化逻辑,奎因·麦克罗斯基。为了简化表示,使用分布标识(0&1 | 0&2)=0&(1 | 2)递归提取术语


我详细说明了过程。这只给出了使用&和|的解释,但它可以修改为包含所有布尔运算符。

这是一个很难理解的问题。我发现的最简单的算法是将每个输出组合与每个输入组合进行匹配。但这是基本算法,并没有解决所有的表达式

如果所有输出(q1、q2、q3、q4)与输入的组合相同,则简化结果将为A


如果没有,您将尝试另一个variabel/输入依赖项。

如果
a
在允许这些变量的语言/运行时中声明为volatile变量/字段,并且在另一个线程上的值在1和3之间波动,该怎么办?我并不是说这是一个好的设计,但在软件中,“始终”和“从不”通常是相对的术语。这不是问题,实际使用是针对LINQ提供程序的,实际值是在查询转换时的值。如果他们再次执行查询,简化将再次运行,并使用更新的值。一般来说,这是不可能的。例如
a>0和b>0和n>2,而a^n+b^n=c^n
总是错误的,但要证明它并不那么容易。这意味着你必须进行特别的简化,而且你的问题没有明确的答案(因为这取决于你可能看到的表达式的性质)。你是对的,但因为这只是一个简化算法,所以我同意任何改进算法,即使不是最佳解决方案。mein场景主要是枚举和引用类型的相等和不连续运算符。带==>=><正整数!,这就是我的意思,但像这样,算法将不知道,在我的例子中,a1&&a3实际上是假的。因为a不能同时是1和3。我想我需要的是将值绑定到变量,并在karnott minterms中找到矛盾。我以前读过这篇文章,但我也发现它非常不详细,并且没有提供任何代码。