Главная страница
Навигация по странице:

  • образец последовательность_условий = выражение

  • условие ::= аргумент : образец аргумент

  • М. В. Ломоносова Факультет вычислительной математики и кибернетики Е. И. Большакова, Н. В. Груздева Основы программирования на языке Рефал Учебное пособие


    Скачать 0.92 Mb.
    НазваниеМ. В. Ломоносова Факультет вычислительной математики и кибернетики Е. И. Большакова, Н. В. Груздева Основы программирования на языке Рефал Учебное пособие
    Анкорqewqe
    Дата02.01.2022
    Размер0.92 Mb.
    Формат файлаdoc
    Имя файлаRefalP-1.doc
    ТипУчебное пособие
    #323127
    страница12 из 22
    1   ...   8   9   10   11   12   13   14   15   ...   22

    3.2.Условная конструкция


    Условная, или where-конструкция, а более коротко – условие языка Рефал-5 может записываться за образцом в левой части рефал-предложения, отделяясь от него запятой (допустим также знак амперсенда &, но далее везде будем использовать только запятую). Эта конструкция служит для задания дополнительных условий на применимость предложения. В общем случае в одном предложении допускается несколько условий, разделяемых между собой запятой или амперсендом, фактически означающими конъюнкцию этих условий.

    Напомним, что образцом называется рефальское выражение, не содержащее функциональных термов. В Рефале-5 предложение функции может иметь вид:

    образец  последовательность_условий = выражение

    последовательность_условий ::=

    , условие последовательность_условий | пусто

    условие ::= аргумент : образец

    аргумент ::= выражение

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

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

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

    Опишем подробнее процесс проверки условий. При вычислении каждого условия Еii рефал-машина порождает новое временное поле зрения, в которое помещает выражение-аргумент Еi, заменив в нём все связанные переменные их значениями, и работает (в обычном режиме) над этим полем до тех пор, пока в нём есть необработанные функциональные вызовы. Затем рефал-машина переходит к синтаксическому отождествлению результирующего выражения с образцом Рi, предварительно заменив в Рi все связанные переменные на их значения. Если отождествление было успешным, то аналогичным образом вычисляется следующее условие. Если же условий больше нет, то рефал-машина применяет рассматриваемое предложение, т.е. производит действия, определяемые его правой частью или присоединённым блоком.

    В случае неуспешного отождествления Еi и Рi из очередного условия, рефал-машина возвращается к предыдущему условию Еi-1:Рi-1 и пытается найти другой вариант отождествления этой пары, придавая более длинные возможные значения е-переменным в Pi-1 (при i=1 возврат происходит к обрабатываемому в основном поле зрения выражению и основному образцу предложения). Если других вариантов отождествления нет, то текущее рефал-предложение считается неприменимым. Если же найден другой вариант отождествления Еi‑1 и Рi-1, рефал-машина снова пытается отождествить пару Еi и Рi, но уже при новых найденных значениях входящих в них связанных переменных. Каждый раз после того, как проверка условия Еii завершается либо успехом, либо неудачей, временное поле зрения, созданное для Еi, уничтожается.

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

    'X*Y/8*'('Z/3-56')'+9*A-23*B'

    получится выражение ('X*Y/8*'('Z/3-56'))'+'('9*A-23*B')

    * Функция Search-plus-minus заключает в структурные

    * скобки выражение, предшествующее и

    * следующее за первым знаком + или -

    Search-plus-minus {

    e.1 s.2 e.3 , '+-' : e.X s.2 e.Y =

    (e.1) s.2 (e.3);

    e.X = e.X }

    Первое предложение этой функции после основного образца e.1 s.2 e.3, выделяющего в обрабатываемом выражении символ s.2, содержит дополнительное условие его равенства одному из знаков '+' и '-' – для этого используется образец условия e.X s.2 e.Y и выражение-аргумент '+-'. Второе предложение функции добавлено для того, чтобы она была всюду определена.

    Основной образец первого предложения этой функции применим к любому выражению, содержащему хотя бы один символ, и при отождествлении с непустым выражением переменная s.2 получит в качестве значения первый символ этого выражения. Дополнительное условие первого предложения требует отождествимости значения переменной s.2 с одним из знаков '+' или '-' (при успешном отождествлении либо переменная e.X, либо переменная e.Y будет иметь в качестве значения пустое выражение). При успешной проверке условия, когда значением s.2 является один из знаков '+' или '-', выполняется правая часть предложения, в которой выражения е.1 и е.3 заключаются в скобки.

    При неуспешной проверке дополнительного условия (когда значение переменной s.2 – любой знак, отличный от плюса и минуса) происходит возврат к отождествлению основного образца предложения, значение переменной е.1 удлиняется, и находится новый вариант отождествления, при котором s.2 получает в качестве значения второй (от начала) символ исходного выражения. После чего снова происходит проверка дополнительного условия, и если она неуспешна, вновь происходит возврат к отождествлению основного образца и находится новое значение переменной s.2, а значение переменной е.1 снова удлиняется – и так до тех пор, пока значением s.2 не станет знак '+' или '-' и будет выполнена правая часть предложения.

    Если же в обрабатываемом выражении вообще нет символов '+' и '-', то после безуспешного перебора всех символов его верхнего уровня (в качестве значения s.2) первое предложение функции будет признано неприменимым, и выполнится второе предложение.
    1   ...   8   9   10   11   12   13   14   15   ...   22


    написать администратору сайта