Грамматика русского на прегруппах
Здесь показано, как на flang проверить, грамматично ли русское предложение: у каждого слова есть тип, типы перемножаются, и предложение грамматично, если произведение сворачивается в один тип s — «предложение». Это прегрупповая грамматика Ламбека. Программа лежит в flang/ct/russian/, решение и литература — в ADR-0109.
Проверить предложение
Одна команда:
$ flang run flang/ct/russian/parse.flang --function «Разобрать» --args '{"предложение":"Мама читает книгу."}'
доказано: утверждений 11
"грамматично: мама: n[им ж ед 3]; читает: n[им ед 3]ʳ · s · n[вин]ˡ; книгу: n[вин ж ед 3]; связи: мама—читает, читает—книгу"
Ответ называет тип, который взят у каждого слова, и пары слов, чьи типы сократились. Заглавные буквы и точка не мешают.
Порядок слов свободный, как в русском:
$ flang run flang/ct/russian/parse.flang --function «Разобрать» --args '{"предложение":"книгу мама читает"}'
доказано: утверждений 11
"грамматично: книгу: n[вин ж ед 3]; мама: n[им ж ед 3]; читает: n[им ед 3]ʳ · n[вин]ʳ · s; связи: мама—читает, книгу—читает"
Неграмматичное предложение получает причину:
$ flang run flang/ct/russian/parse.flang --function «Разобрать» --args '{"предложение":"мама читает книга"}'
доказано: утверждений 11
"не грамматично: неверный падеж"
$ flang run flang/ct/russian/parse.flang --function «Разобрать» --args '{"предложение":"мама читают книгу"}'
доказано: утверждений 11
"не грамматично: нет согласования по роду, числу или лицу"
$ flang run flang/ct/russian/parse.flang --function «Разобрать» --args '{"предложение":"мама книгу"}'
доказано: утверждений 11
"не грамматично: нет сказуемого"
$ flang run flang/ct/russian/parse.flang --function «Разобрать» --args '{"предложение":"мама шьёт"}'
доказано: утверждений 11
"не грамматично: неизвестное слово «шьёт»"
Каждый запуск занимает около 3,7 секунды: большая часть — проверка самой программы перед запуском.
Как читать тип
| Запись | Что значит |
|---|---|
n[им ж ед 3] | именная группа: именительный падеж, женский род, единственное число, третье лицо |
n[вин] | именная группа в винительном, остальное не важно |
s | предложение |
aʳ | ждёт a слева: a · aʳ сокращается |
aˡ | ждёт a справа: aˡ · a сокращается |
Признак, которого в скобках нет, не важен. n[им ж ед 3] годится туда, где ждут n[им ед 3], а n[им ж мн 3] — нет. Так проверяется согласование.
Добавить слово
Словарь — flang/ct/russian/lexicon.flang. Существительное записывается формой и списком «падеж род число»:
«Существительное» от "книгу" и ["вин ж ед"]
У формы, которая читается по-разному, чтений несколько:
«Существительное» от "книги" и ["род ж ед", "им * мн", "вин * мн"]
Глагол записывается тем, чего он ждёт. Типы на все порядки слов программа строит сама:
«Переходный» от "читает" и («Подлежащее настоящего» от "ед" и "3") и "вин"
«Непереходный» от "спала" и («Подлежащее прошедшего» от "ж" и "ед")
Какие типы получились у слова, показывает «Типы слова». Имя функции из двух слов берётся в кавычки оболочки:
$ flang run flang/ct/russian/parse.flang --function '«Типы слова»' --args '{"слово":"читает"}'
доказано: утверждений 11
"s · n[им ед 3]ˡ; n[им ед 3]ʳ · s; s · n[вин]ˡ · n[им ед 3]ˡ; n[им ед 3]ʳ · s · n[вин]ˡ; n[вин]ʳ · n[им ед 3]ʳ · s; s · n[им ед 3]ˡ · n[вин]ˡ; n[вин]ʳ · s · n[им ед 3]ˡ; n[им ед 3]ʳ · n[вин]ʳ · s"
Восемь типов: два без дополнения («мама читает», «читает мама») и шесть на каждый порядок подлежащего, глагола и дополнения. У «книги» типов три — по одному на каждое чтение формы:
$ flang run flang/ct/russian/parse.flang --function '«Типы слова»' --args '{"слово":"книги"}'
доказано: утверждений 11
"n[род ж ед 3]; n[им мн 3]; n[вин мн 3]"
Что проверено, а что нет
- Доказано для всех входов: сопряжение и умножение типов сохраняют длину так, как должны, а одна свёртка тип не удлиняет. Это видно в
flang check flang/ct/russian/pregroup.flang --proof: доказано 9 из 9. - Посчитано на примерах: законы прегруппы — ассоциативность умножения,
(aˡ)ʳ = a,aˡ · a → 1— вflang/ct/russian/category.flang. Это примеры, а не доказательство. - Проверено пробами: 71 предложение, 36 грамматичных и 35 нет. Прогон:
flang io flang/proof/probes/russian-grammar/run.fscript --plan Binary. - Не проверено ничем: что словарь верен и что причина отказа та, которую назвал бы человек.
Чего грамматика пока не умеет: обстоятельства в середине предложения («мама в доме читает»), предложения без глагола («кошка на столе»), творительного падежа, вопросов, «и» и придаточных. Список — в ADR-0109.
Куда дальше
- Категорная поверхность — что компилятор делает с объявленной категорией и моноидом.
- Что доказано, а что нет — та же граница по всему языку.