2017-06-12 21 views
0

Pythonの((A/\ B)/ C)のような論理式を格納して作業したい(さらに式から各リテラルにアクセスする)。私はそれを行う方法を見つけた。私は以下のコードを投稿しています。しかし、初心者としては理解できません。誰も私にこのコードがどのように働いているのかを説明して、望ましい出力を与えることができますか?これは私の最初の時間stackoverflowのような任意の間違いのために私を許してください。論理式を実装するためのPythonコードの理解

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) 

Output : 

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

答えて

0

それはクラスElementを設定し、あなたが尋ねた操作の文字列表現を返すために、ビット演算子& |~を定義することによって動作します。

通常、~aは整数のビット演算です。0ビットはすべて1になります。逆も同様です。オペレータ__invert__が再定義されていますので、あなたが整数と同じように、あなたが代わりにaのビット単位の逆数を得るためのこの

a = Element("A") 
print(~a) 

を行うときには、あなたは文字列"~A"を取得します。

とても賢いですが、あなたがしたいことにはあまり役に立たないと思われます。それが行うのは、式を文字列に変換することだけです。