Слова, які мають однаковий право-та ліво-асоціативний твір


9

Я почав вивчати недетерміновані автомати, використовуючи книгу Хопкрофта та Уллмана . Я застряг у проблемі, яка мені була дуже цікава:

Надайте недетермінованому кінцевому автомату, що приймає всі рядки, які мають однакове значення при оцінці зліва направо на правий наліво шляхом множення відповідно до наступної таблиці:

×abcaaacbcabcbca

Отже, якщо у нас є рядок , добуток зліва направо дорівнює а продукт справа наліво -abc
(a×b)×c=a×c=c
a×(b×c)=a×b=a

Таким чином, не повинен бути прийнятним для автоматів. Для мене очевидно, що будь-який рядок абоabcaabb або ccє прийнятним рядком (їхні праворуч і ліворуч оцінюють роботу на одних і тих же часткових рядках). Неважко дати NFA, який описує оцінку зліва направо, але проблема полягає в тому, що якщо машина намагається обчислити оцінку справа наліво, я думаю, що вона повинна знати довжину рядка (тому нескінченна пам'ять необхідна).

Тож як можна не детерміновані автомати визначити справа наліво, щоб порівняти оцінку зліва направо?

Відповіді:


6

Перший трюк тут - розглянути таблицю множення як таблицю переходу автомата AКожен штат представляє лист у таблиці множення, але не переживаючи про прийняття. Тож букви ліворуч і в тілі таблиці насправді стани - точніше було б їх записати якqa,qb,qcале я не хочу. Літери вгорі є введеннями.

Потім побудуйте автомат AT ("T"для транспозиції) для зворотного множення шляхом транспонуванняA:

ATabcaacbbaacccba

Тому A(abc) приймає вас до штату c, і так само AT(cba) переходить у стан a з AT, як ви зазначаєте.

Однак, ATприпускає, що ви рухаєтеся праворуч наліво, а ми все ще хочемо йти зліва направо. Отже, другий трюк - це повернути автомат (а не множення, яке би нас просто повернуло, якби ми почали), перевернувши всі стрілки, що призводить до недетермінованого автоматаATR наведена таблицею переходу нижче, із підмножинами, позначеними сполученими літерами, щоб курка не дряпалася, так ac є насправді {а,c}. (сподіваюся, у мене все в порядку - здається, працює).

АТRабcааббcбcаccабабаббcаcбccаcабcаcабcаббcабcабcабcабc

Ви можете інтерпретувати це як недетермінований автомат із лише трьома рядками над рядком або детермінований варіант із усіма 8 рядками.

Нарешті, машиною для вирішення проблеми є крос-продуктовий автомат оригіналу А і АТR, це є А×АТR виконувати поведінку перехрестя двох автоматів (нам це не потрібно АТ більше). А×АТR має стани, подібні до пар а,аc. Функція переходу працюєА і АТRнезалежно. Стан єдиного запуску1,1 переходить у a,a під введенням a, в b,b під введенням bтощо.

Стани, що приймають, у недетермінованій версії є a,a і т. д. У детермінованому варіанті приймаючими станами є пари, в яких є перший компонент другого набору компонентів, таких як a,a або b,bc.

A×ATR доповнені та визначені, як показано 25=38+1держави, тож пробачте мене, якщо я не випишу його докладно. Але недетермінований варіант має лише10=33+1 держав.


Дякую, мені справді допомогла моя відповідь, щоб зрозуміти ідею недетермінізму та «зворотності» автоматів. У мене виникли проблеми з розумінням цього поняття, використовуючи книгу Хопкрофта, тепер я використовую книгу Сіпсера "Вступ до теорії обчислень".
Містер Аріель

Розглянемо вхідні дані ba. 1,1 рухається до b,b після введення b, а потім до c, під введенням a, тому baне приймається, але має бути?
cemulate

8

() Якщо L є звичайною мовою, значить LR, мова, що складається із зворотного списку всіх слів уL, також регулярно. Прийміть це як вправу.

Як це допомагає нам вирішити проблему? ДозволяєLa,Lb,Lc бути мовами, що складаються з усіх рядків, які оцінюються a,b,cпри оцінці зліва направо. Мова, яка вас цікавить, - це

(LaLaR)(LbLbR)(LcLcR).
Це показує, що якщо ви знаєте, як довести (), тоді ви можете побудувати NFA для відповідної мови.

Насправді, якщо ви використовуєте ідею доказування(), тоді, ймовірно, ви можете просто йти вперед і сконструювати автомат. Тож давайте розглянемо це. Зокрема, спробуємо побудувати NFA дляLaR, мова всіх рядків, які оцінюються a при оцінці справа наліво.

Ідея така. Припустимо, перша буква, яку ви бачите, - цеb. Тоді решту рядка слід оцінити доb (відтоді bx=a мається на увазі x=b). Подібні міркування застосовуються, коли є перша літераc. Коли перша букваaоднак решта може оцінити будь-яке a або bабо бути нульовим. За допомогою NFA ми можемо здогадатися (а пізніше перевірити нашу здогадку).

Цей натяк повинен дати вам достатньо задуматися і сподіватися вирішити проблему.


Хороший спосіб довести це за допомогою формули - підтримка за це. Що стосується альтернативної ідеї "недетерміновані відгадки та перевірки", то це зазвичай нормально для підтвердження, але насправді досить складно виконати, як вимагає проблема. Я думаю, що тут є багато відсутніх деталей, наприклад, як слідкувати за рядком із зворотного кінця.
Девід Льюїс

@David, детально відсутня деталь.
Yuval Filmus

@Yuval - він не сказав, що це домашнє завдання - ми тут довіряємо людям, правда? Я також думаю, що це підтвердження існування призведе до досить великої машини, ймовірно, набагато більшої, ніж потрібно.
Девід Льюїс

@DavidLewis: Жилл дав більш повну відповідь, яка свідчить про те, що НФА справді не надто велика; недетермінізм робить це для вас. Однак відповідна DFA може бути величезною.
Рафаель

@MohamedAbbas Можливо, я не планую перевіряти.
Yuval Filmus

6

Симпатичний.

Спочатку побудуйте автомат, який обчислює продукт зліва направо. Легко! Покладіть перехідхуz коли завгодно ху=z. Є три держави{а,б,c}що представляють три можливі продукти. Почніть з четвертого стану1 з 1хх для усіх х. Остаточний стан єх якщо і лише тоді, якщо добуток введеного слова зліва направо є х.

Тепер давайте побудуємо автомат, який обчислює продукт справа наліво. Цей не буде детермінованим. Як ми це робимо? Просто… Щоб перейти в інший бік, просто переверніть все : стрілки та напрямок виробу.

Де ми були раніше хуху, ми зараз беремо хуху: коли ми споживаємо слово зліва направо, ми переходимо від продукту до правого фактора. Або, іншими словами,хуух.

Додайте відключений вузол 1заради порожнього слова. Усі вузли початкові.

Тепер нам потрібно обчислити обидва шляхи разом, тому ми беремо добуток двох автоматів: (х1,х2)у(z1,z2) iff х1уz1 і х2уz2. Нехай чотири держави(1,х) бути початковим, і чотири стани (х,х)бути остаточним. Цей нерозбірливий автомат розпізнає слово, якщо його продукт зліва направо, а його продукт справа наліво однаковийх.


У мене виникають проблеми з цим. Чи не потрібно вам це підтверджуватихуухпризводить до встановленого кінцевого стану? IAC, це не так просто, як "перевернути все", оскільки вам все одно доведеться споживати зліва направо, але примножувати справа наліво, і я не впевнений, що ви це зробили.
Девід Льюїс

@DavidLewis Набір станів кінцевий, я визначив це таким {оvеrлеfтаrrоша,б,б,1}. Я змінив порядок множення (забороняючи більше друкарських помилок).
Жил "ТАК - перестань бути злим"

5

Здається, що вашою основною проблемою є використання недетермінізму, тому дозвольте мені детальніше розглянути це.

Основна ідея, яку використовують інші, полягає в тому, що недетермінований апарат може здогадатися про кінцевий результат.

Розглянемо ваш невеликий приклад абcі ідея будівництва Жиля. Автомат "обчислює" продукт справа наліво відгадує результат на початку та перевіряє його. Отже, є три можливості:

  • Вгадайте а: Як перший симол а, rl-продукт бc повинно було бути а або б.
    • Вгадайте а: Як другий символ б, мабуть, був останній символ б.
      • (Вгадай б:) Це є c, тому не приймайте.
    • Вгадайте б: Як другий символ б, мабуть, був останній символ c.
      • (Вгадай c:) Це справді c, тому ми приймаємо.
  • Вгадайте б: Як перший симол а, це неможливо, тому не приймайте.
  • Вгадайте c: Як перший симол а, rl-продукт бc повинно було бути c
    • (Вгадай c:) Як другий символ б, мабуть, був останній символ а
      • (Вгадай а:) Це є c, тому не приймайте.

Як бачите, NFA здатна вгадувати та перевіряти всі можливі обчислення знизу вгору . Тому що прийнята мова визначається як набір рядків, який приймається принаймні одним запуском , усі неприйнятні на вході ігноруються; НФА "завжди гадає правильно".

Тепер цьому НФА легко запам'ятати свій перший вибір до кінця. Якщо він приймає, він може порівняти запам'ятовуваний символ з lr-продуктом (детерміновано), отриманим паралельно (як мовний перетин стосується NFA, безумовно, висвітлюється в Ullman / Hopcroft та будь-якому іншому базовому підручнику).


Ідея відгадати струну була для мене дивною, але я читав книгу Сіпсера і вважаю, що це кращий підхід для новачків, як я в теорії обчислення.
Містер Аріель

Подумайте про відгадування як роздвоєння з припущеним входом. Але потрібно бути обережними зі стратегіями здогадувань - переконайтеся, що будь-яке сховище, необхідне для відгадування, обмежене рівномірно для всіх роздвоєних потоків, інакше у вас більше немає автоматичного кінцевого стану . Також потрібно рівномірне обмеження щодо кількості активних роздвоєних ниток. Я думаю, що опис Рафаеля тут працює, але це потрібно принаймні згадати.
Девід Льюїс
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.