Re: Conditions in Refal-5.


Subject: Re: Conditions in Refal-5.
From: Arkady Klimov (arklimov@keldysh.ru)
Date: Mon Feb 09 2004 - 13:43:20 MSK


Максим, добрый день.

----- Original Message -----
From: "Savtchenko Maxim" <savmaxru@gcnet.ru>
To: <refal@botik.ru>
Sent: Monday, February 09, 2004 2:11 AM
Subject: Re: Conditions in Refal-5.

| Всем доброго <Время_Суток> :-)
|
| Читал АС, много думал. Вокруг этой темы наверняка задолго до меня было сломано
| немало копий, однако мне захотелось поспорить с некоторыми концепциями. Смотрите
| далее по тексту.
|
| ----- 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 аналоги анонимных переменных Пролога, мечтаю о них всю сознательную
| жизнь рефальского программиста).

Эта возможность есть в других диалектах рефала, начиная с Рефал Плюс
(и далее - Рефал-6, Рефал-J): пишете просто "е", "s", "t". Есть ли это
в последней версии Рефала-5, я не знаю, но боюсь, что нет.

| Очевидно, что сокращённая запись может быть
| расширена до полной автоматически, при помощи простого алгоритма: видим два
| подряд идущих образца - вставляем между ними результат равный первому из них;
| видим два подряд идущих результата - вставляем между ними образец состоящий из
| одной анонимной e-переменной. Следует сразу сделать два замечания, одно в
| пользу такого подхода, другое против. Начну с плохого: глупый компилятор глядя
| на код "s1 e2, s1 e2" не поймёт, что входное обьектное выражение нужно просто
| передать дальше неизменным, а будет собирать его из значений переменных при
| каждом шаге сопоставления. На таком простом примере это не страшно, но если в
| образце есть открытые переменные, то выходное выражение будет пересобираться при
| каждом их удлинении. Для решения этой проблемы наверно пришлось бы усложнить
| приведённый выше алгоритм, чтобы он оставлял транслятору указания рассматривать
| подобные случаи особым образом.

Хороший пример, этот аргумент действительно учитывался. Плохо, если тривиальные
вещи требуют от компилятора достаточно высокого интеллекта.

| Второе замечание (благоприятное) больше
| филосовского плана - оно касается случая подряд идущих результатов. В вашем
| примере не случайно результаты содержат функцию "Print", у которой есть побочный
| эффект. Рефал, на мой взгляд, красив именно как функциональный язык, а случай
| подряд идущих результатов теряет смысл, если у первого из них нет побочного
| эффекта. Вывод - введение в функциональный язык новой концепции во имя побочных
| действий мне кажется странным.

Да, вопрос философско-идеологический. Есть и другая точка зрения, согласно которой
"Использование машинных операции [в частности - изменяющих состояние среды -
прим. АК] является неотъемлемой чертой программирования на языке Рефал" (В.Турчин).
И не случайно выполнение рефал-программы определено однозначно как строгая
последовательность определенных шагов, а не чисто-функционально, как Haskell,
например. То, что у рефала есть строго-функциональное подмножество - это безусловно
замечательно, тем более что оно достаточно емко, чтобы быть удобным средством
выражения весьма сложных алгоритмов. Но любая программа (и функциональная - не
исключение) имеет целью в конечном счете изменить нечто в окружении.
То есть на каком-то уровне программы (может самом верхнем) такие средства
все же необходимы. И очень важно, что рефал содержит их _В СЕБЕ_, а не в какой-то
дополнительной примочке.

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

Согласен, что "метафизика", но из такого рода измышлений иногда выводятся
и практические следствия. И кое-какие выводы пришлось бы сделать в данном случае.
Дело в том, что эволюция рефала позднего периода (конец 80-х - 90-е) была
направлена на то, чтобы язык максимально ортогонализовать и сделать в нем
явным и самостоятельным все элементы, из которых состоит его семантика.
И если следовать дальше этому курсу, то из Вашей логики встанет неизбежно
вопрос: а почему это у вас (у нас) в рефале блок не вводит новых переменных?
И почему это нет возможности вернуться внутрь блока "справа" для
переотождествления? Где единство микро- и макро-мира! Непорядок!
И пришлось бы отвечать и расширять семантику дальше. Кстати, такие
предложения были и очень много обсуждались, но... порешили, что это уже слишком.
(А то дальше пришлось бы эти свойства и на функции распространять: ведь блок -
это не более чем вызов анонимной функции).

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

Да, но дальше написано:

> БП определяется парой <P, A>, где P -
> выражение-образец, а A - общее выражение.

Если А - выражение, пусть даже общее, то "результат подстановки в А" - тоже
не более чем одно выражение. Отсюда я и сделал вывод, что на выходе 0, как
и на любом другом - лишь одно выражение.

Кроме того, позволю себе упрекнуть Вас в том, что Вы даете свое определение
понятию, которое изначально в рефале было и использовалось в определенном
точном смысле: понятию _поля зрения_. Напомню, что это _рабочее выражение_
(то есть выражение без переменных), играющее роль переменной части состояния
_рефал-машины_.

С благодарностью за поднятие интересных вопросов -
Аркадий

|
| > Короче, сухой остаток в том, что лучше вообще ни в каком порядке
| > образец с аргументом не склеивать, а определять каждый отдельно и
| > независимо. При этом использовать ли формальный стиль как у нас с
| > Романенко, или псевдокод, как у Вас - уже дело вкуса.
| > Аркадий.
| >
| >
| >
| >
| >
| >
| >
| >
| >
| >
| >
| >
| >
| >
| > ----- 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