我试图从这些语法中推导出他们的语言:
对于第一个,我认为(但不是很确定)语言是: {a ^(i)b ^(j)|我mod 2 = 0且j> 0}
第二个,我没有一个线索。
1.
G = ({S,A,B},{a,b},S,P)
P:
S -> AAB
A -> aaA | aa
B -> bB | b
2.
G = ({S,A,B},{a,b},S,P)
P:
S -> AB
A -> aAb | epsilon
B -> bBa | epsilon
为了达到第一个语法的形式语言,我尝试将其以不同的形式进行多次剪切,并发现“ a”必须重复多次。
答案 0 :(得分:1)
对于第一个,我认为(但不是很确定)语言是:{a ^(i)b ^(j)|我mod 2 = 0且j> 0}
反例:function countFri13(year) {
var count = 0;
const leapYear = (year % 4 && !((year % 100) && !(year % 400)))
var yearOffset = (1 + 5 * ((year - 1) % 4) + 4 * ((year - 1) % 100) + 6 * ((year - 1) % 400)) % 7;
if (leapYear) {
var monthOffsets = [0, 3, 4, 0, 2, 5, 0, 3, 6, 1, 4, 5]
} else {
monthOffsets = ([0, 3, 3, 6, 1, 4, 6, 2, 5, 0, 3, 4])
}
for (var month = 0; month < 12; month++) {
if ((yearOffset + monthOffsets[month]) % 7 === 0) {
count++;
}
}
return count;
}
// in ES6...
function countFri13es6(year) {
let count = 0,
monthOffsets = [];
const yearOffset = (1 + 5 * ((year - 1) % 4) + 4 * ((year - 1) % 100) + 6 * ((year - 1) % 400)) % 7;
(year % 4 && !((year % 100) && !(year % 400))) ? monthOffsets = [0, 3, 4, 0, 2, 5, 0, 3, 6, 1, 4, 5]: monthOffsets = ([0, 3, 3, 6, 1, 4, 6, 2, 5, 0, 3, 4])
for (var month = 0; month < 12; month++) {
if ((yearOffset + monthOffsets[month]) % 7 === 0) count++;
}
return count;
}
用的是该语言,而不是语法的语言。
放在一边:而不是
aab
我认为这更常见
{a^(i) ... | i mod 2 = 0 ...}`
第二个,我没有一个线索。
从{a^(2i) ... | ...}
衍生的语言只是从S
和A
衍生的语言的串联。
B
有2种选择,一种是递归的,另一种不是,因此从A
派生的任何句子都来自k> = 0递归生成的应用,然后是非递归的一次应用生产。由此,您应该能够获得源自A
的语言。
类似地A
,然后将它们串联起来。