如何定位导致布尔表达式结果为False的对应子项位置
实现思路
1 预处理拆分
首先把输入的简化表达式字符串做结构化拆分:
- 按空格分割字符串,过滤空值后得到元素序列,奇数位为布尔值,偶数位为逻辑运算符
- 分别提取两个有序列表:
原子布尔值列表:每个元素是转成bool类型的子项值,列表索引从0开始,对应原问题的子项位置为「索引+1」运算符列表:每个元素为and/or,长度比原子布尔值列表小1
2 按优先级拆分合取块
由于and优先级高于or,整个表达式天然等价于「多个纯and连接的合取块 用or连接」的结构,我们按or做分割即可得到所有合取块:
- 遍历运算符列表,遇到
or就做截断,把相邻的、被or隔开的原子布尔值归到同一个合取块中 - 每个合取块需要记录块内每个原子对应的原始子项位置和布尔值
- 示例:表达式
True and False or True and True and False拆分后得到两个合取块:块1[(位置1, True), (位置2, False)],块2[(位置3, True), (位置4, True), (位置5, False)]
3 定位每个合取块的故障子项
已知整个表达式结果为False,说明所有合取块的运算结果都为False(or运算所有子项为False时整体才为False)。对于每个纯and连接的合取块,块结果为False的直接原因是块内存在值为False的原子:
- 若只需要找直接导致块短路的子项:取块内第一个出现的False对应的原始子项位置即可
- 若需要找块内所有故障子项:收集块内所有值为False的原子对应的原始子项位置
- 示例:用户举例的
True && True && False拆分后只有1个合取块,第一个False对应位置3,完全匹配预期
4 结果输出规则
可根据实际需求选择输出逻辑:
- 只需任意一个根因:返回任意一个合取块的故障子项
- 需全部根因:返回所有合取块的故障子项组成的列表
- 需特定顺序的根因:对故障子项列表做排序后取对应值即可
内容的提问来源于stack exchange,提问作者Paolo Amato
相关产品推荐
相关产品推荐

