Добрый вечер, Михаил!

Мне как раз недавно попались две статьи, которые утверждают, что у классических 
методов шансов немного:

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. Синтаксис 
Рефала и основные приёмы программирования можно рассказать за две пары, а затем 
уже студенты могут писать компиляторы для подобных программ в рамках домашних 
работ. Более подходящего языка для этого курса я не вижу.

 

Других применений, где Рефал уместнее других языков программирования, я пока не 
встречал. А вы?

 

Где ещё Рефал может быть уместнее других языков программирования?

 

С уважением,

Александр Коновалов

  • Сф... Александр Коновалов a . v . konovalov87_AT_mail . ru
    • ... Arkady Klimov arkady . klimov_AT_gmail . com
      • ... Александр Коновалов a . v . konovalov87_AT_mail . ru
    • ... Mike Potanin mpotanin_AT_gmail . com
      • ... Александр Коновалов a . v . konovalov87_AT_mail . ru
    • ... Александр Гусев gusev_aleksandr_AT_mail . ru
      • ... Александр Коновалов a . v . konovalov87_AT_mail . ru

Ответить