1

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

我设法评估了一个公式是否格式正确:

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定律转换否定的forumla〜(form),摩根定律的BNF是这样的:

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

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

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

有人可以帮我解决这个问题吗?

4

1 回答 1

1

胡安·何塞——

无论您是否意识到,您都要求这些观众做很多工作。以下是有关如何在此问题上取得进展的一些建议:

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

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

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

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

  • 作为实现技巧,请阅读使用 operatorPrecedence 帮助器,因为它是专门为这些类型的解析作业而设计的。看看它是如何在 SimpleBool.py 中用于创建反映输入字符串结构的对象层次结构的。然后想想对象在你的转换过程中会做什么。

祝你好运!

于 2012-04-19T14:03:12.677 回答