簡體   English   中英

如何在Python中處理邏輯表達式?

[英]How do I deal with a logical expression in Python?

假設我得到了ie格式的邏輯表達式。 AvBv~C->D 它由布爾元素和運算符組成,如(v,~,->) (disjunction,negation,implication)。 我需要存儲這些表達式及其包含的每個元素。 此外,每個元素都應該有一個描述,所以我想我必須創建一個代表它們的類(帶有字段representationdescriptionelement1.representation="A"element1.description="This is element A"但我是不確定這是否是pythonic方式,也許一個名稱和描述為列的2D數組將是一個更好的主意,因為名稱都是唯一的。

  1. 我應該使用哪種數據結構來存儲這樣的表達式? 請注意,我需要存儲不同類型的元素和運算符,然后能夠將它們還原為邏輯表達式並對它們執行操作。
  2. 我應該創建識別每個元素和運算符的方法來處理邏輯運算還是有更好的方法? 也許使用像Lex-Yacc這樣的解析器或其他一些處理這些的解析器?

請原諒我,如果我不太清楚,但我來自Java,我無法在同一數據結構中存儲不同類型的元素。

  1. 創建表示表達式中每個元素的樹數據結構。
  2. 您確實可以使用解析器生成器從給定的字符串生成上述數據結構。

例如,連接可以表示如下,類似的方法可以用於變量:

class Node:
    operator = "AND"
    left_node = None
    right_node = None
    description = "text"
    value = None

class Node:
    operator = "VAR"
    left_node = None
    right_node = None
    description = "text"
    value = "B"

然后,您可以從這些節點中組合樹。

例如: A^B可以表示為具有ANDNode AND其中left_nodeVAR節點( value=A ),而right_node也是VAR節點( value=B )。

通過聲明__and____or____invert__方法,你可以用&| ~運算符來定義表達式。

class Element(object):
    def __init__(self, elt_id, elt_description=None):
        self.id = elt_id
        self.description = elt_description
        if self.description is None:
            self.description = self.id

    def __or__(self, elt):
        return CombinedElement(self, elt, op="OR")

    def __and__(self, elt):
        return CombinedElement(self, elt, op="AND")

    def __invert__(self):
        return CombinedElement(self, op="NOT")

    def __str__(self):
        return self.id

class CombinedElement(Element):
    def __init__(self, elt1, elt2=None, op="NOT"):
        # ID1
        id1 = elt1.id
        if isinstance(elt1, CombinedElement):
            id1 = '('+id1+')'
        # ID2
        if elt2 is not None:
            id2 = elt2.id
            if isinstance(elt2, CombinedElement):
                id2 = '('+id2+')'
        # ELT_ID
        if op == "NOT" and elt2 is None:
            elt_id = "~"+id1
        elif op == "OR": 
            elt_id = id1+" v "+id2
        elif op == "AND":
            elt_id = id1+" ^ "+id2
        # SUPER
        super(CombinedElement, self).__init__(elt_id)

a = Element("A")
b = Element("B")
c = Element("C")
d = Element("D")
e = Element("E")

print(a&b|~(c&d)|~e)

輸出:

((A ^ B) v (~(C ^ D))) v (~E)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM