Re: Conditions in Refal-5.


Subject: Re: Conditions in Refal-5.
From: Savtchenko Maxim (savmaxru@gcnet.ru)
Date: Mon Feb 09 2004 - 02:11:24 MSK


Всем доброго <Время_Суток> :-)

Читал АС, много думал. Вокруг этой темы наверняка задолго до меня было сломано
немало копий, однако мне захотелось поспорить с некоторыми концепциями. Смотрите
далее по тексту.

----- Original Message -----
From: "Arkady Klimov" <arklimov@keldysh.ru>
To: <refal@botik.ru>
Sent: Saturday, February 07, 2004 11:28 PM
Subject: Re: Conditions in Refal-5.

> Максим, добрый день,
>
> Антон уже ответил достаточно полно, я хочу от себя немного добавить.
> Для рефала-6 когда-то (более 10 лет назад) мной было составлено краткое
> формальное описание синтаксиса и семантики(!), в котором проводилась
> идея, что вообще не нужно связывать "образец" и "результат" ни в форме
> [result:pattern], ни в форме [pattern,result], а считать и то и другое
частными
> случаями понятия "действие", "action", последовательность которых и
> образует "предложение". (В АС, судя по письму Антона, аналогично).
> При этом за образцом может опять следовать новый образец, так же как за
> результатом - новый результат, например
>
> F { s1 e2 : e3 s4 = <Print e2> = <Print e3> };
>
> F получает строку и печатает ее без первого, а потом без последнего символа
> Кстати, этот пример использует, что образец как бы "сохраняет аргумент".

Вот здесь мне видится некоторая шероховатость. Вы считаете, что "образец" и
"результат" не обязанны чередоваться, и СЛЕДОВАТЕЛЬНО их не нужно связывать. Это
утверждение кажется мне не слишком очевидным, ведь возможен и другой подход. Я
предлагаю делать так - пару [pattern,result] (или [result:pattern]), как
наиболее типичную компоненту предложений выделить как базовое "действие", а
сравнительно редко необходимые одиночные "образцы" и "результаты" рассматривать
как частные случаи пар. В этом случае ваш пример становится сокращённой формой
записи следующего предложения:

F { s1 e2 [, s1 e2] : e3 s4 , <Print e2> [: e_] = <Print e3> };

Квадратными скобками выделены дополнения до полной формы записи, "e_" -
анонимная e-переменная (кстати, интересно, введены ли в каком-нибудь диалекте
Рефала-5 аналоги анонимных переменных Пролога, мечтаю о них всю сознательную
жизнь рефальского программиста). Очевидно, что сокращённая запись может быть
расширена до полной автоматически, при помощи простого алгоритма: видим два
подряд идущих образца - вставляем между ними результат равный первому из них;
видим два подряд идущих результата - вставляем между ними образец состоящий из
одной анонимной e-переменной. Следует сразу сделать два замечания, одно в
пользу такого подхода, другое против. Начну с плохого: глупый компилятор глядя
на код "s1 e2, s1 e2" не поймёт, что входное обьектное выражение нужно просто
передать дальше неизменным, а будет собирать его из значений переменных при
каждом шаге сопоставления. На таком простом примере это не страшно, но если в
образце есть открытые переменные, то выходное выражение будет пересобираться при
каждом их удлинении. Для решения этой проблемы наверно пришлось бы усложнить
приведённый выше алгоритм, чтобы он оставлял транслятору указания рассматривать
подобные случаи особым образом. Второе замечание (благоприятное) больше
филосовского плана - оно касается случая подряд идущих результатов. В вашем
примере не случайно результаты содержат функцию "Print", у которой есть побочный
эффект. Рефал, на мой взгляд, красив именно как функциональный язык, а случай
подряд идущих результатов теряет смысл, если у первого из них нет побочного
эффекта. Вывод - введение в функциональный язык новой концепции во имя побочных
действий мне кажется странным.

> В аттаче - файл с текстом этого описания, который входит в состав поставки
> рефала-6. К сожалению, он лежит там в глубоком месте и наверно, редко кто
> на него натыкается.
>
> Семантика там очень формально излагается (да еще на Бог весть каком
> английском) и понять ее наверно может только тот, кто содержательно
> ее уже хорошо знает. Метод описания практически тот же, что использовал
> Романенко в известной книге по Рефалу Плюс, но содержательно семантика
> отличается тем, что у Романенко она давалась для составной конструкции
> вида result:pattern, а у меня этого объединения нет.
>
> Кроме того, обратите внимание что и у Романенко и у меня семантика
> разбивается на систему взаимосвязанных семантик, например, есть семантика
> образца (как операция отождествления с объектным выражением), есть
> семантика блока, есть семантика хвоста или пути.
> У действия есть как бы две семантики: одна определяет результатное выражение,
> передаваемое хвосту, другая - набор присваиваний переменным, точнее,
> расширение исходного набора, тоже передаваемое дальше хвосту.
> Поскольку в рефале нет действий, которые и результат выдают новый и среду
> меняют, то в формализме нет нужды вводить объединенную семантику
> чего-то вроде Вашего БП.

Вот тут опять хочется спорить, хотя мои дальнейшие рассуждения очень
субъективны. Почему я считаю, что формализм с объединённой семантикой всё-таки
необходим, причём именно [pattern,result], а не [result:pattern]? Если взглянуть
на макро-объекты Рефала (предложения, блоки, хвосты, и т. д.) как на чёрные
ящики (вход - выход, а по середине - ХЗ) то можно заметить что их семантика
очень похожа. Они все имеют два входа (поле зрения и множество связанных
переменных) и два выхода (аналогично). В общем случае оба выхода существенно
зависят от обоих входов, и входы не закорочены на выходы (выходное поле зрения
может отличаться от входного, и тоже самое с переменными). У всех них есть
ручка, позволяющая получить следующий вариант выхода для того же входа (во
всяком случае такую ручку можно безболезненно прикрутить). Теперь, если
взглянуть на микро-мир Рефала ("образцы" и "результаты") с тех же позиций,
становится видно, что мельчайшим обьектом, обладающим всеми вышеперечисленными
свойствами является пара [pattern,result]. Отдельный "образец" имеет всегда
закороченые входное и выходное поля зрения. Отдельный "результат" не зависит от
входного поля зрения, имеет всегда закороченые входное и выходное множества
связанных переменных и не имеет ручки следующего варианта. Пара [result:pattern]
вообще не имеет входных и выходных полей зрения. И только пара [pattern,result]
полностью аналогична макро-обьектам. Тут напрашивается аналогия с физикой: у нас
есть красивая теория идеального газа. Из чего состоит газ? Можно сказать, что он
состоит из ядер и электронов, но всё-же разумнее считать, что он состоит из
мельчайших частиц, каждая из которых обладает свойствами всего газа, то есть
атомов. А всё что мельче атомов - квантовая физика и вообще не наша область.
Такой подход позволяет красиво инкапсулировать уровни мышления, чётко отделить
"термодинамику" предложений и блоков от "квантовой механики" сопоставлений и
подстановок.

В конечном счёте, всё это сплошная метафизика и досужие измышления, так что
заранее прошу прощения.

> Кроме того, семантика отдельного действия, а у Романенко - "перестройки",
> дается лишь контексте хвоста (пути). Только для него можно
> сказать, чтО есть его результат.
> Сказать отдельно, чтО есть совокупный результат действия
> образца или перестройки довольно сложно и громоздко: в этот результат,
> помимо значения (объектного выражения), надо еще включать и набор
> связываний для уже определенных переменных, чтобы их использовать
> в дальнейшем вычислении (которых, как и Вас должно быть множество).
> А Вы в своем определении это упустили:
>
> > На выходе 0 - результат подстановки в A переменных связанных во входном
поле
> > зрения, а так же связанных в результате сопоставления P с входным полем
> > зрения.
>
> Хотя, у Вас используется понятие "переменных связанных во входном
> поле зрения", но само оно остается неопределенным.

Может я вас не понял, но кажется вы не заметили предложения абзацем выше:
"Под полем зрения понимается объектное выражение плюс множество всех связанных
переменных с их значениями."

> Короче, сухой остаток в том, что лучше вообще ни в каком порядке
> образец с аргументом не склеивать, а определять каждый отдельно и
> независимо. При этом использовать ли формальный стиль как у нас с
> Романенко, или псевдокод, как у Вас - уже дело вкуса.
> Аркадий.
>
>
>
>
>
>
>
>
>
>
>
>
>
>
> ----- Original Message -----
> From: "Anton Orlov" <orlov@mccme.ru>
> To: <refal@botik.ru>
> Sent: Saturday, February 07, 2004 1:50 AM
> Subject: Re: Conditions in Refal-5.
>
>
> | Добрый вечер!
> |
> | On Fri, Feb 06, 2004 at 12:56:59 +0300, Savtchenko Maxim wrote:
> | > Andrei Klimov <klimov@keldysh.ru> wrote:
> | >
> | > > А по существу (если я правильно понял, что Вы имеете в виду),
> | > > я могу только заметить, что подобная работа по "регуляризации"
> | > > синтаксиса Рефала была проделана на рубеже 80-х и 90-х
> | > > при разработке Рефала Плюс, а затем шлифовалась дальше
> | > > в Рефале-6 (теперь это Refal-J -- Рефал над Явой).
> | >
> | > Андрей, вы наверное обратили основное внимание на фразу:
> | >
> | > "... в нашем случае последнее БП функционально ничем не отличается от
> | > остальных, и поэтому его не стоит выделять синтаксически."
> | >
> | > Вопрос синтаксиса в моей идее наименее существенен, замеченное вами имело
> | > целью просто чуть-чуть упростить БНФ и никакой смысловой нагрузки не
несло.
> | > Мне интересно иное - пробовал ли кто-нибудь взглянуть на СЕМАНТИКУ
> | > предложений немного с другой стороны. Рассмотреть работу предложения не
как
> | > "сопоставляем вход с левой частью и заменяем на правую, если выполняются
все
> | > условия", а как на работу соединённых в последовательную цепочку "базовых
> | > предложений".
> |
> | Мне кажется, что семантикой рефал-предложения разумно называть
> | функцию из множества рефал-выражений + таблиц означенных
> | переменных в множество рефал-выражений.
> |
> | Если я правильно понимаю, семантика каждого Вами описанного
> | предложения определяется как семантика рефал5-предложения,
> | которое получается из Вашего заменой каждого базового предложения
> | на [pattern, arg] и формированием последовательности
> | соответствующих условий (перестроек) [arg : pattern]. Это так?
> |
> | То есть Вы, по сути, предлагаете другой вариант не семантики, а
> | синтаксиса предложения, чему и соответствует другая запись в виде
> | БНФ.
> |
> | Работа по упрощению (регуляризации) синтаксиса Рефала идёт уже
> | давно, про что и написал Андрей Валентинович. Как результат (или
> | часть) этой работы был создан так называемый Абстрактный
> | Синтаксис (АС), включающий элементы для адекватного отображения
> | программ на всех современных диалектах Рефала.
> |
> | Некоторую версию АС можно посмотреть по адресу:
> |
http://skif.pereslavl.ru/skif/index.cgi?module=chap&action=getpage&data=refal\as
-syntax.html
> |
> | Часть АС, соответствующая рефал5-предложению, выглядит
> | так:
> |
> | e.Sentence ::= /*Empty*/ | t.Action e.Sentence
> | t.Action ::= t.Pattern | t.Result | t.Block
> | t.Block ::= (BLOCK e.Branches)
> | e.Branches ::= /*Empty*/ | t.Branch e.Branches
> | t.Branch ::= (BRANCH e.Sentence)
> |
> | t.Result здесь -- это результатное выражение. У Вас оно названо
> | expression.
> |
> | > Признаюсь в том, что я долго пытался придумать
> | > осмысленный пример предложения, которое в новой семантике проще чем в
> | > традиционной, но увы, видимо я слишком привык думать по старому :-(. Может
> | > вы чем поможете.
> |
> | Это неудивительно, потому что семантика Ваших предложений слишком
> | просто выражается через семантику обычных рефал5-предложений.
> |
> | С другой стороны, приведённая выше часть АС позволяет записывать
> | предложения, которые выразить на Рефале-5 уже не так просто.
> |
> | Например (в синтаксисе Рефала Плюс):
> |
> | F e1 =
> | e1 : {
> | (s2) = s2;
> | s2 = s2;
> | } : {
> | 1 = "Refal is cool!";
> | 2 = "Refal is very cool!";
> | };
> |
> | Чтобы записать это на Рефале-5, придётся использовать либо
> | вспомогательную функцию, либо две копии последнего блока.
> |
> | Антон.
>



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