如何修改代码以正确求解含多层NOT的逻辑表达式
多层NOT运算求解函数修复方案
现有代码bug根因
- 原代码通过
variable.index('NOT')默认匹配最左侧的NOT进行处理,遇到连续嵌套NOT的场景时,会错误将后一个NOT当作布尔值处理 - 原代码else分支未校验NOT后的元素是否为合法布尔值,直接将非
TRUE的元素赋值为TRUE,违背逻辑运算规则 - 以输入
["NOT", "NOT", "TRUE"]为例,原代码会匹配索引0的NOT,将索引1的"NOT"误转为"TRUE",再删除索引0的NOT,最终输出错误的["TRUE", "TRUE"]
调整思路
- NOT是右结合一元运算符,需优先处理最靠近原子布尔值的最右侧NOT(即最内层NOT)
- 处理时严格校验NOT后跟随的元素只能是
TRUE或FALSE - 增加循环逻辑,直到列表中无NOT残留再返回结果
修复后代码
def implement_not(variable): # 复制原列表避免修改传入的原始变量 var = variable.copy() # 循环处理所有NOT,直到无残留 while 'NOT' in var: # 计算最右侧NOT的索引(即最内层NOT) pos_not = len(var) - 1 - var[::-1].index('NOT') # 校验NOT的合法性:后必须跟随布尔值 if pos_not + 1 >= len(var) or var[pos_not + 1] not in {'TRUE', 'FALSE'}: raise ValueError("非法逻辑表达式:NOT后需跟随合法布尔值") # 翻转布尔值 var[pos_not + 1] = 'FALSE' if var[pos_not + 1] == 'TRUE' else 'TRUE' # 删除已处理的NOT del var[pos_not] return var
验证效果
- 输入
["NOT", "TRUE"],输出["FALSE"],符合预期 - 输入
["NOT", "NOT", "TRUE"],输出["TRUE"],符合逻辑规则
内容的提问来源于stack exchange,提问作者coder
相关产品推荐
相关产品推荐

