Python 确定导致计算结果为真的布尔表达式的相关部分

Python 确定导致计算结果为真的布尔表达式的相关部分,python,parsing,boolean,expression,Python,Parsing,Boolean,Expression,假设我有一个布尔表达式,我知道它的计算结果为真,它有许多变量1…n,而且我也知道其中1…n个变量为真,我如何确定哪个真值对表达式有实际影响,即导致它的计算结果为真 基本示例:假设A和B或C和D的A=True、B=True和C=True。在这种情况下,C的值与布尔表达式的计算无关,因为如果D=false,表达式的右部分总是计算为false 我需要一种方法,例如找到相关的值来确定[a,B]是否相关 A = True B = True C = True D = False bool_exp = &qu

假设我有一个布尔表达式,我知道它的计算结果为真,它有许多变量1…n,而且我也知道其中1…n个变量为真,我如何确定哪个真值对表达式有实际影响,即导致它的计算结果为真

基本示例:假设A和B或C和D的A=True、B=True和C=True。在这种情况下,C的值与布尔表达式的计算无关,因为如果D=false,表达式的右部分总是计算为false

我需要一种方法,例如找到相关的值来确定[a,B]是否相关

A = True
B = True
C = True
D = False
bool_exp = "(A and B) or (C and D)"
print(eval(bool_exp)) #True

# is this doable?
print(find_relevant_values(bool_exp)) #[A, B]

我需要一种通用的方法,例如找到相关的值来确定相关的值。在上面的例子中[A,B]是相关的值。

下面的解决方案分为三个步骤:首先,解析输入字符串以生成表达式树。其次,遍历树以查找or运算符的任何实例。如果或操作数中的任何一个计算结果为True,则如果该操作数是终端值a、B、C或D,则生成该操作数,或者由find_递归遍历该操作数。最后,如果未找到or运算符,则计算整个表达式,如果结果为真,则遍历树以查找触发真值的所有相关表达式:

总而言之:

def find_relevant_values(s):
   #parse the input and create the tree
   r = list(parse_expr(iter(re.findall('\(|\)|\w+', s))))
   #consume the generator results from find_revelant
   return list(find_relevant(r))

print(find_relevant_values('(A and B) or (C and D)'))
print(find_relevant_values('(A and (B or C)) and (C or D)'))
输出:

['A', 'B']
['A', 'B', 'C']

将真变量视为变量,将假变量视为常量。然后简化。例如:A和B或C和D变成A和B或C和False,这将简化为A和B。@TomKarzes你会用什么来简化?布尔表达式可以更复杂,例如,考虑它的每一个输入都被否定否定一次。任何结果不同的都是对输出有影响的。@DanD。那不行。假设A,B,C,D都是真的。那么A和B或C和D将是真的,无论是否有任何单个变量被反转。所以你的逻辑会认为所有这些都没有效果,尽管表达是真实的。更简单的情况是A或B。如果A和B都是真的,那么它们中的任何一个都可以在不改变表达式的情况下反转,但显然至少其中一个必须为真才能使表达式为真。对于像A或不是A这样的东西,您想要什么?在这种情况下,无论A的值是多少,结果都是真的。整个表达式可以简化为常数true。那么A对结果有贡献吗?
['A', 'B']
['A', 'B', 'C']