Учитывая языки
L1={anb2m|n,m≥1}
L2={anb3n|n≥0}
L = L1 ∩ L2
Я знаю, что L1
— это обычный язык, а L2
может быть представлен КПК.
Но я не понимаю ответа, в котором говорится, что L
это {a2nb6n|n≥1}
. Как вычислялось это решение?
Учитывая языки
L1={anb2m|n,m≥1}
L2={anb3n|n≥0}
L = L1 ∩ L2
Я знаю, что L1
— это обычный язык, а L2
может быть представлен КПК.
Но я не понимаю ответа, в котором говорится, что L
это {a2nb6n|n≥1}
. Как вычислялось это решение?
Язык — это всего лишь набор (правильных строк), так что здесь мы имеем просто простую задачу целочисленной арифметики. Достаточно снять элегантный костюм формальных языков, чтобы добраться до сути проблемы.
Оба набора L1
и L2
являются подмножествами {acount(a)bcount(b)|j,k≥0}
; то есть они состоят из некоторого количества a, за которым следует некоторое количество b. Условие для L1
ограничивает count(b)
положительным четным числом, поскольку оно должно быть 2m
для некоторого целого числа m≥1
. Условие для L2
ограничивает count(b)
точно равным 3×count(a)
.
Теперь пересечение двух множеств, определенных с помощью предикатов, — это множество элементов, для которых оба предиката истинны. Таким образом, count(b)
должно делиться и на 2, и на 3, что означает, что оно должно делиться на 6; другими словами, это должно быть 6n
для некоторого положительного целого числа n
. А это значит, что count(a)
должно быть 2n
, поскольку b ровно в три раза больше. Это дает вам предоставленный ответ.
Как и L2
, L
не штатный, но может быть реализован на очень похожем КПК.
L
в основном это предоставленное решение - person totoro   schedule 17.02.2017