You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.10 17:55:19