Слова с одинаковым правым и левым ассоциативным произведением

9

Я начал изучать недетерминированные автоматы, используя книгу Хопкрофта и Уллмана . Я застрял в проблеме, которая показалась мне очень интересной:

Дать недетерминированный конечный автомат, принимающий все строки, имеющие одинаковое значение, при оценке слева направо как справа налево путем умножения в соответствии со следующей таблицей:

×abcaaacbcabcbca

Поэтому, если у нас есть строка , произведение слева направо равно ( a × b ) × c = a × c = c, а произведение справа налево равно a × ( b × c ) = a × b =abc
(a×b)×c=a×c=c
a×(b×c)=a×b=a

Таким образом, не должен быть приемлемым для автоматов. Для меня очевидно, что любая строка a a или b b или c c является допустимой строкой (их правая и левая оценка работают над одними и теми же частичными строками). Легко дать NFA, который описывает оценку слева направо, но проблема в том, что если машина пытается вычислить оценку справа налево, я думаю, что ей нужно знать длину строки (поэтому необходима бесконечная память).abcaabbcc

Итак, как недетерминированные автоматы могут оценить справа налево, чтобы сравнить с оценкой слева направо?

Мистер Ариэль
источник

Ответы:

6

Первый трюк заключается в том, чтобы рассматривать таблицу умножения как таблицу переходов автомата где каждое состояние представляет букву в таблице умножения, но пока не беспокоится о принятии. Так что буквы слева и в теле таблицы на самом деле являются состояниями - было бы точнее записать их как q a , q b , q c , но я не буду. Буквы в верхней части являются входными данными.Aqa,qb,qc

Затем создайте автомат T » для транспонирования) для обратного умножения путем транспонирования A :ATTA

ATabcaacbbaacccba

Таким образом, переводит вас в состояние c , и , как вы заметили, A T ( c b a ) переходит в состояние a of A T.A(abc)cAT(cba)aAT

Тем не менее, предполагает, что вы идете справа налево, а мы все еще хотим идти слева направо. Таким образом, второй трюк состоит в том, чтобы перевернуть автомат (а не умножение, которое бы просто вернуло нас, если бы мы начали), путем обращения всех стрелок в обратном направлении , что приводит к недетерминированному автомату A T R, указанному в таблице переходов ниже, с подмножества, обозначенные каскадными буквами, чтобы курица не царапалась, поэтому a c действительно { a , c } . (надеюсь, я все понял - кажется, работает).ATATRac{a,c}

ATRabcaabbcbcaccabababbcacbccacabcacabcabbcabcabcabcabc

Вы можете интерпретировать это как недетерминированный автомат только с тремя строками над линией или с определенной версией со всеми 8 строками.

Наконец, машиной для решения проблемы является автомат перекрестных произведений исходных и A T R , то есть A × A T R для выполнения пересечения двух автоматов (нам больше не нужен A T ) , × Т Р имеет состояния , которые представляют собой пары , такие как с , в с . Функция перехода запускает A и A T R независимо. Один начальное состояние 1 , 1 AATRA×ATRATA×ATRa,acAATR1,1переходит в при входе а , в б , б при входе б и т.д. a,aab,bb

Принимая состояния в неопределенных версиях являются и т.д. В детерминированной версии, принимая состояния пары , в которых первый компонент второго компонента набора, например, в , или б , б с .a,aa,ab,bc

дополненное и определенное, как показано, имеет 25 = 3 8 + 1 состояний, так что извините, если я не напишу это подробно. Но недетерминированная версия имеет только 10 = 3 3 + 1 состояний.A×ATR25=38+110=33+1

Дэвид Льюис
источник
Спасибо, это действительно помогло мне в вашем ответе понять идею недетерминизма и «обратного» автомата. У меня были проблемы с пониманием этой концепции с помощью книги Хопкрофта, и теперь я использую книгу Сипсера «Введение в теорию вычислений», это действительно хорошо.
г-н Ариэль
Рассмотрим ввод . 1 , 1 переходит к б , б после ввода б , а затем с , под входным а , так б не принято, но должно быть? ba1,1b,bbc,aba
Смешение
8

Если L регулярный язык, то L R , язык, состоящий изреверсавсех слов в L , также является регулярным. Примите это как упражнение.()LLRL

Как это помогает нам решить проблему? Пусть - языки, состоящие из всех строк, которые оцениваются как a , b , c при оценке слева направо. Интересующий вас язык ( L aL R a ) ( L bL R b ) ( L cL R c ) . Это показывает, что если вы знаете, как доказать (La,Lb,Lca,b,c

(LaLaR)(LbLbR)(LcLcR).
, тогда вы можете построить NFA для рассматриваемого языка.()

На самом деле, если вы используете идею доказательства , то, вероятно, вы можете просто пойти дальше и построить автомат. Итак, давайте рассмотрим это. В частности, давайте попробуем построить NFA для L R a , языка всех строк, которые оцениваются как a при оценке справа налево.()LaRa

bbbx=ax=bcaab

Этот намек должен дать вам достаточно, чтобы подумать и, надеюсь, решить проблему.

Юваль Фильмус
источник
Хороший способ доказать это с формулой - upvote для этого. Что касается альтернативной идеи «недетерминированного предположения и проверки», то это обычно нормально для доказательства, но на самом деле довольно сложно реализовать, как того требует проблема. Я думаю, что здесь есть много недостающих деталей, таких как, как отслеживать строку из серверной части.
Дэвид Льюис,
@ Дэвид, детали отсутствуют специально.
Юваль Фильмус
@Yuval - он не сказал, что это домашнее задание - мы доверяем людям здесь, верно? Я также думаю, что это доказательство существования приведет к довольно большой машине, вероятно, намного больше, чем необходимо.
Дэвид Льюис
@DavidLewis: Жиль дал более полный ответ, который показывает, что NFA действительно не слишком большой; недетерминизм делает это для вас. Однако соответствующий DFA может быть огромным.
Рафаэль
@MohamedAbbas Возможно, я не планирую проверять.
Юваль Фильмус
6

Милый.

xyzxy=z{a,b,c}11xxxxx

Теперь давайте создадим автомат, который вычисляет произведение справа налево. Этот будет недетерминированным. Как мы это делаем? Просто ... Чтобы пойти в другом направлении, просто поменяйте местами все : стрелки и направление продукта.

xyxyxyxyxyyx,

1

(x1,x2)y(z1,z2)x1yz1x2yz2(1,x)(x,x)x

Жиль "ТАК - перестань быть злым"
источник
xyyxприводит к конечному множеству состояний? IAC, это не так просто, как «перевернуть все», так как вам все равно придется потреблять слева направо, но умножать справа налево, и я не уверен, что вы это сделали.
Дэвид Льюис,
{overleftarrowa,b,b,1}
5

Кажется, что ваша главная проблема заключается в использовании недетерминизма, поэтому позвольте мне остановиться на этом подробнее.

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

abc

  • aabcab
    • abb
      • bc
    • bbc
      • cc
  • ba
  • cabcc
    • cba
      • ac

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

Теперь NFA легко запомнить свой первый выбор до конца. Если он принимает, он может сравнить запомненный символ с lr-произведением (детерминистически), полученным параллельно (то, как пересечение языка относится к NFA, наверняка описано в Ullman / Hopcroft и любом другом базовом учебнике).

Рафаэль
источник
Идея угадать строку была для меня странной, но я читал книгу о Сипсере и думаю, что это лучший подход для таких новичков, как я, в теории вычислений.
г-н Ариэль
Подумайте о том, чтобы угадать как ответвление с предполагаемым вводом Но нужно быть осторожным со стратегиями угадывания - убедитесь, что любое хранилище, необходимое для угадывания, ограничено равномерно для всех разветвленных потоков, иначе у вас больше не будет автомата с конечным состоянием. Также необходима равномерная оценка количества активных ветвлений. Я думаю, что описание Рафаэля здесь работает, но оно должно быть упомянуто по крайней мере.
Дэвид Льюис