从真值表创建简化有序二进制决策图(ROBDD)

时间:2013-03-25 08:07:24

标签: logic solver truthtable binary-decision-diagram

是否有一个软件包(最好是应用程序,而不是库)从给定的真值表(某种文本格式)创建简化有序二进制决策图(ROBDD)?

4 个答案:

答案 0 :(得分:5)

您也可以尝试:http://formal.cs.utah.edu:8080/pbl/BDD.php

这是我目前使用的BDD的最佳工具。

答案 1 :(得分:1)

使用任何BDD库,您都可以按照自己的意愿行事。当然,你必须自己写一段代码。

如果您正在寻找轻量级工具,我经常使用这样的applet来快速查看函数的BDD:

http://tams-www.informatik.uni-hamburg.de/applets/java-bdd/

答案 2 :(得分:1)

BDD是一种内存受限的数据结构,因为它严重依赖于检测重复的子真值表。您找到的大多数BDD软件包并不适合大型的一般真值表,而是针对非常稀疏或高度重复的表达式进行了优化。

使用标准BDD包,您可以使用对变量进行操作的表达式。所以你必须迭代你的真值表,在表格中为1s构造类似于sum-sums表达式的东西。在此过程中,大多数库将动态地重新排序变量以适应内存约束,从而导致另一个巨大的减速。在大约24个变量之后,即使是非常稀疏的真值表,这些库也会开始在现代系统中肆虐。

如果您只是在寻找最终的BDD节点,并且已经隐式定义了其变量排序的真值表,那么只需使用一些Unix文本处理工具,就可以跳过很多外部库和可怕运行时的复杂性。 / p>

关于BDD的一个很好的资源,Knuth的TAOCP v4.1b,显示了BDD节点和它们的“珠子”,即非正方形字符串的子真值表的等价性。我将讨论一个更简单的版本,ZDD具有类似的结构,称为“zeads”:正面部分子真值表,它们并非完全为零。要概括回BDD,请使用过滤方形字符串的程序替换管道中的sed + grep,而不是保留正部分非零字符串。

要打印所有的一个因子表(作为ascii'1和'0的单行文件,结尾处的换行符),在设置变量和文件名的数量后运行以下命令:

MAX=8; FILENAME="8_vars_truthtable.txt"; for (( ITER=0; ITER<=${MAX}; ITER++ )) ; do INTERVAL=$((2 ** ${ITER})); fold -w ${INTERVAL} ${FILENAME} | sed -n '1~2!p' | grep -v "^0*$" | sort -u ; done

与BDD软件包相比,这有许多好处:

  • 简单,基本上没有无关的依赖。
  • 与内存中的哈希表不同,外部排序意味着没有颠簸。
  • 易于并行化&amp;如果您在for循环中分析时理解行缓冲和磁盘缓存,则可以扩展。
  • 如果写入中间文件,排序也会并行化。

我经常使用它来处理多达32个大变量的真值表,这些变量无法用BDD库实现。它根本没有对内存系统征税,几乎没有使用几MB。但是如果你有大量的RAM可用,像Linux这样的体面操作系统很乐意将它全部用于缓存磁盘,以使其更快。

答案 3 :(得分:0)

我也搜索了类似的内容,但是找不到JavaScript实现。

我现在创建了自己的模块,该模块可以创建,最小化和优化真值表中的bdd。

https://github.com/pubkey/binary-decision-diagram