我昨天在更改下发布了这个问题,但没有意识到我的帐户在 9 个月后仍然有效,抱歉重复发布,我已经修复了 jellybean 指出的示例中的错误,我将进一步详细说明问题的背景.
我正在尝试处理在python中表示为嵌套列表和字符串的一阶逻辑公式,以便它处于析取范式,
IE
[
'&',
['|', 'a', 'b'],
['|', 'c', 'd']
]
变成
[
'|',
[
'|',
['&', 'a', 'c'],
['&', 'b', 'c']
],
[
'|',
['&', 'a', 'd'],
['&', 'b', 'd']
]
]`
在哪里或并且|
是和。&
目前我正在使用递归实现,它对公式进行多次传递,直到在“ands”的列表参数中找不到任何嵌套的“或”符号。它用于处理一组嵌套公式,表示为通用计算树逻辑的字符串和列表,因此它不仅具有|
s 和&
s,而且具有时间运算符。
这是我的实现,performDNF(form)
是切入点。现在,dnfDistributivity()
它对适用于较小输入的公式执行单次传递,但是当您使用较大的输入时,while 循环检查函数 ( ) 在s 内checkDistributivity()
找不到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