【问题标题】:Generating code from truth tables!从真值表生成代码!
【发布时间】:2011-07-30 19:29:45
【问题描述】:

尽管这个问题听起来很奇怪,但我实际上有一组变量和一些条件,它们在这些条件下会产生有效状态。我当然会根据我的理解写出测试它们的代码,但是是否有一个系统/代码生成器可以生成具有所有适当优化的有效代码?

  $a   $b   Output
 ---------------
  0     0    1
  0     1    0
  1     0    1
  1     1    0

所以这个系统应该生成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 只是为了说明 - 我需要比较实际的字符串/值,所以聪明的乘法技术是行不通的。

【问题讨论】:

  • 使用 true/false 开关甚至 elseif 有什么问题
  • 顺便说一句,第二个示例的输出应该是 if($a==1 ^ $b==1)(前提是 ^ 是您语言中的 XOR 运算符)

标签: php code-generation generator truthtable


【解决方案1】:

您的系统是布尔逻辑的扩展,(除了值之间的 &&、|| 和 ! 围绕某些值,您还使用仅基于一个真值的结果,尽管有多个真值)。所以正常的方法是行不通的,我查看了 K-Map,我认为它在这里行不通。

您可以在所有可能的组合中组合所有 A、B、C、...,可能会为所有可能的子集引入新值(以处理 (A || B) && C),然后尝试所有可能的所有这些子集上的运算符组合,以查看运算符组合中的一个是否适用于所有组合,然后最后推断出一条规则,也许使用动态编程你可以加快一点速度,但它会很慢几个值,编程起来会很麻烦。 (要找到这些规则将远远超过 O(n^3))

一个更快/更容易/更快但消耗更多内存的解决方案是在哈希表/字典/数组中存储所有可能的组合,即为真(或所有为假,取决于哪个列表更短)。

【讨论】:

  • 我认为 k-map 可以工作,但我需要它来处理字符串而不是零和一
【解决方案2】:

您应该能够通过分析真值表的K-map 然后编写您的表达式来生成优化的解决方案。

【讨论】:

    【解决方案3】:

    有很多关于手工操作的文献;见卡诺图。 您可以自动化其中一种技术。

    但本质上,您要做的是构造一个表示真值表的简单布尔方程,然后对该方程应用符号布尔简化器(或最小化器)(硬件语言合成器将其作为其代码生成过程的一部分) )。

    构建朴素方程很容易:为每一行构建一个合取 你的真值表产生真,并取所有连词的析取。您的第一个表会产生简单的等式:

     (~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 的工业控制器的多种不同目标计算机语言。

    您可以看到一个例子,不是布尔简化,而是real algebraic simplification 使用 DMS。布尔简化更容易编写:-}

    【讨论】:

      【解决方案4】:

      我认为 CKen (http://cken.sourceforge.net/)(对你有好处)。

      CKen 支持“大写”和“小写”,因此它支持 58 (= 2x29) 个单变量!

      而且最重要的,可以在其中使用多表达式(通过分隔符):

      示例:a,b,c,d,e;(a+b)*c;d*e#a;

      另一方面,它非常快!


      您必须先定义变量,然后才能在表达式中使用它(变量)。

      【讨论】:

      • 这会生成真值表并计算值。它不会生成 OP 要求的代码。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-03-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-03-31
      相关资源
      最近更新 更多