67 lines
2.3 KiB
Python
67 lines
2.3 KiB
Python
S = [] # 以列表形式存储子句集S
|
||
|
||
""" 读取子句集文件中子句,并存放在S列表中 - 每个子句也是以列表形式存储 - 以析取式分割 - 例如:~p ∨ ~q ∨ r 存储形式为 ['~p', '~q', 'r'] """
|
||
|
||
def readClauseSet(filePath):
|
||
# global S
|
||
for line in open(filePath, mode='r', encoding='utf-8'):
|
||
line = line.replace(' ', '').strip()
|
||
line = line.split('∨')
|
||
S.append(line)
|
||
print(S)
|
||
|
||
|
||
""" - 为正文字,则返回其负文字 - 为负文字,则返回其正文字 """
|
||
def opposite(clause):
|
||
if '~' in clause:
|
||
return clause.replace('~', '')
|
||
else:
|
||
return '~' + clause
|
||
|
||
|
||
""" 归结 """
|
||
def resolution():
|
||
# global S
|
||
end = False
|
||
while True:
|
||
if end: break
|
||
father = S.pop()
|
||
print('father:',father)
|
||
for i in father[:]:
|
||
if end: break
|
||
for mother in S[:]:
|
||
print('mother:',mother)
|
||
if end: break
|
||
j = list(filter(lambda x: x == opposite(i), mother))
|
||
if j==[]:
|
||
continue
|
||
else:
|
||
print('\n亲本子句:' + ' ∨ '.join(father) + ' 和 ' + ' ∨ '.join(mother))
|
||
father.remove(i)
|
||
mother.remove(j[0])
|
||
print(father,mother)
|
||
#********** Begin **********#
|
||
if father==[] and mother==[]:
|
||
print('归结式:NIL')
|
||
end = True
|
||
elif father==[]:
|
||
print('归结式:' + ' ∨ '.join(mother))
|
||
elif mother==[]:
|
||
print('归结式:' + ' ∨ '.join(father))
|
||
else:
|
||
new_clause = father + mother # 创建新的归结式
|
||
print('归结式:' + ' ∨ '.join(new_clause))
|
||
S.append(new_clause) # 将新的归结式添加到 S 中
|
||
|
||
print('S:',S)
|
||
#********** End **********#
|
||
|
||
|
||
def main():
|
||
filePath = r'命题逻辑归结推理系统S.txt'
|
||
readClauseSet(filePath)
|
||
resolution()
|
||
|
||
|
||
if __name__ == '__main__':
|
||
main() |