昨日、この質問を投稿しましたが、私のアカウントが 9 か月後もまだアクティブであることに気付かず、二重投稿で申し訳ありませんでした。ジェリービーンによって指摘された私の例のエラーを修正しました。問題のコンテキストについてさらに詳しく説明します。 .
Pythonでネストされたリストと文字列として表される一次論理式を処理して、論理和正規形になるようにしようとしています。
すなわち
[
'&',
['|', 'a', 'b'],
['|', 'c', 'd']
]
になる
[
'|',
[
'|',
['&', 'a', 'c'],
['&', 'b', 'c']
],
[
'|',
['&', 'a', 'd'],
['&', 'b', 'd']
]
]`
|
はまたはであり、&
です。
現在、「ands」のリスト引数内にネストされた「or」記号が見つからなくなるまで、式を何度かパスする再帰的な実装を使用しています。普遍的な計算ツリーロジック|
の文字列とリストとして表されるネストされた式のセットを処理するために使用されているため、 s とsだけで&
なく一時的な演算子も含まれます。
これは私の実装でperformDNF(form)
あり、エントリ ポイントです。現時点では、dnfDistributivity()
小さい入力に対して機能する数式に対して単一のパスを実行しますが、より大きな入力を使用すると、while ループ チェック関数 ( checkDistributivity()
) は|
s 内に&
s を検出せず、終了します。誰か助けてください、これは私を怒らせています。
def dnfDistributivity(self, form):
if isinstance(form, type([])):
if len(form) == 3:
if form[0] == '&':
if form[1][0] == '|':
form = [
'|',
['&', form[2], form[1][1]],
['&', form[2], form[1][2]]
]
elif form[2][0] == '|':
form = [
'|',
['&', form[1], form[2][1]],
['&', form[1], form[2][2]]
]
form[1] = self.dnfDistributivity(form[1])
form[2] = self.dnfDistributivity(form[2])
elif len(form) == 2:
form[1] = self.dnfDistributivity(form[1])
return form
def checkDistributivity(self, form, result = 0):
if isinstance(form, type([])):
if len(form) == 3:
if form[0] == '&':
print "found &"
if isinstance(form[1], type([])):
if form[1][0] == '|':
return 1
elif isinstance(form[2], type([])):
if form[2][0] == '|':
return 1
else:
result = self.checkDistributivity(form[1], result)
print result
if result != 1:
result = self.checkDistributivity(form[2], result)
print result
elif len(form) == 2:
result = self.checkDistributivity(form[1], result)
print result
return result
def performDNF(self, form):
while self.checkDistributivity(form):
form = self.dnfDistributivity(self.dnfDistributivity(form))
return form