flang компилятор доказывает, что программа не зациклится 0.7.29 GitHub English

Грамматика русского на прегруппах

Здесь показано, как на 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]"

Что проверено, а что нет

Чего грамматика пока не умеет: обстоятельства в середине предложения («мама в доме читает»), предложения без глагола («кошка на столе»), творительного падежа, вопросов, «и» и придаточных. Список — в ADR-0109.

Куда дальше