PyEDA构建BDD后等价性验证返回False,求技术解决方案
问题分析与解决
核心问题
你的代码有两个关键问题导致equivalent返回False:
1. 对equivalent方法的用途理解错误
equivalent方法是用来判断两个布尔函数是否完全等价——也就是对所有变量赋值,两者的输出结果都完全一致。你的原BDD是4个最小项的逻辑或(对应1、2、3、4的二进制),而你测试的test_true_2只是其中一个最小项,显然两者逻辑上不相等,所以equivalent必然返回False。
你真正需要的是判断:测试表达式的所有满足赋值是否都能让原BDD为真(即测试表达式是原BDD的子集),或者某个具体赋值是否满足原BDD。
2. 第一个尝试的类型错误
test_true_1是表达式对象的列表,而equivalent需要接收单个BDD或表达式对象,直接传入列表会导致类型不匹配,无法得到正确结果。
修正方案
方案1:验证单个赋值是否满足原BDD
直接使用restrict方法将原BDD限制在目标赋值下,查看结果是否为1(True):
# 验证true_expr赋值是否满足原BDD result = bdd.restrict(true_expr) print(result) # 输出1,表示该赋值让原BDD为真
方案2:验证测试表达式是否被原BDD包含
将测试表达式转为BDD后,判断测试表达式与原BDD非的交集是否为空(为空则说明测试表达式的所有解都在原BDD中):
# 处理第一个尝试:将列表转为And表达式再转BDD test_true_1_bdd = expr2bdd(And(*test_true_1)) print((test_true_1_bdd & ~bdd).is_zero()) # 输出True # 处理第二个尝试 test_true_2_bdd = expr2bdd(test_true_2) print((test_true_2_bdd & ~bdd).is_zero()) # 输出True
可选:修正变量与二进制位的对应关系
你的注释里期望0001对应~x4 & ~x3 & ~x2 & x1,但代码中生成的是~x0 & ~x1 & ~x2 & x3,变量索引与二进制位的对应顺序相反。如果需要和注释一致,可以修改convert_binary_str_to_expr函数:
def convert_binary_str_to_expr(str_binary): # 让二进制字符串最右位对应x1,依次往左对应x2、x3、x4 reversed_str = str_binary[::-1] expr = [] for i in range(len(reversed_str)): var = f'x{i+1}' expr.append(var if reversed_str[i] == '1' else f'~{var}') return ' & '.join(expr)
修改后,0001会生成~x4 & ~x3 & ~x2 & x1,和你的注释逻辑一致。
内容的提问来源于stack exchange,提问作者hatahetahmad
相关产品推荐
相关产品推荐

