测试语言是否正常的算法
是否有算法/系统程序来测试语言是否正常? 换句话说,在给定的代数形式指定的语言(想到像L={anbn:n∈N}L={anbn:n∈N}L=\{a^n b^n : n \in \mathbb{N}\}),测试语言是否正常。想象一下,我们正在编写一个Web服务,以帮助学生完成所有作业。用户指定语言,然后Web服务将以“常规”,“非常规”或“我不知道”进行响应。(我们希望Web服务尽可能不频繁地回答“我不知道”。)是否有任何好的方法可以自动执行此操作?这容易处理吗?是否可以确定(即是否可以保证我们永远不需要回答“我不知道”)?是否存在合理有效的算法来解决此问题,并且能够针对实际中可能出现的许多大多数语言提供“不知道”以外的答案? 证明语言不规则的经典方法是激进引理。但是,似乎需要在某些时候进行手动洞察(例如,选择要泵送的单词),因此我不清楚是否可以将其转化为算法。 证明一种语言正常的经典方法是使用Myhill-Nerode定理来推导有限状态自动机。这看起来是一种很有前途的方法,但是它确实需要能够以代数形式对语言执行基本操作。对于我来说,目前尚不清楚是否有系统的方法可以对代数形式的语言象征性地执行所有可能需要的操作。 为了使这个问题更好地解决,我们需要确定用户如何指定语言。我愿意提出建议,但我在想这样的事情: L={E:S}L={E:S}L = \{E : S\} 其中是一个单词表达式,S是一个在长度变量上的线性不等式的系统,具有以下定义:EEESSS 每个就是一个字表达。(这些代表可以在∑ ∗中包含任何单词的变量。)x,y,z,…x,y,z,…x,y,z,\dotsΣ∗Σ∗\Sigma^* 每个是一个字表达。(此处x r表示字符串x的反方向。)xr,yr,zr,…xr,yr,zr,…x^r,y^r,z^r,\dotsxrxrx^rxxx 中的每一个都是单词表达。(示例性地,Σ = { a ,b ,c ,… },因此a ,b ,c ,…表示基础字母中的单个符号。)a,b,c,…a,b,c,…a,b,c,\dotsΣ={a,b,c,…}Σ={a,b,c,…}\Sigma=\{a,b,c,\dots\}a,b,c,…a,b,c,…a,b,c,\dots 每是一个字表达式中,如果η是一个长度可变。aη,bη,cη,…aη,bη,cη,…a^\eta,b^\eta,c^\eta,\dotsηη\eta 单词表达的串联是单词表达。 每个的是一个长度可变。(这些代表可以采用任何自然数的变量。)m,n,p,q,…m,n,p,q,…m,n,p,q,\dots 每个是长度可变的。(这些代表相应单词的长度。)|x|,|y|,|z|,…|x|,|y|,|z|,…|x|,|y|,|z|,\dots 这似乎足以处理我们在教科书练习中看到的许多情况。当然,如果您有更好的建议,则可以用其他任何以代数形式指定语言的文本方法来代替。