如何比较两个解析树,通过使用Z3求解器在Context Free Grammar中找到歧义?

时间:2013-05-19 22:06:32

标签: z3

语法示例:

E ::= E + E | n

由于以下两条路径,我需要证明语法是模糊的:

E -> E + E -> E + E + E -> n + E + E
E -> E + E -> n + E -> n + E + E

这个想法是人们会比较函数“sets”symbol1(符号,索引,时间)(对于特定时间t)和symbol2(符号,索引,时间) - 找到它们相等的位置 - 但是有不同的前身(即在时间t-1)

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

我可以发布代码,如果你感兴趣的话....(它关于一页和一半的价值,但这可能不合适的长?)。

代码用Z3Py编写。

1 个答案:

答案 0 :(得分:1)

一般来说,检查CFG是否含糊不清是不可判定的。但是,如果将规则应用程序的数量限制为较小的数量,则可以尝试使用该许多应用程序生成所有可能的字符串,并检查是否可以使用不同的步骤来访问相同的字符串。在任何情况下,我认为SMT求解器不适合这类问题,因为可导出的字符串数量可以随着步数的增加呈指数增长;这将要求你将步数保持在一个非常小的数字,使问题无趣。

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