是否有一个软件包(最好是应用程序,而不是库)从给定的真值表(某种文本格式)创建简化有序二进制决策图(ROBDD)?
答案 0 :(得分:5)
您也可以尝试:http://formal.cs.utah.edu:8080/pbl/BDD.php
这是我目前使用的BDD的最佳工具。
答案 1 :(得分:1)
使用任何BDD库,您都可以按照自己的意愿行事。当然,你必须自己写一段代码。
如果您正在寻找轻量级工具,我经常使用这样的applet来快速查看函数的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软件包相比,这有许多好处:
我经常使用它来处理多达32个大变量的真值表,这些变量无法用BDD库实现。它根本没有对内存系统征税,几乎没有使用几MB。但是如果你有大量的RAM可用,像Linux这样的体面操作系统很乐意将它全部用于缓存磁盘,以使其更快。
答案 3 :(得分:0)
我也搜索了类似的内容,但是找不到JavaScript实现。
我现在创建了自己的模块,该模块可以创建,最小化和优化真值表中的bdd。