如何通过使用Z3解算器比较两个解析树来发现上下文无关语法中的歧义?

如何通过使用Z3解算器比较两个解析树来发现上下文无关语法中的歧义?,z3,Z3,语法示例: E ::= E + E | n 我需要证明,由于以下两种途径,语法是不明确的: E -> E + E -> E + E + E -> n + E + E E -> E + E -> n + E -> n + E + E 其思想是将函数“集合”symbol1(符号,索引,时间)(对于特定时间t)和symbol2(符号,索引,时间)进行比较,找出它们的等效位置,但是具有不同的前置(即在时间t-1) 问题是我不知道如何比较这两个函数symbol1和s

语法示例:

E ::= E + E | n
我需要证明,由于以下两种途径,语法是不明确的:

E -> E + E -> E + E + E -> n + E + E
E -> E + E -> n + E -> n + E + E
其思想是将函数“集合”symbol1(符号,索引,时间)(对于特定时间t)和symbol2(符号,索引,时间)进行比较,找出它们的等效位置,但是具有不同的前置(即在时间t-1)

问题是我不知道如何比较这两个函数symbol1和symbol2

如果你感兴趣的话,我可以把代码贴出来。。。。(大约值一页半,但可能太长了?)


代码是用Z3Py编写的。

检查CFG是否不明确通常是无法确定的。但是,如果将规则应用程序的数量限制为一个较小的数量,则可以尝试使用这么多的应用程序生成所有可能的字符串,并检查是否可以使用不同数量的步骤达到相同的字符串。在任何情况下,我认为SMT解算器都不适合解决这类问题,因为可派生字符串的数量可以随着步数呈指数增长;这将要求您将步骤数量保持在非常小的数量,从而使问题变得无趣

当然,如果您事先知道语法的某些属性,那么您可以提出一个自定义算法来利用它。(假设它是LALR(1)可解析的。)但即使在这种情况下,与基于SMT的解决方案相比,其他算法方法也会更好