我正在尝试使用语义三方法来评估命题逻辑公式是有效还是无效。
到目前为止,我设法评估公式是否形成良好:
from pyparsing import *
from string import lowercase
def fbf():
atom = Word(lowercase, max=1) #alfabeto minusculas
op = oneOf('^ V => <=>') #Operadores
identOp = oneOf('( [ {')
identCl = oneOf(') ] }')
form = Forward() #Iniciar de manera recursiva
#Gramatica
form << ( (Group(Literal('~') + form)) | ( Group(identOp + form + op + form + identCl) ) | ( Group(identOp + form + identCl) ) | (atom) )
return form
#Haciendo todo lo que se debe
entrada = raw_input("Entrada: ")
try:
print fbf().parseString(entrada, parseAll=True)
except ParseException as error: #Manejando error
print error.markInputline()
print error
print
现在我需要根据Monrgan定律转换否定论坛〜(形式),摩根定律的BNF是这样的:
~((form) V (form)) = (~(form) ^ ~(form))
~((form) ^ (form)) = (~(form) V ~(form))
http://en.wikipedia.org/wiki/De_Morgans_laws
解析必须是递归的;我正在阅读有关Parseactions的内容,但我并不理解我是python的新手并且非常不熟练。
有人可以帮助我解决这个问题吗?
答案 0 :(得分:1)
Juan Jose -
无论你是否意识到这一点,你都要求这些观众做很多工作。以下是有关如何在此问题上取得进展的一些建议:
认识到解析输入只是整个程序的第一步。您不能只编写通过输入获得的任何解析器,然后声明自己为下一步做好准备。您需要预测您将对解析的输出执行的操作,并尝试解析数据,使其准备好进行下一步 - 在您的情况下,将执行一些逻辑转换以应用DeMorgans Laws。事实上,你可能最好向后工作 - 假设你有一个解析器,你需要你的转换代码用什么,表达式如何看,以及你将如何执行转换本身?这自然会将您的想法构建到应用程序域,并在您开始编写解析器时为您提供目标结果格式。
当您开始编写解析器时,请查看执行类似任务的其他pyparsing示例,例如pyparsing wiki上的SimpleBool.py。了解它们如何解析输入以创建一组可评估对象,然后可以在应用程序域中对其进行操作(无论是评估它们,转换它们还是其他)。考虑一下您希望在解析器中创建哪种对象,这些对象将与您在上一步中概述的转换方法一起使用。
花时间为您将要解析的语法编写BNF。写出一些您要解析的示例测试字符串,以帮助您预测语法问题。 “~~ p ^ q V r”是一个有效的字符串吗?标识符可以是多个字符,还是仅限于单个字符(单个字符在开头时更容易使用,您可以在以后轻松扩展它)?如果可以,请保持语法简单,例如只支持()用于分组,而不是任何匹配的(),[]或{}的对。
实施解析器时,首先从简单的测试用例开始,然后逐步完成。如果你发现早期对更复杂的字符串不支持做出一些假设,你可能不得不回溯一下,但这对于大多数编程项目来说都很典型。
作为实现提示,请阅读使用operatorPrecedence帮助程序,因为它专门为这些类型的解析作业而设计。查看它在SimpleBool.py中的用法,以创建一个镜像输入字符串结构的对象层次结构。然后考虑一下对象在转换过程中会做什么。