这个问题听起来很奇怪,我实际上得到了一套可用的物品和一些可以产生有效状态的条件。我当然会根据我的理解写出测试它们的代码,但有没有一个系统/代码生成器生成有效的代码并进行所有适当的优化?
$a $b Output
---------------
0 0 1
0 1 0
1 0 1
1 1 0
所以这个系统shoudl生成php代码:
if($b==0) {}
为此:
$a $b Output
---------------
0 0 0
0 1 1
1 0 1
1 1 0
它应输出:
if(($a!=1 && $b!=1) && ($a!=0 && $b!=0)) {}
// any better way?
当然,这里的0和1仅用于iillustration - 我需要比较实际的字符串/值,因此聪明的乘法技术不会起作用。
答案 0 :(得分:2)
你的系统是布尔逻辑的扩展,(除了&&,||之间的值和!围绕某些值,你也使用仅基于一个真值的结果,尽管有多个真值)。所以正常的方法不起作用,我看过K-Map,我觉得它不会在这里起作用。
您可以将所有A,B,C,...组合在一起,可能为所有可能的子集引入新值(处理(A || B)&& C),然后尝试在所有这些子集上运算符的所有可能组合,以查看运算符组合中的一个是否适用于所有组合,然后最终通过动态编程推断出一个规则,你可以加快一点,但它会变慢任何超过几个价值的东西,编程都会很麻烦。 (它会在O(n ^ 3)以上找到这些规则)
更快/更容易/更快但更多内存成本核算解决方案只是在散列表/字典/数组中存储所有可能的组合(或所有错误,取决于哪个列表更短)。
答案 1 :(得分:1)
您应该能够通过分析真值表的K-map然后编写表达式来生成优化的解决方案。
答案 2 :(得分:0)
关于手工做这方面的文献很多;看卡诺图。 您可以自动执行其中一种技术。
但实质上你要做的是构造一个表示真值表的朴素布尔方程,然后将符号布尔简化器(或最小化器)应用于该等式(硬件语言合成器将此作为其代码生成过程的一部分)。
构建天真的方程很简单:为每一行构建一个连词 你的真值表产生真实,并取消所有连词的分离。你的第一张表会产生天真的等式:
(~a & ~b) | (a & ~b)
如果您对此应用布尔简化:
((~a | a) & ~b) // combine terms
(TRUE & ~b ) // consequence of ~a | a
~b // the answer
你的第二张桌子会产生天真的等式:
(~a & b) | (a & ~b )
这不会进一步简化。
您可以使用program transformation system来完成此操作。这样的系统通常允许您为输入语言定义解析器(在本例中为真值表),并定义从输入语言到输出语言的转换,以及输出语言的更多转换。您的输入到输出转换会将真值表符号映射到布尔方程符号。然后,对布尔方程的变换将进行简化。
一旦你有一个简化的公式,那么你想应用另一组转换来从纯布尔代数映射到你的最终计算机语言,在你的情况下,PHP。
我们经常使用DMS Software Reengineering Toolkit完成此类操作。 DMS为问题带来了一些很好的帮助:它理解了关联和交换代数重写,这使得简化方程的生成更容易,并且在复杂公式面前更加稳健。
在许多情况下,我们已经将DMS应用于代数布尔公式,其中包含数十万个文字(A或〜A形式的术语)。一个例子是代码生成器,它接受了如何根据传感器(读取工厂状态)和执行器(改变工厂状态的东西)控制工厂(字面意思)的描述,生成方程式,简化它们,然后翻译它们用于称为PLC的工业控制器的多种不同的目标计算机语言。
你可以看到一个例子,不是布尔简化,而是使用DMS的real algebraic simplification。布尔简化更容易编写: - }
答案 3 :(得分:0)
我认为CKen(http://cken.sourceforge.net/)(对你有好处)。
CKen支持''大写''和''小写'',所以它支持58(= 2x29)个单变量!
最重要的,多表达式可以在其中使用(通过分隔符):
示例:a,b,c,d,e;(a+b)*c;d*e#a;
另一方面,它非常快!
您必须在表达式中使用变量(变量)之前定义变量。