我的语言L只包含一个字符串:
写得更简洁
此字符串有2(2 ^ n-1)个字符,我想减少它。 我正在考虑使用交集,如果我能找到一些常规语言,其正则表达式的交集会产生这个字符串。
我在这里有递归函数,以防有用:
function recursiveRegex(charset) {
if(charset.length == 0) {
return [];
} else {
var char = charset.splice(charset.length - 1, 1);
var returnVal = recursiveRegex(charset);
return returnVal.concat(returnVal) + char ;
}
}
console.log(recursiveRegex(['a1', 'a2', 'a3', 'a4']));
答案 0 :(得分:3)
这不是常规语言,因此您无法找到定义语法的常规语法。
因此,这种语言没有正则表达式。
A_1: a_1
A_2: A_1 A_1 a_2
A_3: A_2 A_2 a_3
A_n: A_{n-1} A_{n-1} a_n
这个语法定义了你的语言,它不是常规语法。
这种语法没有定义常规语言的直接证据是,需要不止一定数量的内存位置来定义语言。对于给定的N
,需要一个取决于N
的数字来保留N
字。
将每个左符号视为内存的位置。如果你想使它成为常规,你应该有有限数量的规则。如果你需要使它有限,那么应该这样做:
ATOM:a1
RULE_ {n + 1}:ATOM | RULE_n RULE_n a_ {n + 1}
要正确创建此语言,您需要一个计数器,以便了解每个时刻要插入的a_n
。但是不可能使用常规语法创建任何类型的计数器。