4

リストのみを使用して、Pythonの積和形式(SOP)でブール式を表現しようとしています。

たとえば、ブール式があります

ABC+DE(FG+IH)

上記の式に相当するリストを見つける必要があるため、リストまたはネストされたリストを読み取り、特定の規則に従ってリストを読み取ることにより、リストを読み取るプログラム/プログラマーはそれをブール式に変換することができます。

これを行うために私が考えた 1 つの方法は、ネストされたリストを構築することです。従うべき 2 つのルール:

  1. 同じリスト内の要素は AND で結合されます
  2. リストは互いに並列であるため、一緒に ORed します。

したがって、上記の例では、次のように変換されます。

[[A,B,C],[D,E,[[F,G],[I,H]]]]

しかし、この一連のルールは、場合によっては矛盾します。たとえば、[[E,F],[D,C]] が指定された場合、[E,F] と [D,C] は同じリストにあるため、AND を使用する必要があるため、EF+DC または EFDC のいずれかを意味します。 、しかしリストは並列であるため、それらも OR する必要があります。

上記の 2 つのルールの間に優先順位を設定するか、別のルールを追加してより明確にする必要があると思います。

ご意見やご提案は大歓迎です。また、宿題ではなく、ただの楽しみです。前もって感謝します!!

4

5 に答える 5

5

LISPy ルートに進み、各リストの最初の項目を演算子にすることができます。たとえば、あなたが与えた式

ABC+DE(FG+IH)

になるだろう

['or', ['and', A, B, C], ['and', D, E, ['or', ['and', F, G], ['and', I, H]]]]

考えると、これはかなり読みやすいです。乾杯!

于 2012-07-13T21:13:16.203 に答える
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))))

exp は次のようになりますA+B(C+D)

于 2012-07-13T20:47:23.050 に答える
2

最も外側のリストは「OR すべての直接エントリ」を意味し、入れ子になったリストの意味を OR と AND 直接エントリの間で入れ替えることができます。ネストのレベルを最も外側の 1 からカウントする場合、ネストの奇数レベルの項は OR し、ネストの偶数レベルの項は AND で結合する必要があります。

そうABC+DE(FG+IH)

なる[[A,B,C],[D,E,[[F,G],[I,H]]]]

ここにいくつかのPythonコードがあります:

リスト形式から式を返します。

def to_bool(lst, depth=0, or_them=True):
    if type(lst) == str:
        return lst
    else:
        partial = ( '+' if or_them else ''
                  ).join( to_bool(x, depth+1, not or_them) for x in lst)
        if or_them and depth > 0:
            # Mixture of variables and sublists so parenthesize
            return '(' + partial + ')'
        else:
            return partial

def main():
    A,B,C,D,E,F,G,H,I = 'ABCDEFGHI'
    e = [[A,B,C],[D,E,[[F,G],[I,H]]]]
    print('The list form of the boolean expression:', e)
    print('The boolean expression:', to_bool(e))


if __name__ == '__main__':
    main()

その出力:

The list form of the boolean expression: [['A', 'B', 'C'], ['D', 'E', [['F', 'G'], ['I', 'H']]]]
The boolean expression: ABC+DE(FG+IH)
于 2012-07-13T22:40:37.613 に答える
1

ORedコンマ以外の基本要素がリストの場合は一緒というルールを追加できると思います。したがって、この矛盾した解釈は得られません。

したがって[A,B]、 は両方の要素をシングルトンとして持っているので、 とANDed[[A,B],[C,D]]ありますがANDs、シングルトンとORsリストの間にあるため、AB+CD になります。

ある意味では、それはあなたrule #2がよりも優先されることを意味しますrule #1

于 2012-07-13T20:49:34.587 に答える
0

AND にはリストを、OR にはタプルを使用します。

于 2012-07-13T20:51:18.440 に答える