Відповіді:
Існує (принаймні) один з способів довести однозначність граматики для мови . Він складається з двох етапів:L
Перший крок досить зрозумілий: покажіть, що граматика породжує (принаймні) потрібні слова, тобто правильність.
Другий крок показує, що має стільки синтаксичних дерев для слів довжини скільки має слова довжини - з 1. Це означає однозначність. Він використовує структурну функцію яка повертається до Хомського та Шютценбергера [1], а самеn L n G
при кількість синтаксичних дерев має слова довжини . Звичайно, потрібно матищоб це працювало.G n | L n |
Приємно, що (як правило) легко отримати для без контекстних мов, хоча знайти закриту форму для може бути складно. Перетворіть у систему рівнянь функцій з однією змінною на нетермінальний:t n G
Це може виглядати непросто, але насправді є лише синтаксичною трансформацією, як стане зрозуміло в прикладі. Ідея полягає в тому, що генеруються термінальні символи враховуються в показнику , і тому , що система має той же вигляд, , відбувається так часто , в сумі , як термінали можуть бути отримані з допомогою . Перевірте Kuich [2] для подробиць.G z n n G
Розв’язуючи цю систему рівнянь (комп'ютерна алгебра!), ; тепер вам "лише" доводиться тягнути коефіцієнт (у закритому, загальному вигляді). Лист ТКС Чит та комп'ютерної алгебри часто може зробити це.
Розглянемо просту граматику з правилами
.
Зрозуміло, що (крок 1, доведення індукцією). Є паліндроми довжиною якщо парне, інакше.2 n nn0
Налаштування виходу системи рівнянь
рішення якого
.
Коефіцієнти збігаються з числами паліндромів, тому неоднозначно.
Це гарне запитання, але якийсь Гуглінг сказав би вам, що не існує загального методу вирішення двозначності , тому вам потрібно зробити своє питання більш конкретним.
Для деяких граматик можливе доведення за допомогою індукції (над довжиною слова).
Розглянемо для прикладу граматику над Σ = { a , b }, задану такими правилами:
Усі слова довжиною у L ( G ) - є лише ε - мають лише одне лівослівне.
Припустимо, що всі слова довжиною для деякого n ∈ N мають лише одне лівослівне.
Тепер розглянемо довільне для деяких n > 0 . Ясна річ, w 1 ∈ Σ . Якщо w 1 = a , ми знаємо, що першим правилом у кожному лівому виведенні має бути S → a S a ; якщо w 1 = b , це повинно бути S → b S b. Це стосується всіх справ. За індукційною гіпотезою ми знаємо, що для існує точно одне ліве виведення . У поєднанні ми робимо висновок, що для w є також точно одна ліва деривація .
Це стає складніше, якщо
Це може допомогти посилити претензію до всіх сентенційних форм (якщо граматика не має непродуктивних нетерміналів) та «кореневих» нетерміналів.
Я думаю, що перехід до нормальної форми Грейбаха підтримує (не) неоднозначність, щоб застосувати цей крок спочатку, можливо, добре потурбується про ліву рекурсію.
Ключ - визначити одну особливість кожного слова, яка фіксує (принаймні) один крок виведення. Решта слід індуктивно.
В основному це проблема покоління дитини. Почніть з першого виразу та генеруйте це діти .... Продовжуйте це робити рекурсивно (DFS), і після досить кількох ітерацій, перевірте, чи зможете ви генерувати те саме розширене вираження у двох різних дітей. Якщо ви можете це зробити, це неоднозначно. Однак немає можливості визначити час роботи цього алгоритму. Припустимо, що це безпечно, після того, як, можливо, народиться 30 рівнів дітей :) (Звичайно, це може бомбити 31-го)