如何将摩根定律应用于解析字符串?(转换字符串或使用解析操作)



我正在尝试做一个程序,使用语义三方法评估命题逻辑公式是有效还是无效。

到目前为止,我设法评估了一个公式是否格式良好:

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

现在我需要转换否定的论坛~(形式)与蒙根定律一致,摩根定律的BNF是这样的:

~((form) V (form)) = (~(form) ^ ~(form))
~((form) ^ (form)) = (~(form) V ~(form))

http://en.wikipedia.org/wiki/De_Morgans_laws

解析必须是递归的;我正在阅读有关Parseactions的信息,但我真的不明白我是python的新手,而且非常不熟练。

有人可以帮助我如何让它工作吗?

胡安·何塞 -

你要求这些观众做很多工作,无论你是否意识到。 以下是有关如何解决此问题的一些建议:

  • 认识到解析输入只是整个程序的第一步。你不能只编写任何通过输入的解析器,然后声明自己准备好进行下一步。您需要预测您将如何处理解析的输出,并尝试以这样一种方式解析数据,以便您准备好采取下一步 - 在您的情况下,这是执行一些逻辑转换以应用 DeMorgan 定律。事实上,你最好向后工作 - 假设你有一个解析器,你需要你的转换代码来处理什么,表达式的外观如何,你将如何执行转换本身? 这将自然地将您的思维构建到应用程序域,并在您开始编写解析器时为您提供目标结果格式。

  • 当你开始编写解析器时,请查看其他执行类似任务的pyparseing示例,例如pyparseing wiki上的 SimpleBool.py。了解他们如何解析输入以创建一组可评估的对象,然后可以在应用程序域中对这些对象进行操作(无论是评估它们、转换它们还是其他什么)。 考虑要在解析器中创建哪种对象,这些对象将与上一步中概述的转换方法一起使用。

  • 花点时间为要解析的语法编写 BNF。 写出一些要分析的示例测试字符串,以帮助您预测语法问题。 "~~p ^ q V r" 是有效的字符串吗?标识符可以是多个字符,还是仅限于单个字符(单个字符在开始时更容易使用,以后可以轻松扩展它)?如果可以的话,保持语法简单,例如只支持 () 进行分组,而不是任何匹配的 ()、[] 或 {} 对。

  • 实现解析器时,首先从简单的测试用例开始,然后逐步提高。如果你发现你早期做了一些假设,更复杂的字符串不支持,你可能不得不回溯一下,但这对于大多数编程项目来说是非常典型的。

  • 作为实现提示,请继续阅读使用运算符优先级帮助程序,因为它是专门为这些类型的分析作业设计的。 看看如何在 SimpleBool.py 中使用它来创建镜像输入字符串结构的对象层次结构。然后考虑对象在转换过程中会做什么。

祝你好运!

最新更新