Чем не двусмысленность отличается от детерминизма?


13

Я пытаюсь понять, что подразумевается под «детерминистическим» в выражениях, таких как «детерминистическая контекстно-свободная грамматика». (Есть более детерминированные «вещи» в этой области). Я был бы признателен за пример более, чем самое сложное объяснение! Если возможно.

Мой основной источник путаницы - неспособность понять, чем это свойство грамматики отличается от (не) двусмысленности.

Самое близкое, что я нашел, - это цитата из статьи Д. Кнута « О переводе языков слева направо» :

Гинзбург и Грейбах (1965) определили понятие детерминированного языка; в разделе V мы показываем, что это именно те языки, для которых существует грамматика LR (k)

который становится круговым, как только вы доберетесь до Section V, потому что там говорится, что синтаксический анализатор LR (k) может анализировать это детерминированный язык ...


Ниже приведен пример, который я могу найти, чтобы помочь мне понять, что означает «неоднозначный», пожалуйста, посмотрите:

onewartwoearewe

Который может быть проанализирован как one war two ear eweили o new art woe are we- если грамматика позволяет это (скажем, в нем есть все слова, которые я только что перечислил).

Что мне нужно сделать, чтобы сделать этот пример языка (не) детерминированным? (Я мог бы, например, удалить слово oиз грамматики, чтобы грамматика не была неоднозначной).

Является ли вышеуказанный язык детерминированным?

PS. Пример взят из книги Гёдель, Эшер, Бах: Вечная золотая коса.


Допустим, мы определяем грамматику для языка примера следующим образом:

S -> A 'we' | A 'ewe'
A -> B | BA
B -> 'o' | 'new' | 'art' | 'woe' | 'are' | 'one' | 'war' | 'two' | 'ear'

По аргументу о необходимости разбора всей строки делает ли эта грамматика язык недетерминированным?


let explode s =
  let rec exp i l =
    if i < 0 then l else exp (i - 1) (s.[i] :: l) in
  exp (String.length s - 1) [];;

let rec woe_parser s =
  match s with
  | 'w' :: 'e' :: [] -> true
  | 'e' :: 'w' :: 'e' :: [] -> true
  | 'o' :: x -> woe_parser x
  | 'n' :: 'e' :: 'w' :: x -> woe_parser x
  | 'a' :: 'r' :: 't' :: x -> woe_parser x
  | 'w' :: 'o' :: 'e' :: x -> woe_parser x
  | 'a' :: 'r' :: 'e' :: x -> woe_parser x
  (* this line will trigger an error, because it creates 
     ambiguous grammar *)
  | 'o' :: 'n' :: 'e' :: x -> woe_parser x
  | 'w' :: 'a' :: 'r' :: x -> woe_parser x
  | 't' :: 'w' :: 'o' :: x -> woe_parser x
  | 'e' :: 'a' :: 'r' :: x -> woe_parser x
  | _ -> false;;

woe_parser (explode "onewartwoearewe");;
- : bool = true

| Label   | Pattern      |
|---------+--------------|
| rule-01 | S -> A 'we'  |
| rule-02 | S -> A 'ewe' |
| rule-03 | A -> B       |
| rule-04 | A -> BA      |
| rule-05 | B -> 'o'     |
| rule-06 | B -> 'new'   |
| rule-07 | B -> 'art'   |
| rule-08 | B -> 'woe'   |
| rule-09 | B -> 'are'   |
| rule-10 | B -> 'one'   |
| rule-11 | B -> 'war'   |
| rule-12 | B -> 'two'   |
| rule-13 | B -> 'ear'   |
#+TBLFM: @2$1..@>$1='(format "rule-%02d" (1- @#));L

Generating =onewartwoearewe=

First way to generate:

| Input             | Rule    | Product           |
|-------------------+---------+-------------------|
| ''                | rule-01 | A'we'             |
| A'we'             | rule-04 | BA'we'            |
| BA'we'            | rule-05 | 'o'A'we'          |
| 'o'A'we'          | rule-04 | 'o'BA'we'         |
| 'o'BA'we'         | rule-06 | 'onew'A'we'       |
| 'onew'A'we'       | rule-04 | 'onew'BA'we'      |
| 'onew'BA'we'      | rule-07 | 'onewart'A'we'    |
| 'onewart'A'we'    | rule-04 | 'onewart'BA'we'   |
| 'onewart'BA'we'   | rule-08 | 'onewartwoe'A'we' |
| 'onewartwoe'A'we' | rule-03 | 'onewartwoe'B'we' |
| 'onewartwoe'B'we' | rule-09 | 'onewartwoearewe' |
|-------------------+---------+-------------------|
|                   |         | 'onewartwoearewe' |

Second way to generate:

| Input             | Rule    | Product           |
|-------------------+---------+-------------------|
| ''                | rule-02 | A'ewe'            |
| A'ewe'            | rule-04 | BA'ewe'           |
| BA'ewe'           | rule-10 | 'one'A'ewe'       |
| 'one'A'ewe'       | rule-04 | 'one'BA'ewe'      |
| 'one'BA'ewe'      | rule-11 | 'onewar'A'ewe'    |
| 'onewar'A'ewe'    | rule-04 | 'onewar'BA'ewe'   |
| 'onewar'BA'ewe'   | rule-12 | 'onewartwo'A'ewe' |
| 'onewartwo'A'ewe' | rule-03 | 'onewartwo'B'ewe' |
| 'onewartwo'B'ewe' | rule-13 | 'onewartwoearewe' |
|-------------------+---------+-------------------|
|                   |         | 'onewartwoearewe' |

1
-1, так как вопрос сейчас имеет мало смысла. Во-первых, строка не является языком; строки не являются двусмысленными, однозначными, детерминированными или недетерминированными; они просто струны. Грамматика, которую вы даете, не генерирует пример строки. Я не проверял все 180 производных, чтобы увидеть, есть ли дубликаты, но в теории это все, что вам нужно сделать, чтобы увидеть, является ли грамматика неоднозначной. К сожалению, язык не может быть по своей сути неоднозначным, поскольку язык является конечным, следовательно, регулярным, следовательно, принятым DPDA и, следовательно, детерминированным.
Patrick87

@ Patrick87, а? Где это говорит, что строка является языком? Эта строка является примером продукта, и, конечно, ее можно сгенерировать, используя данную грамматику. Что заставляет вас думать иначе? Рассматриваемая строка в точности соответствует случаю, когда две разные последовательности приложений правил выдают одну и ту же строку, поэтому грамматика неоднозначна, но если вы удалите некоторые правила (например B -> 'o', то она больше не будет неоднозначной ...
wvxvw

Прежде всего, не могли бы вы дать вывод строки примера с использованием грамматики? От вашего собственного вопроса: "Является ли вышеуказанный язык детерминированным?" Вы никогда не называете язык, просто строку, созданную бесконечным количеством грамматик, хотя и не тот, который вы предлагаете.
Patrick87

Вы можете написать это на английском? Например, «Начнем с S. S := ......
Применяя

@ Patrick87 Я добавил пошаговую процедуру генерации, а также понял, что допустил ошибку в грамматике, которую исправил.
wvxvw

Ответы:


9

PDA является детерминированным, следовательно, DPDA, если для каждой достижимой конфигурации автомата существует не более одного перехода (т. Е. Возможна не более одной новой конфигурации). Если у вас есть КПК, который может достигать некоторой конфигурации, для которой возможны два или более уникальных перехода, у вас нет DPDA.

Пример:

Q={q0,q1}Σ=Γ={a,b}A=q0δ

q    e    s    q'   s'
--   --   --   --   --
q0   a    Z0   q1   aZ0
q0   a    Z0   q2   bZ0
...

Это недетерминированные КПК, потому что исходная конфигурация - q_0, Z0достижима, и есть два допустимых перехода, ведущих от нее, если входной символ есть a. Каждый раз, когда этот КПК начинает пытаться обработать строку, которая начинается с a, есть выбор. Выбор означает недетерминированный.

Вместо этого рассмотрим следующую таблицу переходов:

q    e    s    q'   s'
--   --   --   --   --
q0   a    Z0   q1   aZ0
q0   a    Z0   q2   bZ0
q1   a    a    q0   aa
q1   a    b    q0   ab
q1   a    b    q2   aa
q2   b    a    q0   ba
q2   b    b    q0   bb
q2   b    a    q1   bb

Вы можете испытать искушение сказать, что этот КПК недетерминирован; в конце концов, есть два допустимых перехода от конфигурации q1, b(a+b)*, например. Однако, поскольку эта конфигурация недоступна для любого пути через автомат, она не считается. Единственный достижимые конфигурации являются подмножеством q_0, (a+b)*Z0, q1, a(a+b)*Z0и q2, b(a+b)*Z0, и для каждого из этих конфигураций, в лучшем случае один переход определен.

CFL является детерминированным, если он является языком некоторого DPDA.

CFG является однозначным, если каждая строка имеет не более одного действительного деривации в соответствии с CFG. Иначе грамматика неоднозначна. Если у вас есть CFG, и вы можете создать два разных дерева деривации для какой-либо строки, у вас будет неоднозначная грамматика.

КЛЛ по своей сути неоднозначен, если он не является языком какого-либо однозначного КГЛ.

Обратите внимание на следующее:

  • Детерминированный КЛЛ должен быть языком некоторого DPDA.
  • Каждый КЛЛ является языком бесконечного множества недетерминированных КПК.
  • По своей сути неоднозначный КЛЛ не является языком какого-либо однозначного КГЛ.
  • Каждый КЛЛ является языком бесконечного множества неоднозначных КГЛ.
  • По своей сути неоднозначный КЛЛ не может быть детерминированным.
  • Недетерминированный КЛЛ может быть или не быть неоднозначным по своей сути.

1
Вики говорят, что PDA не является детерминированным (может быть детерминированная версия и недетерминированная), но вы могли бы также опустить первую часть предложения, это на самом деле не способствует тому, что вы говорите: / Но, опять же, это определяет детерминированный язык в качестве входного языка для детерминированного чего-то, и это что-то называется детерминированным, потому что он принимает детерминированный язык - это все равно, что сказать «трава зеленая, потому что зеленый цвет - это трава». Это правда, но не полезно :( Пожалуйста, пример был бы более ценным!
wvxvw

@wvxvw: вы не правильно читаете это. В нем говорится: «КПК является детерминированным тогда и только тогда, когда каждый тройка состояний / символов / стековых вершин имеет только одно следующее состояние». В этом определении нет ничего о том, какой язык принимает автомат.
Блуждающая логика

2
@wvxvw Определение детерминированного PDA, или DPDA, которое я никоим образом не определяю, не определяю или определяю, опирается на определение языка детерминированного контекста. Я определяю DPDA, основываясь только на свойствах автомата. Затем я определяю, что такое детерминированный КЛЛ в терминах определения DPDA. Пожалуйста, перечитайте ответ в свете этих комментариев и комментариев Wandering Logic и попытайтесь понять, имеет ли это смысл. Я постараюсь привести несколько кратких примеров.
Patrick87

q1,b(a+b)q2,b(a+b)Q={q0,...q2}текущий персонаж? Кроме того, правильна ли моя интерпретация? x+- один или несколько x, (x)*- ноль или более x?
wvxvw

@wvxvw Конфигурация относится к текущему состоянию и текущему содержимому стека. x+обычно относится к «одному или нескольким из» x, тогда как x*обычно относится к «нулю или более из x; Я могу использовать xx*вместо x+, так как они идентичны.
Patrick87

7

Вот примеры (из Википедии):

S0S0|1S1|ε

Свободный от контекста язык является детерминированным тогда и только тогда, когда существует хотя бы один детерминированный автомат, который принимает этот язык. (Там также может быть много недетерминированных автоматов, которые принимают язык, и он все равно будет детерминированным языком.) По сути, детерминированные автоматы с нажатием - это тот, где машинные переходы детерминированы на основе текущего состояния, входной символ и текущий верхний символ стека . детерминистическийздесь означает, что для любого состояния / входного символа / самого верхнего символа стека существует не более одного перехода состояния. Если у вас есть два или более следующих состояния для некоторого состояния / входного символа / тройного символа верхнего стека, то автомат является недетерминированным. (Вам нужно было бы «угадать», какой переход предпринять, чтобы решить, принимает ли автомат или нет.)

Что доказал Кнут, так это то, что каждая грамматика LR (k) имеет детерминированный автомат с нажатием и что каждый детерминированный автомат с понижением имеет грамматику LR (k). Таким образом, грамматики LR (k) и детерминированные автоматы нажатия могут обрабатывать один и тот же набор языков. Но набор языков, которые имеют детерминированный автомат, который принимает их, является (по определению) детерминированными языками. Аргумент не круглый.

Таким образом, детерминистический язык подразумевает, что существует однозначная грамматика. И мы показали однозначную грамматику, которая не имеет детерминированного автомата выталкивания (и, таким образом, это однозначная грамматика, которая принимает недетерминированный язык).

{aNбмсмdN|N,м>0}{aNбNсмdм|N,м>0}{aNбNссdN|N>0}


Не могли бы вы пояснить, почему необходимость взглянуть на всю строку до определения середины делает этот язык недетерминированным? Я прочитал еще одно объяснение того, что такое «детерминированный», и там говорится, что «если вам не нужно возвращаться при синтаксическом анализе, этот язык является детерминированным». Я не вижу необходимости возвращаться, чтобы разобрать этот язык ...
wvxvw

1
Рассмотрим входную строку "10011001". Автомат нажатия не знает, какова длина строки, пока она не дойдет до конца. Когда вы доберетесь до второго 0, вам нужно сделать выбор: это 4-символьная строка «1001» или более длинная строка, которая выглядит как «100 ???? 001»? Когда вы переходите к пятому символу, вы все еще не знаете: это строка из 8 символов «10011001» или более длинная строка, которая выглядит как «10011 ???? 11001»?
Блуждающая логика

1
«Разобрать всю строку» не является определением недетерминированности. Это была просто какая-то интуиция, которую я пытался добавить. И @ Patrick87, и я дали вам реальное определение детерминизма: из каждого состояния существует не более одного следующего состояния. Если язык не имеет однозначной грамматики, он должен быть недетерминированным. Я не могу ответить о вашем примере, не выполнив больше работы: вы показали неоднозначную грамматику, но это не главное, вам нужно продемонстрировать, что нет однозначной грамматики, если вы хотите показать, что язык по своей сути неоднозначен.
Блуждающая логика

1
@wvxvw Если вы ищете вычислительную процедуру, вам, скорее всего, не повезло ... согласно en.wikipedia.org/wiki/List_of_undecidable_problems , неразрешимо, является ли CFG неоднозначным, не говоря уже о том, является ли его язык по своей сути неоднозначным ; Также неясно, генерирует ли CFG все строки. Учитывая это, я серьезно сомневаюсь в том, что можно решить, гораздо менее эффективно решить, является ли язык CFG детерминированным CFL.
Patrick87

1
@wvxvw Если вам так повезло, вы имеете дело с тем, что мы называем счастливым случаем, т. е. не с тем, который делает эту проблему неразрешимой. Вы можете определить эвристику, которая работает для большого количества счастливых случаев, но не влияет на остальные, но они не будут работать для всех счастливых случаев; если бы они это сделали, у вас был бы решатель для проблемы, которая по нашей предпосылке невозможна.
Patrick87

5

К детерминированным контекстно-свободным языкам относятся те, которые принимаются некоторым детерминированным автоматом с нажатием (контекстно-свободными языками являются те, которые принимаются некоторым недетерминированным автоматом с понижением). Таким образом, это свойство языка, а не грамматики . Напротив, неоднозначность является свойством грамматики, в то время как присущая неоднозначность является свойством языка (контекстно-свободный язык по своей сути неоднозначен, если каждая не зависящая от контекста грамматика для языка неоднозначна).

Между этими двумя определениями существует связь: детерминированные контекстно-свободные языки никогда не бывают неоднозначными, как показано в ответе на этот вопрос .


Извините, это не очень полезно. Я фактически начал с DPDA, но он никогда не объясняет, почему он называется детерминированным. Это определение, которое легко найти в Википедии / Google для других работ. Но какое свойство грамматики / языка / синтаксического анализатора описывается словом «детерминированный»? Другими словами, что должно произойти в грамматике, чтобы ее можно было назвать детерминированной?
wvxvw

Извините, если я слишком много комментирую. Путаница заключается в том, что я не могу сказать, скажем, глядя на какой-то язык, является ли он детерминированным или нет, и не знаю, с чего начать определять «детерминизм» языка. Пример языка, который является детерминированным, а затем изменен таким образом, что делает его недетерминированным, был бы чрезвычайно полезным.
wvxvw

1
LR(k)

1
Извините, до сих пор не полезно. Я понимаю, что вы говорите, но это не помогает мне распознать язык, который является детерминированным, и отличить его от недетерминированного. Для примера: если у языка есть производственное правило, которое создает проблему сбалансированных скобок, я сразу же знаю, что он не может быть проанализирован FSM. (Потому что для этого потребуется стек). Но когда вы просто упоминаете другой формализм, он становится только рекурсивным, он не помогает мне понять, как этот язык должен отличаться от другого.
wvxvw

Другими словами (как вы упомянули в предыдущем комментарии), вам нужны примеры детерминированных и недетерминированных контекстно-свободных языков одного и того же «вида». Возможно, вам следует задать целенаправленный вопрос об этом.
Юваль Фильмус

1

{a,b}{w(a+b)w=wR}SaSa|bSb|a|b|ϵababab


1

Определения

  1. Детерминированный магазинный акцептор (DPDA) является магазинным автоматом , который никогда не имеет выбора в своем движении.
  2. DPDA и NPDA не эквивалентны.
  3. CFG является не детерминированным тогда и только тогда есть по крайней мере , , две постановки с таким же терминала префикса на правой стороны от них.
  4. CFG является неоднозначным , если существует некоторая W ∈ L (G) , который имеет по крайней мере , два различных деревьев вывода. Таким образом, он имеет два или более крайних левых или крайних правых производных, соответствующих двум различным деревьям производных.
  5. CFG является однозначным тогда и только тогда каждый строка имеет максимум один действительный вывод в соответствии с CFG. Иначе грамматика неоднозначна.
  6. КЛЛ является по своей природе неоднозначным тогда и только тогда это не язык какой - либо однозначной CFG. У него не может быть никакого DPDA.
    Если каждая грамматика, которая генерирует КЛЛ, неоднозначна, то КЛЛ называется по сути неоднозначной . Таким образом, это не язык каких-либо однозначных CFG.

факты

  1. Каждый КЛЛ является языком бесконечного множества недетерминированных КПК.
  2. Каждый КЛЛ является языком бесконечного множества неоднозначных КГЛ.
  3. КЛЛ, принятый некоторыми DPDA, по своей сути не является двусмысленным. (Существует по крайней мере один однозначный CFG для него.)
  4. КЛЛ, принятый NDPDA, может быть или не быть неоднозначным по своей природе, поскольку для него может существовать некоторый DPDA (или однозначный CFG).
  5. CFL, генерируемый неоднозначным CFG, может быть или не быть неоднозначным по своей природе, поскольку для него может существовать некоторый однозначный CFG (или DPDA).
  6. КЛЛ, генерируемый по меньшей мере одним однозначным КГП, по своей сути не является неоднозначным. (Есть некоторые DPDA для этого.)
  7. Недетерминированная грамматика может быть или не быть неоднозначной.

Ответ на ваш вопрос (связь между детерминизмом и неоднозначностью)

  1. (Не) двусмысленность относится в основном к грамматике (здесь CFGs). (Не) детерминизм относится как к грамматике, так и к автомату (здесь КПК).

    Если вы хотите логических различий, вы можете посмотреть на последние четыре пункта в разделе фактов, поскольку они пытаются связать и двусмысленность, и детерминизм. Здесь я повторяю их снова:

  2. КЛЛ, принятый некоторыми детерминированными КПК, по своей сути не является неоднозначным . (Существует по крайней мере один однозначный CFG для него.)

  3. КЛЛ, принятый недетерминированным КПК, может быть или не быть неоднозначным по своей природе, поскольку может существовать некоторый DPDA (или однозначный КФГ).
  4. CFL, генерируемый неоднозначным CFG, может быть или не быть неоднозначным по своей природе, поскольку может существовать некоторый однозначный CFG (или детерминированный PDA).
  5. КЛЛ, генерируемый по меньшей мере одним однозначным КГП, по своей сути не является неоднозначным . (Есть некоторые DPDA для этого.)
  6. Не детерминированная грамматика может или не может быть неоднозначной .

PS:

  1. В принятом ответе используются такие строки, как «КЛЛ является детерминированным», «Детерминированный КЛЛ», «КЛЛ не может быть детерминированным», «Недетерминированный КЛЛ». Я предполагаю, что прилагательные «детерминистический» и «неоднозначный» не относятся к КЛЛ, но к КПК и КФГ. (Хотя прилагательное «по своей сути неоднозначное» относится к КЛЛ) Хотя я не хочу критиковать первоначальный ответ, поскольку я сам узнал, что указывает на это. (На самом деле я буквально скопировал и вставил несколько строк из этого ответа.) Но все же я чувствовал, что его следует сделать более правильным. Поэтому я попытался изложить вещи более четко здесь в двух частях: определения и факты (я мог бы сделать это излишне многословным и длинным). Я думаю, что я должен был отредактировать исходный ответ, но тогда он будет включать в себя удаление многих точек, которые используют вышеуказанные линии. И я не знаю, сделает ли это какое-либо корректное редактирование, так как это потребует полного переписывания
  2. Обратите внимание, что я выделил количественные слова жирным курсивом, чтобы подчеркнуть сравнительные различия в разных определениях и фактах. Термины определения только выделены жирным шрифтом .
  3. Несколько моментов, которые я сделал сам, поэтому мне нужно подтверждение от кого-то знающего здесь о правильности каждого пункта.

PS 1 неверен: существует стандартное определение для детерминированных / неоднозначных КЛЛ, а именно, они определены как те, для которых все CFG являются детерминированными / неоднозначными.
reinierpost

только что понял факт 7 это неправильно. Также пункт 6 из второго последнего списка такой же и неправильный.
Маха

На самом деле ... детерминизм не имеет двусмысленности во время синтаксического анализа, поэтому он строго сильнее двусмысленности (т. Е. Неоднозначность даже после завершения разбора).
reinierpost
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.