python-用列表表示布尔表达式

tur*_*oup 4 python algorithm boolean list

我试图用仅包含列表的Python产品乘积形式(SOP)来表示布尔表达式。

例如,我有布尔表达式

ABC+DE(FG+IH)
Run Code Online (Sandbox Code Playgroud)

我需要找到与上面的表达式等效的列表,因此通过读取列表或嵌套列表并遵循某些规则来读取列表,读取列表的程序/程序员将能够将其转换回布尔表达式。

我想到的一种方法是构造嵌套列表。遵循两个规则:

  1. 同一列表中的元素被与在一起
  2. 列表彼此平行,因此进行或运算。

因此,对于上面的示例,它将转换为:

[[A,B,C],[D,E,[[F,G],[I,H]]]]
Run Code Online (Sandbox Code Playgroud)

但是这套规则在某些情况下会发生冲突。例如,给定[[E,F],[D,C]],它可以表示EF + DC或EFDC,因为[E,F]和[D,C]在同一列表中,因此应将它们相加,但列表是并行的,因此也应进行“或”操作。

我觉得我需要在上述两个规则之间设置一些优先级,或者添加另一个规则以使其更加清晰。

欢迎任何想法或建议。而且这不是家庭作业,只是一些娱乐。提前致谢!!

deS*_*gis 5

为什么列出而不是树?

OR = 0
AND = 1

class OpNode:
   def __init__(self, op, left, right):
       self.op = op
       self.left = left
       self.right = right

class LeafNode:
    def __init__(self, name, value):
       self.name = name
       self.value = value

A = LeafNode("A", True)
B = LeafNode("B", True)

exp = OpNode(OR, A, OpNode(AND, B, 
                                OpNode(OR, 
                                          LeafNode("C", False), 
                                          LeafNode("D", True))))
Run Code Online (Sandbox Code Playgroud)

exp等于 A+B(C+D)


Xav*_*olt 5

您可以走LISPy路线,让每个列表中的第一项成为操作员。例如,您给的表达式

ABC+DE(FG+IH)
Run Code Online (Sandbox Code Playgroud)

会成为

['or', ['and', A, B, C], ['and', D, E, ['or', ['and', F, G], ['and', I, H]]]]
Run Code Online (Sandbox Code Playgroud)

考虑到这是很可读的。干杯!