Александр,

Я, пожалуй, просто вставлю сюда код :)
Он не самодостаточен, но алгоритм из него читаем.

*/*
 * MSG-Exprs (e.Format1) e.Format2
 * Return e.Format3 -- most specific generalizing of formats 1 and 2.
 */**MSG_Exprs* {
  ((*FAIL*)) *e*.Fe2 = *e*.Fe2;
  (*e*.Fe1) (*FAIL*) = *e*.Fe1;
  (*t*.Ft1 *e*.Fe1) *t*.Ft2 *e*.Fe2 \*?*
    */*
     * IF both t.Ft1 and t.Ft2 are hard terms and aren't $const'ants then
     * split them out with MSG-Terms.
     */*
    {
      *t*.Ft1 : \{ (*EVAR*); (*VVAR*); (*CONST* *e*); } \*!* *$fail*;
      *t*.Ft2 : \{ (*EVAR*); (*VVAR*); (*CONST* *e*); } \*!* *$fail*;
      <*MSG_Terms* *t*.Ft1 *t*.Ft2> <*MSG_Exprs* (*e*.Fe1) *e*.Fe2>;
    };
  (*e*.Fe1 *t*.Ft1) *e*.Fe2 *t*.Ft2 \*?*
    */*
     * IF both t.Ft1 and t.Ft2 are hard terms and aren't $const'ants then
     * split them out with MSG-Terms.
     */*
    {
      *t*.Ft1 : \{ (*EVAR*); (*VVAR*); (*CONST* *e*); } \*!* *$fail*;
      *t*.Ft2 : \{ (*EVAR*); (*VVAR*); (*CONST* *e*); } \*!* *$fail*;
      <*MSG_Exprs* (*e*.Fe1) *e*.Fe2> <*MSG_Terms* *t*.Ft1 *t*.Ft2>;
    };
  ((*CONST* *t*.name) *e*.Fe1) *e*.Fe2, {
    *e*.Fe2 : (*CONST* *t*.name) *e*.Rest = (*CONST* *t*.name)
<*MSG_Exprs* (*e*.Fe1) *e*.Rest>;
    <*MSG_Exprs* (<*Format_Exp* <*Lookup* &*Const* *t*.name>> *e*.Fe1) *e*.Fe2>;
  };
  (*e*.Fe1 (*CONST* *t*.name)) *e*.Fe2, {
    *e*.Fe2 : *e*.Rest (*CONST* *t*.name) = <*MSG_Exprs* (*e*.Fe1)
*e*.Rest> (*CONST* *t*.name);
    <*MSG_Exprs* (*e*.Fe1 <*Format_Exp* <*Lookup* &*Const* *t*.name>>) *e*.Fe2>;
  };
  (*e*.Fe1) (*CONST* *t*.name) *e*.Fe2 =
    <*MSG_Exprs* (*e*.Fe1) <*Format_Exp* <*Lookup* &*Const* *t*.name>> *e*.Fe2>;
  (*e*.Fe1) *e*.Fe2 (*CONST* *t*.name) =
    <*MSG_Exprs* (*e*.Fe1) *e*.Fe2 <*Format_Exp* <*Lookup* &*Const* *t*.name>>>;
  (*e*.Fe1) *e*.Fe2, {
    <*IsEmpty_Expr* *e*.Fe1>, <*IsEmpty_Expr* *e*.Fe2> = */*empty*/*;
    */*
     * If both e.Fe1 and e.Fe2 have non-(EVAR) terms then we can unify
     * them to (VVAR). Be VERY careful! We can meet &C, but it easy can be
     * that it points to empty expression.
     */*
    \*?*
    *e*.Fe1 : *e* *t*.Ft1 *e*, *t*.Ft1 : \{
      (*VVAR*);
      (*CONST* *t*.name), # <*IsEmpty_Const* *t*.name>;
    } \*!*
      *e*.Fe2 : *e* *t*.Ft2 *e*, *t*.Ft2 : \{
        (*VVAR*);
        (*CONST* *t*.name), # <*IsEmpty_Const* *t*.name>;
      } =
      (*VVAR*);
    */*
     * Else at least one of expressions has form of (EVAR)...(EVAR). So we
     * should return (EVAR).
     */*
    (*EVAR*);
  };
};
*MSG_Terms* {
  (*PAREN* *e*.Fe1) (*PAREN* *e*.Fe2) = (*PAREN* <*MSG_Exprs*
(*e*.Fe1) *e*.Fe2>);
  *t*.Ft *t*.Ft = *t*.Ft;
  *s* *s* = (*SVAR*);
  (*SVAR*) *s* = (*SVAR*);
  *s* (*SVAR*) = (*SVAR*);
  (*SVAR*) (*SVAR*) = (*SVAR*);
  (*REF* *e*) *s* = (*SVAR*);
  *s* (*REF* *e*) = (*SVAR*);
  (*REF* *e*) (*SVAR*) = (*SVAR*);
  (*SVAR*) (*REF* *e*) = (*SVAR*);
  *t* *t* = (*TVAR*);
};


Хотел бы просто дать ссылку на исходники, но, к сожалению, сайт с ними
лежит (что с ним довольно регулярно случается, так как никто не замечает,
когда он падает).

Антон


On Thu, Feb 21, 2019 at 12:29 AM Александр Коновалов
a.v.konovalov87_AT_mail.ru <refal@botik.ru> wrote:

> Доброе утро, Антон!
>
> *«В компиляторе (на уровне преобразования AS → AS) есть фаза порождения
> возвращаемых форматов — делается наиболее тесное обобщение результатных
> выражений (Most Specific Generalization — дуальная операция к Most General
> Unifier — как НОК/НОД).»*
>
> *«Это нужно, в частности, для более качественной компиляции блоков: {
> Exp1; Exp2; ... } : Pattern.»*
>
> Я правильно понимаю, что в выражениях Exp1, Exp2… вместо скобок активации
> подставляются выходные форматы соответствующих функций, после чего
> обобщению подвергаются фактически образцовые выражения?
>
> А где можно прочитать про алгоритм вычисления наиболее тесного обобщения?
> (Можно даже ссылку на исходник, я пойму.) Просто я занимался аналогичной
> задачей применительно к оптимизации сопоставления с несколькими образцами,
> вот записка моего дипломника, где алгоритм описан:
>
>
> https://github.com/bmstu-iu9/refal-5-lambda/blob/c48cf0179b66c407a5932c03cd8bf38958a8c477/doc/OptPattern/Савельев_Записка_2018.pdf
>
> Вот более лаконичное (но менее понятное) описание задачи в таск-трекере:
>
> https://github.com/bmstu-iu9/refal-5-lambda/issues/154
>
> Поясню к последнему. Рассматриваются только жёсткие выражения. Образцы,
> содержащие e-переменную на верхнем уровне (например, A s.1 *e**.2* t.3 (e.4)
> s.3), названы образцами класса (M, N), где M и N — количество термов
> до и после e-переменной соответственно, образцы, не содержащие e-переменной
> на верхнем уровне (например, A s.1 (e.2 t.3) (e.4) s.3) названы образцами
> класса (K), где K — длина терма. ГСО — глобальное сложнейшее обобщение,
> ЛСО — локальное сложнейшее обобщение. Сложность — количество элементарных
> операций отождествления. Локальное-глобальное — по аналогии с локальным
> и глобальным максимумом в математике.
>
>
>
> С уважением,
> Александр Коновалов
>
>
>
>
>
> *From:* Anton Orlov orlovan_AT_gmail.com [mailto:refal@botik.ru]
> *Sent:* Thursday, February 21, 2019 1:28 AM
> *To:* refal@botik.ru
> *Cc:* Александр Гусев <gusev_aleksa...@mail.ru>
> *Subject:* Re: Re[4]: Немного статистики
>
>
>
>
>
>
>
> On Wed, Feb 20, 2019 at 8:08 AM Arkady Klimov arkady.klimov_AT_gmail.com <
> refal@botik.ru> wrote:
>
> Вопрос интересный, попытаюсь ответить за Антона как я планировал, если б
> занялся погружением рефала-6 в ту инфраструктуру.
>
> Первый вариант - да, все функции имеют общий формат
>
> $func eX = eX;
>
> Затем, возможны варианты, один из которых - что-то типа псевдокомментариев.
>
> Интересен также вариант отображения после полусуперкомпилятора, который
> форматы порождает.
>
> Но более продвинутая схема - проводить анализ на уровне абстрактного
> синтаксиса и повышать арность автоматически, и тогда это можно было б
> сделать один раз на все входные диалекты. Собственно, в этом и была задумка
> - чтобы писать разные сложные анализы и преобразования уже в
> диалекто-независимой
>
> форме.
>
>
>
> Отчасти это сделано. В компиляторе (на уровне преобразования AS -> AS)
> есть фаза порождения возвращаемых форматов -- делается наиболее тесное
> обобщение результатных выражений (Most Specific Generalization -- дуальная
> операция к Most General Unifier -- как НОК/НОД).
>
>
>
> Это нужно, в частности, для более качественной компиляции блоков: { Exp1;
> Exp2; ... } : Pattern.
>
>
>
> Запустить более продвинутый повышатель арности, который глобальнее на
> программу смотрит, тоже можно было бы на этом уровне.
>
>
>
> Антон
>
>
>
>
>
> С уважением,
>
> Аркадий Климов
>
>
>
> PS. Соглашусь с Антоном,  что более сложной будет задача поддержки
> стандартных функций, которую предполагалось решать попросту путем написания
> "переходников" на рефале. Что-то подобное было сделано в среде Рефал-6 для
> поддержки входного языка Рефал-5. Конечно, эффективность будет ущербной.
>
>
>
> ср, 20 февр. 2019 г. в 12:51, Александр Коновалов
> a.v.konovalov87_AT_mail.ru <refal@botik.ru>:
>
> Добрый день, Антон!
>
> *«С исполнением разных диалектов на одной платформе основная проблема —
> не входной язык, а библиотека стандартных функций. Они везде разные, и все
> их поддержать — довольно много возни.»*
>
> А проблему отсутствия форматов функций в других диалектах (Рефал-5,
> Рефал-6) Вы как решили (или предполагали решать)? Считать все функции как
>
> $func eX = eX;
>
> и плевать на производительность? Или форматы задаются в псевдокомментариях?
>
>
>
> С уважением,
> Александр Коновалов
>
> *From**:* Anton Orlov orlovan_AT_gmail.com <refal@botik.ru>
> *Sent**:* Thursday, February 14, 2019 9:49 PM
> *To**:* refal@botik.ru
> *Cc**:* Александр Гусев <gusev_aleksa...@mail.ru>
> *Subject**:* Re: Re[4]: Немного статистики
>
>
>
>
>
>
>
> On Thu, Feb 14, 2019 at 7:27 AM Arkady Klimov arkady.klimov_AT_gmail.com <
> refal@botik.ru> wrote:
>
> Насколько я знаю, в каком-то законченно-оформленном виде такой информации
> сейчас нет.
>
>
>
> Сейчас у меня появилась мысль, и хочу всем апологетам того или иного
> диалекта, написать небольшой текст в свободной форме на 2-3-5 страниц с
> описанием особенностей их "любимых" версий языка и их реализаций - что было
> бы полезно знать потенциальным юзерам. Эти тексты (ссылки) можно было бы
> разместить на сайте refal.net на страницах, связанных с каждой
> версией-диалектом. В этой переписке по рефалу+ уже много информации
> появилось, осталось ее собрать и оформить. Наверно, это было бы полезно.
>
>
>
> А также неплохо бы единый бенчмарк составить. И какие-то сравнительные
> таблицы.
>
>
>
> А еще когда-то была установка на создание единого инструментария по
> реализации разных диалектов с единым промежуточным синтаксисом AST, с
> возможностью любой входной диалект на любую платформу положить. Насколько я
> понимаю, рефал+ свою часть пути в основном прошел и там это представление
> задокументировано. Хотел бы пройти свою часть для рефала-6, но на это
> конечно нужно время. Которого, увы, нет.
>
>
>
> Кстати, AST, используемый в Р+ (
> http://wiki.botik.ru/Refaldevel/AbstractImperativeLanguage), специально в
> какой-то момент правился, чтобы включить особенности Рефала-6 (но поскольку
> парсер из Рефала-6 так и не был приделан, то, возможно, ещё какие-то
> тонкости остались).
>
>
>
> С исполнением разных диалектов на одной платформе основная проблема -- не
> входной язык, а библиотека стандартных функций. Они везде разные, и все их
> поддержать -- довольно много возни.
>
>
>
> Антон
>
>
>
>
>
> Аркадий
>
>
>
> чт, 14 февр. 2019 г. в 09:59, Александр Гусев gusev_aleksandr_AT_mail.ru <
> refal@botik.ru>:
>
> Спасибо, Аркадий!
>
> А существует где-то краткая информация по сравнению веток рефала? Статья,
> может быть какая-то.
>
> А то есть рефал-2, рефапл-5, рефал-6 и рефал-плюс - это только те, что
> поименованы.
>
> У каждой версии свои сторонники и блюстители. Или всё-таки придётся в
> каждую вникать?
>
> Среда, 13 февраля 2019, 20:41 +03:00 от Arkady Klimov
> arkady.klimov_AT_gmail.com <refal@botik.ru>:
>
> Здравствуйте, Александр!
>
> Прошу прощения за некоторую задержку, пришлось немного повозиться, приводя
> в порядок версию дистрибуции. В принципе, есть все на сайте refal.net, но
> сильно старое, с тех пор довольно много было правок. Вот та страничка:
>
> http://refal.net/~arklimov/refal6/index.html
>
> Документацию (описание языка) смотрите там, в ней ничего нового.
>
> А дистрибутив пока у меня в дропбоксе возьмите:
>
> https://www.dropbox.com/s/gh4hdcagl0swltm/ref6.zip?dl=0
>
> Как и раньше, инструкция в help/readme.txt.
>
> Главное - распакуйте в папку ...ref6, пропишите ее в PATH и
> откорректируйте путь в ri.bat соответственно.
>
> Затем вызовите test/hello.bat.
>
> В ближайшее время надеюсь переправить его на сайт, а также обновлю архивы
> исходников там.
>
> Рефал-часть почти не изменилась с тех пор, а вот С-часть обновилась
> существенно.
>
> Спрашивайте, не стесняйтесь, если будут проблемы.
>
> С уважением,
>
> Аркадий Климов
>
>
>
>
>
>
>
>
>
>
>
> пт, 8 февр. 2019 г. в 23:43, Александр Гусев gusev_aleksandr_AT_mail.ru <
> refal@botik.ru <https://e.mail.ru/compose/?mailto=mailto%3are...@botik.ru>
> >:
>
> Аркадий, Спасибо за ответ!
>
> Да, я читал переписку, не до самых глубин, конечно.
>
> Пока прошу актуальную ссылку на Рефал-6 - почитать и хоть что-то
> попробовать, если возможно. Вроде Hello, world на трёх языках.
>
> То, что я имел ввиду о музыке, это тоже формульные вычисления, конечно.
>
> Возможно, но наверно уже на "символьном уровне", до которого еще надо
> входной сигнал поднять.
>
>
> С уважением,
> Александр Гусев
> gusev_aleksa...@mail.ru
> <http://e.mail.ru/compose/?mailto=mailto%3agusev_aleksa...@mail.ru>
>
>
>
>
    • ... Александр Гусев gusev_aleksandr_AT_mail . ru
      • ... Arkady Klimov arkady . klimov_AT_gmail . com
        • ... Александр Гусев gusev_aleksandr_AT_mail . ru
          • ... Arkady Klimov arkady . klimov_AT_gmail . com
            • ... Anton Orlov orlovan_AT_gmail . com
              • ... Anton Orlov orlovan_AT_gmail . com
              • ... Александр Коновалов a . v . konovalov87_AT_mail . ru
              • ... Arkady Klimov arkady . klimov_AT_gmail . com
              • ... Anton Orlov orlovan_AT_gmail . com
              • ... Александр Коновалов a . v . konovalov87_AT_mail . ru
              • ... Anton Orlov orlovan_AT_gmail . com
              • ... Arkady Klimov arkady . klimov_AT_gmail . com
              • ... Anton Orlov orlovan_AT_gmail . com
  • RE:... Александр Коновалов a . v . konovalov87_AT_mail . ru
  • Re:... swi_AT_cnshb . ru
    • ... Eisymont Leonid verger-lk_AT_yandex . ru

Ответить