语法示例:
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编写。
答案 0 :(得分:1)
一般来说,检查CFG是否含糊不清是不可判定的。但是,如果将规则应用程序的数量限制为较小的数量,则可以尝试使用该许多应用程序生成所有可能的字符串,并检查是否可以使用不同的步骤来访问相同的字符串。在任何情况下,我认为SMT求解器不适合这类问题,因为可导出的字符串数量可以随着步数的增加呈指数增长;这将要求你将步数保持在一个非常小的数字,使问题无趣。
当然,如果您事先知道语法的某些属性,那么您可以提出自定义算法来利用它。 (如果它是LALR(1)可解析的话。)即使在这种情况下,与基于SMT的解决方案相比,其他算法方法也会更好。