Добрый вечер, Михаил! Мне как раз недавно попались две статьи, которые утверждают, что у классических методов шансов немного:
https://sysblok.ru/blog/gorkij-urok-abbyy-kak-lingvisty-proigrali-poslednjuju-bitvu-za-nlp/ https://sponsr.ru/ashmanov/71371/Nedavnyaya_istoriya_russkogoIT_Sudba_lingvista_vburlyashchem_Otechestve/ Вторая платная, пишите в личку, вышлю текст (бесплатно!). Она интересная. Если кратко: лингвистику крайне сложно формализовать и для хорошей системы, скажем, машинного перевода на правилах нужны десятки, сотни лингвистов, которые будут формализовывать смыслы слов и правила языка. Гораздо проще использовать методы машинного обучения, скажем, обучения системы перевода на параллельных текстах. С уважением, Александр Коновалов From: Mike Potanin mpotanin_AT_gmail.com <refal@botik.ru> Sent: Wednesday, November 6, 2024 4:52 PM To: refal@botik.ru Subject: Re: Сфера применения Рефала Kframework (https://kframework.org/), система для прототипирования и изучения семантик виртуальных машин и языков программирования, имеет схожие черты с Рефалом. Мне кажется интересным применить Рефал в этой области. Хотя в лингвистике сейчас все захватили нейросети, мне кажется что для работы с текстами у классических методов есть шансы, скажем опередить нейросети по энергопотреблению и возможности анализа. Здесь интересно было бы генрировать программы анализа естественного языка и перевода с него на язык формальной логики с помощью машинного обучения (генетических алгоритмов, чего-то типа индуктивного логического программирования). On Tue, Nov 5, 2024 at 4:21 PM Александр Коновалов a.v.konovalov87_AT_mail.ru <http://a.v.konovalov87_AT_mail.ru> <refal@botik.ru <mailto:refal@botik.ru> > wrote: Добрый день! Предлагаю порассуждать на тему применимости Рефала сегодня: какие у него могут быть преимущества перед другими языками и как ими можно воспользоваться. Я могу выделить следующие черты Рефала: * динамически типизированный с закрытым набором типов — есть ограниченный набор встроенных типов данных, пользовательские типы конструируются на уровне соглашений (исключение: пара моих реализаций, где есть инкапуслирующие квадратные скобки — небесспорное расширение) — примерно та же ситуация, что и в классической Scheme; * мощное сопоставление с образцом — сопоставлением с образцом сейчас уже никого не удивишь, оно есть даже в Питоне (начиная с версии 3.10 или 3.11, и тоже довольно выразительное), но есть две достаточно редкие черты: * повторные переменные, и соответственно, встроенное в язык понятие равенства (однако, есть в Racket и есть в Scala), * поиск в середине последовательности по образцу «e.X PAT e.Y», аналогичная возможность есть только в Tom <https://tom.loria.fr/> (предназначен для работы с XML и вообще удивительно похож на Рефал); * встроенная в семантику конкатенация — в результатных выражениях она записывается пустым местом, в других языках синтаксис конкатенации более многословный, * симметричный доступ к обоим концам последовательности в образцах — в большинстве функциональных языков встроенными (основными) последовательностями являются однонаправленные списки и образцы допускают обращение только слева, исключения — Scala, где есть «:+» и «+:», сопоставление с эллипсисом в макросах Scheme и образцах Racket, образцы в Python, но там списки — массивы, * возврат из функции нескольких значений столь же (не)естественнен, как и передача нескольких аргументов. Подытоживая, Рефал — динамически типизированный функциональный язык с выразительным сопоставлением с образцом, позволяющий удобно преобразовывать иерархические данные, например, синтаксические деревья. И сами данные, и их сопоставление с образцом, и построение новых значений записываются без лишнего синтаксического шума, т.е. всевозможных запятых, значков «+», «++», «+:» и прочих. Благодаря динамической типизации, он годится для быстрого написания небольших программ, выполняющих символьные вычисления. Но с другой стороны, написание крупных программ, разрабатываемых коллективами затрудняется: типы всё равно придётся определять и документировать, что для Рефала, как правило, делается комментариями с грамматикой для объектных выражений. Я пока нашёл только одну сферу, где Рефал неплох и абсолютно уместен — рабочий язык для небольшого курса, посвящённого генерации кода. Студенты пишут программы, принимающие на входе синтаксическое дерево, и порождающие код для модельного ассемблера. Пример синтаксического дерева: (function gcd (x y) (var (rem 1)) (while ((L y) "<>" 0) (rem "=" ((L x) "%" (L y))) (x "=" (L y)) (y "=" (L rem)) ) (return (L x)) ) Синтаксическое дерево одновременно выглядит как код на ЯП и одновременно машиночитаемо — это просто запись объектного выражения Рефала-5. Синтаксис Рефала и основные приёмы программирования можно рассказать за две пары, а затем уже студенты могут писать компиляторы для подобных программ в рамках домашних работ. Более подходящего языка для этого курса я не вижу. Других применений, где Рефал уместнее других языков программирования, я пока не встречал. А вы? Где ещё Рефал может быть уместнее других языков программирования? С уважением, Александр Коновалов