简化布尔表达式算法

有人知道一个简化布尔表达式的算法吗? 我记得布尔代数和Karnaught地图,但这适用于EVERITHING为布尔值的数字硬件。我想要考虑一些子表达式不是布尔值的东西。 例如:
a == 1 && a == 3
这可以转换为纯布尔表达式:
a1 && a3 
但这是表达是不可简化的,而对于算术的一点点知识,everibody可以确定表达式只是:
false
有些人知道一些链接?     
已邀请:
您可能对K-maps和Quine-McCluskey算法感兴趣。 我认为SymPy能够解决和简化布尔表达式,查看源代码可能很有用。     
您的特定示例将由SMT解算器解决。 (它确定没有变量的设置可以使表达式成为真;因此它总是错误的。更一般的简化超出了这种求解器的范围。)表明表达式相当于
true
false
当然是NP-即使没有将算术带入交易中也很难,所以即使这样也有很多实用的软件。根据范围内的算术知识量,问题可能是不可判定的。     
这个问题有两个部分,逻辑简化和表示简化。 为了简化逻辑,Quine-McCluskey。为了简化表示,使用分布标识(0& 1 | 0& 2)== 0&(1 | 2)递归地提取术语。 我在这里详述了这个过程。这仅仅使用&和|,但可以修改它以包含所有布尔运算符。     
使用谷歌的第一枪发现了这篇论文: http://hopper.unco.edu/KARNAUGH/Algorithm.html 当然,这不涉及非布尔子表达式。但是后一部分的一般形式确实很难,因为肯定没有算法来检查任意算术表达式是真,假或其他。您要求的内容深入到编译器优化领域。     
可能的不同值的数量是否有限且已知?如果是这样,您可以将每个表达式转换为布尔表达式。例如,如果a有3个不同的值,那么你可以有变量
a1
a2
a3
,其中
a1
为真意味着
a == 1
等。一旦你这样做,你就可以依赖于Quine-McCluskey算法(对于更大的例子可能更好)比卡诺的地图)。以下是Quine-McCluskey的一些Java代码。 我不能说这个设计是否会真正简化事情或使它们更复杂,但你可能至少要考虑它。     
这很难。我找到的算法以最简单的方式匹配每个输出组合,每个输入组合。但这是基本的算法,没有解决每一个表达。 如果所有输出(q1,q2,q3,q4)与输入A组合相同,那么简化的结果将是A. 如果没有,您将尝试另一个变量/输入依赖项。     

要回复问题请先登录注册