Система программирования рефал/2 для пэвм ibm pc. Описание входного языка




старонка1/3
Дата канвертавання21.04.2016
Памер357.15 Kb.
  1   2   3
Система программирования РЕФАЛ/2 для ПЭВМ IBM PC.

Описание входного языка.

С о д е р ж а н и е

Введение . . . . . . . . . . . . . . . . . . . . . . 03

1. Назначение языка . . . . . . . . . . . . . . . . . . 04

2. Обрабатываемые данные . . . . . . . . . . . . . . . 05

3. Функции . . . . . . . . . . . . . . . . . . . . . . 08

4. Переменные . . . . . . . . . . . . . . . . . . . . . 12

5. Рекурсивные функции . . . . . . . . . . . . . . . . 14

6. Снятие неоднозначности при отождествлении . . . . . 15

7. Спецификаторы переменных . . . . . . . . . . . . . . 18

8. Общая структура программы . . . . . . . . . . . . . 23

9. Пустые функции . . . . . . . . . . . . . . . . . . . 26

10. Модули . . . . . . . . . . . . . . . . . . . . . . . 27

11. Первичные функции . . . . . . . . . . . . . . . . . 29

12. Копилка . . . . . . . . . . . . . . . . . . . . . . 30

13. Статические и динамические ящики . . . . . . . . . . 33



Введение


Различные описания языка РЕФАЛ отличаются в некоторых деталях. Вариант РЕФАЛа, соответствующий [Бр 1977, т 1974], получил название "базисного РЕФАЛа".

В системе программирования РЕФАЛ-2 для ЕС ЭВМ в качестве входного языка служит некоторое расширение базисного РЕФАЛа. Это же расширение было реализовано в трансляторе РЕФАЛа для БЭСМ-6 в рамках мониторной системы "Дубна" [Кпртр 1975, Кр 1975]. Система программирования РЕФАЛ-2 для ПЭВМ совместима по входному языку с реализациями для ЕС ЭВМ и БЭСМ-6.

Ниже описан входной язык системы программирования РЕФАЛ-2, который в дальнейшем для краткости именуется просто "РЕФАЛ".
1. Назначение языка

Язык РЕФАЛ (алгоритмический язык рекурсивных функций) был создан в качестве абстрактного метаалгоритмического языка, предназначенного для формализации семантики алгоритмических языков [Т 1966, Т 1968, Бр 1977].

Хотя РЕФАЛ был задуман как метаалгоритмический язык, он представляет собой некоторый язык для обработки символьной информации, поэтому, помимо описания семантики алгоритмических языков, он нашел и другие, не менее важные применения. В первую очередь это машинное выполнение громоздких аналитических выкладок в теоретической физике и прикладной математике, интерпретация и компиляция языков программирования, машинное доказательство теорем, моделирование целенаправленного поведения и т.п. Общим для всех этих применений является то, что мы заставляем машину совершать сложные преобразования над об'ектами, определенными в некоторых формализованных языках (алгоритмические языки, язык алгебры, язык исчисления предикатов и т.д.).
2. Обрабатываемые данные

Данные, обрабатываемые РЕФАЛ-программами, являются языковыми об'ектами, т.е. некоторыми последовательностями знаков.

Следующие знаки имеют в РЕФАЛ-программах особое, фиксированное значение:

k . ( ) / ' = S W V E T s w v e t

Эти знаки называются с п е ц и а л ь н ы м и з н а - к а м и.

Из знаков строятся более крупные единицы - с и м в о - л ы, т е р м ы и в ы р а ж е н и я.

С и м в о л является минимальной семантической единицей, не расчленимой на составные части средствами языка РЕФАЛ.

Символы делятся на два класса: с о с т а в н ы е

с и м в о л ы и с и м в о л ы-л и т е р ы (или, как их

еще называют, "об'ектные знаки").

Любой составной символ имеет следующий вид:

/[тело составного символа]/

где [тело составного символа] - это последовательность литер, не содержащая литеру "/".

Множество составных символов разбивается на непересекающиеся классы, в соответствии с тем, какой вид имеют их тела. В данной реализации РЕФАЛа имеются следующие классы составных символов: символы-метки, символы-числа и символы-ссылки.

С и м в о л а м и - м е т к а м и называются составные символы, телом которых является идентификатор, т.е. последовательность букв, цифр и знаков "-", начинающаяся с буквы. Длина тела символа-метки не ограничивается, однако принимаются во внимание только первые 255 литер тела, а все последующие - игнорируются. Таким образом, все символы-метки, у тел которых совпадают первые 255 литер, считаются совпадающими.

Например, следующие символы являются символами-метками:

/аLрна/

/L2а4/


/этопримердлиннойметки/

/это-пример-другой-длинной-метки/

/Z---Z---/

С и м в о л а м и - ч и с л а м и называются составные символы, тело которых представляет собой целое неотрицательное число, т.е. последовательность десятичных цифр. Например:

/0/ /1/ /512/ /23/

Тело символа-числа должно находиться в диапазоне от 0 до 64535 (2**16-1).

С и м в о л а м и - с с ы л к а м и называются составные символы, тело которых начинается с литеры "%", вслед за которой идет восемь шестнадцатеричных цифр. Например:

/%00fffac9/ /%ffffffff/ /%abcdefab/

Символы-ссылки нельзя употреблять в качестве констант в РЕФАЛ-программах, однако они могут порождаться в процессе работы РЕФАЛ-программы и входить в обрабатываемые выражения. Назначение и использование символов-ссылок будет описано ниже.

Символы-метки используются в программах в качестве имен функций. Символы-числа служат для обозначения чисел.

Помимо составных символов имеется еще один класс символов - символы-литеры. Любой символ-литера имеет следующий вид:

'[литера]'

где [литера] - произвольная литера, отличная от апострофа.

Символы-литеры служат для обозначения литер. Так как апостроф тоже является литерой, которую нужно уметь обрабатывать, для него имеется особое обозначение:

''

т.е. два апострофа, идущих подряд.



Следует заметить, что символ

' '


обозначает не апостроф, а литеру "пробел", которая является такой же полноценной литерой, как и все остальные.

Более крупной, чем символ, единицей является в ы р а - ж е н и е.

Выражение строится из с и м в о л о в, круглых скобок "(" и ")" (именуемых с т р у к т у р н ы м и скобками), символов "k" и "." (именуемых ф у н к ц и о н а л ь н ы м и или конкретизационными скобками) и п е р е м е н н ы х.

Структурные скобки придают обрабатываемым об'ектам структуру дерева. Назначение функциональных скобок и переменных об'ясняется в следующих разделах.

В ы р а ж е н и е м называется произвольная последовательность символов, переменных и скобок, правильно построенная относительно скобок. Например:

'A' 'B' 'C' ()

(('A') 'B'()) ()

kk/X/. (k/Y/.).

Т е р м о м называется выражение, которое представляет собой либо символ, либо выражение, заключенное в структурные или функциональные скобки. Например:

'+'


( 'A' 'B' 'C' () )

((()) ())

k/P1/ /1/.

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

Приведенные выше определения выражения и терма можно формализовать следующим образом:

[выражение] ::= [пусто] ! [терм] [выражение]

[терм] ::= [символ] ! [переменная] !

[структурный терм] !

[функциональный терм]

[структурный терм] ::= ( [выражение] )

[функциональный терм] ::= k [выражение] .

[пусто] ::=

Очень часто приходится иметь дело не с отдельными символами-литерами, а с цепочками из нескольких подряд идущих литер. Для таких случаев предусмотрено сокращенное обозначение. а именно, литеры записываются подряд и вся цепочка литер заключается в апострофы. Например, цепочку литер "ABC", изображаемую как

'A' 'B' 'C'

можно в сокращенной форме записывать как

'ABC'


Если цепочка литер содержит апострофы, они изображаются парами апострофов. При этом цепочка, составленная из одних апострофов, удваивается, но апострофами дополнительно не обрамляется. Например:

ABC --> 'ABC'

A'C --> 'A''C'

' --> ''


'' --> ''''

'A'B --> '''A''B'

A'B' --> 'A''B'''

где стрелка "-->" обозначает слова "изображается в виде".

Таким образом, одну и ту же цепочку символов-литер можно изобразить многими способами. Например, цепочка литер "A'B" может быть представлена любым из следующих способов:

'A' '' 'B'

'A''' 'B'

'A' '''B'

'A''B'

Для повышения наглядности РЕФАЛ-программы можно вставлять любое количество пробелов между переменными, скобками, составными символами и цепочками литер. Цепочку литер можно разбить на несколько цепочек, но при этом между получившимися частями обязательно должен стоять по крайней мере один пробел, так как



'A' 'B' обозначает AB

'A''B' обозначает A'B

Кроме того, следует обратить внимание на то, что структурные скобки "(" и ")" в рефале н е я в л я ю т с я символами. Поэтому структурные скобки не имеют ничего общего с символами-литерами '(' и ')'.
3. Функции

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

Аргументами функций могут быть не произвольные выражения, а только такие, которые не содержат функциональных скобок и переменных. Такие выражения в дальнейшем именуются о б ' е к т н ы м и.

В общепринятой математической записи обращение к функции FUNC с аргументом [ARG] имеет следующий вид:

FUNC([ARG])

В РЕФАЛе же принят другой синтаксис для вызовов функций:

k/FUNC/ [ARG].

т.е вызов функции заключается в функциональные скобки

"k" и ".", а имя функции указывается с помощью символа-метки. Фактически, имя вызываемой функции представляет собой часть функционального терма - первый символ его содержимого.

Возникает вопрос, почему же в РЕФАЛе функции имеют только один аргумент? Ответ заключается в том, что список из нескольких аргументов является некоторым выражением, поэтому всякое обращение к функции от нескольких аргументов

FUNC([ARG1], [ARG2], ..., [ARGN])

можно рассматривать как обращение к функции от одного "большого" аргумента:

k FUNC ([ARG1]) ([ARG2]) ... ([ARGN]) .

П р о г р а м м а на языке РЕФАЛ представляет собой описание некоторого набора функций. Описание каждой функции имеет вид:

FUNC

[L-1] = [R-1]



[L-2] = [R-2]

. . . . . ..

[L-N] = [R-N]

где "FUNC" - имя функции, а

[L-I] = [R-I]

суть п р е д л о ж е н и я или п р а в и л а к о н -

к р е т и з а ц и и.

Каждое предложение является указанием для замены одного выражения на другое, поэтому оно состоит из левой части [L-I] (заменяемое выражение) и правой части [R-I] (результат замены). Синтаксически [L-I] и [R-I] являются выражениями.

Перед левой частью каждого предложения должен находиться хотя бы один пробел.

Если предложение не помещается в очередной строке, его можно перенести на следующие строки. Перенос допускается делать в тех местах, где разрешается вставлять пробелы. В любом из таких мест можно поставить знак "+" и продолжить предложение с любой позиции следующей строки.

Имя функции не обязано располагаться на отдельной строке. Его можно поместить в начале той строки, в которой находится первое предложение. При этом имя функции отделяется от начала предложения одним или несколькими пробелами. В этом случае описание функции имеет следующий вид:

FUNC [L-1] = [R-1]

[L-2] = [R-2]

. . . . . ..

[L-N] = [R-N]

С е м а н т и к а РЕФАЛ-программы описывается в терминах абстрактной Р Е Ф А Л - м а ш и н ы. РЕФАЛ-машина имеет два запоминающих устройства: п о л е п а м я т и и п о л е з р е н и я.

Перед началом работы в поле памяти заносится описание набора функций, а в поле зрения - выражение, подлежащее обработке.

Пусть, например, в поле памяти находится единственное предложение:

XXX = '137'

а в поле зрения - выражение

k/XXX/.

Тогда РЕФАЛ-машина заменит содержимое поля зрения на выражение



'137'

и остановится, поскольку в поле зрения не осталось ни одной пары функциональных скобок.

А что будет, если занести в поле памяти два предложения: XXX = '137'

= '274'


Теперь для вычисления "k/XXX/." пригодно не одно, а два предложения. Неоднозначность устраняется следующим образом. РЕФАЛ-машина просматривает предложения в том порядке, в котором они стоят в описании функции и применяет первое из них, которое окажется подходящим. Таким образом, в данном случае "k/XXX/." будет заменено на '137'.

Поле зрения может содержать сколь угодно много функциональных термов, которые могут быть как угодно вложены друг в друга. Поэтому нужно договориться, каким образом РЕФАЛ-машина будет выбирать выражение, с которого надо начинать процесс вычисления.

Пусть в поле зрения находится выражение, в котором имеются функциональные термы. Тогда некоторые из этих термов являются самыми внутренними, т.е. не содержат внутри себя других функциональных термов. Самый левый из таких термов мы будем называть в е д у щ и м.

Теперь опишем работу РЕФАЛ-машины (для частного случая, когда РЕФАЛ-программа не содержит переменных).

Работа РЕФАЛ-машины разбивается на шаги. В начале каждого шага РЕФАЛ-машина находит ведущий функциональный терм.

Пусть этот терм имеет вид:

k/FUNC/ [ARG].

где "FUNC" - имя некоторой функции, а [ARG] - об'ектное выражение. Таким образом, предполагается, что содержимое ведущего терма начинается с символа-метки. (Случай, когда это не выполнено, будет рассмотрен позже.)

РЕФАЛ-машина находит описание функции "FUNC" и начинает сравнивать [ARG] с левыми частями предложений в описании этой функции.

Пусть I - номер самого первого предложения, для которого [L-I]=[ARG]. Тогда РЕФАЛ-машина производит з а м е н у ведущего функционального терма, т.е.

k/FUNC/ [ARG].

заменяется на правую часть предложения

[R-I]

после чего РЕФАЛ-машина переходит к исполнению следующего шага.



Если же РЕФАЛ-машина не находит ни одного предложения для которого [L-I]=[ARG], она сообщает, что "отождествление невозможно" и останавливается. Это означает, что либо программа на РЕФАЛе, либо исходные данные для нее заданы неверно.

Работа РЕФАЛ-машины продолжается до тех пор, пока в поле зрения имеется хотя бы один функциональный терм. Если же в поле зрения после завершения очередного шага не остается ни одного функционального терма, РЕФАЛ-машина сообщает, что "вычисление окончено" и останавливается. При этом, результатом работы РЕФАЛ-машины считается выражение, которое находится в поле зрения.

Пусть, например, поле памяти содержит следующий набор функций:

XXX


= '137'

= '274'


YYY

= '2'


ADD

('137') '2' = '139'

А в поле зрения находится выражение

k/ADD/ (k/XXX/.) k/YYY/. .

Тогда на первом шаге ведущим будет терм "k/XXX/.", который заменится на '137', в результате чего поле зрения примет

вид:


k/ADD/ ('137') k/YYY/..

Теперь подлежит вычислению терм "k/YYY/.", что дает

k/ADD/ ('137') '2'.

На третьем шаге применяется функция "ADD", и в поле зрения оказывается выражение

'139'

которое уже не содержит функциональных скобок и является окончательным результатом работы рефал-машины.


4. Переменные

Средства, описанные в предыдущих разделах, позволяют описывать только функции, области определения которых - конечные множества, ибо для каждого конкретного значения аргумента приходилось предусматривать особое предложение. Ясно, что так мы далеко не уйдем. Нужно уметь записывать предложения, применимые более, чем к одному об'ектному выражению. Для этого нужно ввести в предложения п е р е м е н н ы е, которые при различных применениях предложения могут принимать различные значения.

Языковые об'екты, с которыми имеет дело РЕФАЛ-машина, это всегда выражения, которые могут быть, в частности, термами или символами. Поэтому в РЕФАЛе-2 используются переменные четырех типов:

S-переменные, значением которых могут быть только символы;

W-переменные, значением которых могут быть только термы;

V-переменные, значением которых могут быть только непустые выражения;

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

Любая переменная имеет следующий вид:

[признак типа][спецификация][индекс]

[Признак типа] - это один из специальных знаков "S", "W", "V" или "E". Он указывает, к какому из четырех вышеперечисленных типов принадлежит переменная.

[Спецификация] - это описание дополнительных условий, налагаемых на множество допустимых значений переменной. Спецификация может быть пустой. В этом случае считается, что на возможные значения переменной не налагается никаких дополнительных ограничений. Т.е. значением S-переменной может быть любой символ, значением W-переменной - любой терм, значением V-переменной - любое непустое выражение, значением E-переменной - любое (в том числе и пустое) выражение.

[Индекс] переменной - это цифра, либо прописная буква русского или латинского алфавитов. Индексы переменных служат для того, чтобы различать между собой различные переменные.

Например, S-переменными являются "S1", "S2" и "SA", W-переменными являются "W1" и "Wх", V-переменными являются "V9" и "VZ", E-переменными являются "E1", "E5" и "EA".

Разрешив употреблять переменные в левых и правых частях предложений, мы получаем мощное изобразительное средство. Теперь, чтобы решить, применимо ли предложение

[L] = [R]

к об'ектному выражению [ARG], РЕФАЛ-машина должна определить, является ли [ARG] частным случаем [L], т.е. можно ли вместо переменных, входящих в [L] подставить такие значения, чтобы получившееся об'ектное выражение совпало с [ARG]. При этом, значения переменных должны быть допустимыми, т.е. соответствовать их типам и спецификациям. Кроме того, все вхождения одной и той же переменной должны заменяться на одно и то же значение.

Описанное выше действие РЕФАЛ-машины, по подбору значений переменных, называется с и н т а к с и ч е с к и м о т о ж д е с т в л е н и е м.

В том случае, если отождествление левой части [L] с [ARG] возможно, предложение является применимым, в противном случае - неприменимым.

Теперь мы следующим образом уточним описание работы РЕФАЛ-машины.

На каждом шаге РЕФАЛ-машина просматривает описание функции и находит самое первое применимое предложение. Затем она заменяет ведущий функциональный терм на правую часть этого предложения, предварительно подставив в нее вместо переменных те значения, которые получили эти переменные в результате синтаксического отождествления. Если же окажется, что все предложения функции неприменимы, РЕФАЛ-машина сообщает, что "отождествление невозможно" и останавливается.

Разумеется, в правой части предложения разрешается использовать только такие переменные, которые входят в левую часть. Кроме того, все вхождения одной и той же переменной в левую и правую часть должны иметь одинаковый указатель типа переменной.

Рассмотрим несколько примеров. Допустим, что нужно описать функцию "FIRST-SYM", которая в качестве значения выдает первый символ аргумента. Например, чтобы результатом вычисления терма

k/FIRST-SYM/ 'Z'('AB')'+F'.

был символ 'Z', а результатом вычисления

k/FIRST-SYM/ /X1/ /X2/.

был символ /X1/.

Для этого достаточно ввести в поле памяти РЕФАЛ-машины следующее описание функции:

FIRST-SYM

SA EX = SA

Аналогично можно описать функцию, значением которой является последний символ аргумента:

LAST-SYM

EX SA = SA


5. Рекурсивные функции

Поскольку правые части предложений могут содержать функциональные скобки, можно описывать функции в терминах других функций или применять рекурсию.

Опишем, например, функцию "RеV", определенную для всех выражений. Значением этой функции является "зеркально перевернутое" исходное выражение. Так, вычисление терма

k/REV/ 'A'('B'('CD')'F').

должно давать

('F'('DC')'B')'A'

Функция "REV" описывается тремя предложениями:

REV E1 SX = SX k/REV/ E1.

E1 (EX) = (k/REV/ EX.) k/REV/ E1.

=

Обратите внимание на то, что структурные скобки "(" и ")" не являются символами, и, в отличие от символов-литер '(' и ')', не могут быть значениями S-переменной. Поэтому, если аргумент кончается на правую структурную скобку, то первое предложение функции - не применимо. В этом случае применяется второе предложение.



Другой пример. Функция "SYMM" принимает значение 'Т' если аргумент - симметричное выражение (т.е. такое, которое не изменяется в результате применения к нему функции "REV"), и принимает значение 'F', если аргумент не является симметричным выражением.

SYMM


EX = k/EQUAL/ (EX) k/REV/ EX..

EQUAL


(EX) EX = 'T'

(EX) EY = 'F'

Функцию "SYMM" можно описать и без обращения к функции "REV":

SYMM = 'T'

SX = 'T'

SX EA SX = k/SYMM/ EA.

(EA) = k/SYMM/ EA.

() EA () = k/SYMM/ EA.

(WX E1) EA (E2 WY) = +

k/SYMM/ WX (E1) EA (E2) WY.

EA = 'F'
6. Снятие неоднозначности при отождествлении

Будем говорить, что некоторая переменная является VE-переменной, если она является V-переменной или E-переменной.

Если левая часть предложения содержит несколько VE-переменных, то может случиться, что существует несколько вариантов приписывания переменным значений, приводящих к отождествлению левой части предложения с аргументом функции. Пусть, например, в поле памяти находится функция

F E1 ';' E2 = k/G/ E1. k/F/ E2.

а в поле зрения - выражение

Это выражение может быть отождествлено с левой частью таким образом, что переменные "E1" и "E2" примут следующие значения:

E1 <-- 'A1:=A2'

E2 <-- 'B1:=B2;C1:=C3'

Однако, возможен и другой вариант отождествления, при котором переменные примут такие значения:

E1 <-- 'A1:=A2;B1:=B2;'

E2 <-- 'C1:=C2'

Следовательно, необходимо договориться, как поступает РЕФАЛ-машина при наличии такой неоднозначности.

Для устранения неоднозначности в РЕФАЛе-2 могут использоваться два метода: отождествление слева направо и отождествление справо налево.

При отождествлении слева направо РЕФАЛ-машина выбирает тот вариант отождествления, при котором первая слева VE-переменная принимает самое короткое значение. Если это не устраняет неоднозначности, то такой же отбор производится по второй слева VE-переменной, затем - третьей слева и т.д. В нашем примере будет выбран первый из двух способов отождествления.

При отождествлении справа налево РЕФАЛ-машина выбирает тот вариант отождествления, при котором первая справа VE-переменная принимает самое короткое значение. Если это не устраняет неоднозначности, то такой же отбор производится по второй справа VE-переменной, затем третьей справа и т.д. В нашем примере будет выбран второй из двух способов отождествления.

Если мы хотим, чтобы при применении некоторого предложения использовалось отождествление справа налево, следует сообщить об этом РЕФАЛ-машине, поместив перед левой частью предложения ключевое слово "R", т.е. знак "R", за которым следует хотя бы один пробел. Если же мы хотим, чтобы при применении некоторого предложения использовалось отождествление слева направо, следует сообщить об этом РЕФАЛ-машине, поместив перед левой частью предложения ключевое слово "L", т.е. знак "L", за которым следует хотя бы один пробел.

Если направление отождествления не указано явно, РЕФАЛ-машина считает, что отождествление следует выполнять слева направо, поэтому ключевое слово "L" указывать не обязательно (и оно отсутствовало во всех приведенных примерах).

Например, описанная выше функция "F", выдаст в результате замены

k/G/ 'A1:=A2'. k/F/ 'B1:=B2;C1:=C2'.

Но если описать "F" следующим образом:

F R E1 ';' E2 = k/G/ E1. k/F/ E2.

то результатом замены будет

k/G/ 'A1:=A2;B1:=B2'. k/F/ 'C1:=C2'.

Отождествление слева направо и справо налево широко используются при программировании на РЕФАЛе. В качестве примера рассмотрим функцию "MAKE-SET", которая порождает множество термов, входящих в аргумент на нулевом уровне скобочной структуры. Эта функция просматривает выражение слева направо терм за термом. Для очередного терма проверяется, не стоит ли справа от него точно такой же терм. Если да, то очередной терм вычеркивается, в противном случае - оставляется. Оставшееся выражение обладает тем свойством, что составляющие его термы попарно различны. Например, результатом вычисления

k/MAKE-SET/ 'AAACBDBEAAF'.

будет выражение

'СDBEAF'

"MAKE-SET" описывается следующим образом:

MAKE-SET

E1 WX E2 WX E3 = E1 k/MAKE-SET/ E2 WX E3.

E1 = E1

Функция "MAKE-SET" вычеркивает все вхождения каждого терма, кроме последнего. Нетрудно, однако описать функцию "MAKE-SETR", которая будет вычеркивать все вхождения терма, кроме первого. Для этого можно воспользоваться отождествлением справа налево.

MAKE-SETR

R E3 WX E2 WX E1 = k/MAKE-SETR/ E3 WX E2. E1

E1 = E1

При желании можно описать функцию "MAKE-SET" так, чтобы при отождествлении не возникало неоднозначностей:

MAKE-SET

WA E1 = k/MAKE-SET-/ WA () E1.

=

MAKE-SET-



WA (E1) WA E2 = k/MAKE-SET/ E1 WA E2.

WA (E1) WB E2 = k/MAKE-SET-/ WA (E1 WB) E2.

WA (E1) = WA k/MAKE-SET/ E1.

Видно, что первоначальное описание было короче и нагляднее. кроме того, во втором описании пришлось использовать вспомогательную функцию "MAKE-SET-".

  1   2   3


База данных защищена авторским правом ©shkola.of.by 2016
звярнуцца да адміністрацыі

    Галоўная старонка