回答此问题可获得 20 贡献值,回答如果被采纳可获得 50 分。
<p>我试图处理一个一阶逻辑公式,在python中用嵌套列表和字符串表示,这样它就可以用析取范式了</p>
<p>即['&;',['|','a','b'],['|','c','d']]</p>
<p>变成</p>
<p>['|'['amp;',['amp;','a','c'],['amp;','b','c']],['amp;',['amp;','a','d',['amp;','b','d']]]</p>
<p>其中|是“or”和“and”是“and”。在</p>
<p>目前,im使用递归实现,它对一个公式进行多次传递,直到在“ands”的列表参数中找不到任何嵌套的“或”符号。在</p>
<p>这是我的实现,performDNF(form)是入口点。现在它只对公式执行一次传递,但是while循环检查函数在“&;s”中找不到“|”并终止,请帮助任何让我抓狂的人。在</p>
<pre><code>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
</code></pre>