Re: SURA: от нас с Робертом всем -- троекратное, симметричное URA!


Subject: Re: SURA: от нас с Робертом всем -- троекратное, симметричное URA!
From: Sergei M. Abramov (at home) (abram@botik.ru)
Date: Tue May 08 2001 - 23:47:40 MSD


День добрый, всем!
    From: Arkady Klimov <klark@bagirra.net>

    И что меня в этом подходе заинтриговало: не получится ли теперь "на УРА"
композиция? Была, мне кажется, такая слабость у УРА: композиция функций, каждая
из которых в отдельности решается легко, вместе могут составлять очень сложную
проблему. А как с этим теперь обстоит? (Прошу прощения, что не могу столь же
четко и ясно, как Сергей, выразить свою мысль).
Алик, попробую нащупть ответ:
    1.. Я не до конца понял проблему. Если кто вспомнит конкретную задачу
(пример)--будет легче.
    2.. С композициями в TSG не очень здорово--язык хвостово-рекурсивный
(плоский);
    3.. Возможно вот о чем речь (это еще одна заготовка в закромах Родины--ну да
среди своих...расскажу ;-)
Если язык не плоский, то любая (не только листовая) конфигурация имеет вид
(пардон, я все про свои лизоны, SCPJ-шники меня поймут, у них конфигурация точно
такая-же, в некотором смысле):
let [v1.1, ...,v1.k1] = F1(e1.1,....e1.n1) [v2.1, ...,v2.k2] =
F2(e2.1,....e2.n1)
    ...
    [vm.1, ...,vm.km] = Fm(em.1,....em.n1)in
    [e(m+1).1,.....,e(m+1).k(m+1)]
Здесь v*.* -- лизон-переменные, e*.* -- выражения с с-переменными и с лизонами
(определенными выше использования в e*.*).

Тогда можно, построив (ТАВ) класс достижимости cls_i для данной
вершины-конфигурации, построить апроксимацию сверху всех IO-классов в таблице
ТАВ, получаемых здесь и ниже этой вершины:

                     clsio_j = io( cls_i, [e'(m+1).1,.....,e'(m+1).k(m+1)])

где e'i.j получен из ei.j заменой всех лизонов v*.* на свежие (уникальные)
с-переменные. Если пересечение clsio_j с желаемым clsiо пустое:

            null (clsio *. clsio_j)

то нет никаких шансов, что под данной вершиной будет хоть какой-то ответ -- все
поддерево можно откинуть. Это дает отсечение заведомо бесперспективных деревьев
(в том числе--бесконечных).

Это (иногда) повысит скорость и повысит терминируемость SURA (пардон за
терминалогию--все равно останется нетерминируемость и неразрешимость
терминируемости, конечно).

Но это все штуки для вложенных языков (проект XSG как-то движется...)

    From: korlyukov <korlyukov@grsu.grodno.by>

    Но,... хоть какой-нибудь примерчик для прояснения существа дела для таких,
как я, не очень знающего всю предысторию УРА. Чтоб на нем (примере) было видно,
чем результат работы старого УРА отличается от результата работы симметричного
УРА. Не буду возражать, если ответ будет послан по всему списку.

Тут по сути все просто: речь идет о расширении форматов решаемых задач.

Старый УРА умел решать только такие уравнения относительно С-переменных:

         prog c-exps = const

где c-exps -- c-выражения (ну, с параметрами, рефальский образец), const --
данные (без с-переменных).

Пример уравнения, подвластного старому УРА:
  (perm2 X (001 002 003 004 005 006 007)) = (002 003 004 005 006 007 001)
где perm2 -- программа вычисления двойного применения перестановки Х1 к
элементам списка (001 002 003 004 005 006 007)

У нового (симметричного) УРА можно писать переменные слева и справа от знака
равно. Можно и повторные. Тем самым, все старые примеры по формату доступны и
новому УРА, но можно еще писать и такой пример:

         (digits X1) = X1

где (digits A) ==> B -- вот такая функция: она берет число A и строит новое
число В, у которого первая цифра равна тому, сколько в А было нулей, вторая
цифра тому--сколько в А было единиц и т.д.

В старом УРА такой пример тоже бы взялся бы, но через Альпы -- за счет трюка:
пришлось бы ручканми громоздить функцию EQ, строить бы композицию и решать такое
вот уравнение:

                   (EQ (digits X1) X1) = True

В конце письма привожу пару (ну очень классических) примеров на УРА --- как для
старого, так и для нового эти примеры подходят.

Ссылка на PDF рассматриваемой статьи:

   http://www.futamura.info.waseda.ac.jp/~glueck/URA/AbrGlu2.pdf

Очень много примеров в китайской статье (нежное введение в обычный УРА, ссылка
дается на вариант статьи до ее обработки китайскими верстальщиками):

  http://www.botik.ru/~abram/AbrGlu-China.pdf (203,931 байтов)

Удачи

Сергей

--------------------------------------------------------------------------------

Не в пику, а как секция Related Works:

Замечу, что все игры с УРА очень похожи на красивую серию Корлюкова
"инвертирование при помощи SCP" за исключением некоторых разниц:
    1.. УРА намного примитивнее SCP.
    2.. В УРА не нужно писать подпрограммку EQ, которая пишется из примера в
пример в SCP-инверсиях (при этом, в SCP надо каждый раз еще сообразить, с какой
стороны--слева или справа,--надо сравнивать на равенство...)
    3.. Про УРА все теоремы доказаны, все свойства известны. Про SCP... ну,
вообще говоря, SCP расширяет область определения функций. Посему, в примерах
"SCP-для-инверсии"
        a.. либо надо озаботиться, что все входные функции (которые мы SCP-руем
ради инверсии) были бы тотальными (что не есть верно для многих примеров),
        b.. либо надо каждый "ответ" затем подставлять в уравнение и проверать
(у нас в принципе могут быть лишние ответы--то бишь, SCP говорит <F Вася>=True,
однако исходная функция не определена на Вася.... Особенно тяжело подставлять в
исходную функцию выражения с с-переменными. Особенно, когда SCP смело обобщает
такую функцию:

            F { s1 ex = s1 <F ex>;
                      = ;
            };

        до такой:

            F { ex = ex };

        Как тут отсеять "лишние ответы" (на скобках исходная программа не
определена)?

--------------------------------------------------------------------------------

Мatch--наивная проверка вхождения подстроки в строку. При помощи УРА решаются
две задачи "Что есть подстроки строки ABC?" и "Что не есть подстроки строки
AАА?".

Переменные--почти как в рефале: Xe.i -- е-переменная (произвольный лисп-список);
Xа.i -- атомарная переменная.




This archive was generated by hypermail 2b25 : Mon Oct 25 2004 - 21:24:59 MSD