рефераты конспекты курсовые дипломные лекции шпоры

Реферат Курсовая Конспект

Процессы

Процессы - раздел Программирование, Предикатное программирование Для Большинства Программ Можно Построить Спецификацию В Виде Предусловия И По...

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

ОПРЕДЕЛЕНИЕ-ПРОЦЕССА ::=

process ИМЯ-ПРОЦЕССА [( [ОПИСАНИЯ-АРГУМЕНТОВ] :

ОПИСАНИЯ-РЕЗУЛЬТАТОВ-ГИПЕРФУНКЦИИ )]

{ ТЕЛО-ПРОЦЕССА [МЕТКА :]}

[spec ВНЕШНЯЯ-СПЕЦИФИКАЦИЯ-ПРОЦЕССА]

ИМЯ-ПРОЦЕССА ::= ИДЕНТИФИКАТОР

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

ВНЕШНЯЯ-СПЕЦИФИКАЦИЯ-ПРОЦЕССА описывает эффект функционирования процесса на внешнее окружение, в рамках которого существует процесс. В общем случае этот эффект невозможно выразить с помощью предусловия и постусловия. В качестве языков внешней спецификации процессов ранее использовались язык алгебры процессов CCS [8] Р. Милнера и язык спецификации TLA+ [9] Л. Лампорта. Язык внешней спецификации в данном документе не фиксируется. Наиболее адекватным и проработанным представляется язык SAL [10].

ТЕЛО-ПРОЦЕССА ::= ОПИСАНИЕ-ПЕРЕМЕННЫХ [; ТЕЛО-ПРОЦЕССА] |

ВОЗМОЖНО-ПОМЕЧЕННЫЙ-ОПЕРАТОР [; ТЕЛО-ПРОЦЕССА]

ВОЗМОЖНО-ПОМЕЧЕННЫЙ-ОПЕРАТОР ::= [МЕТКА :] ОПЕРАТОР

Переменные и метки, описанные в теле процесса, считаются локальными в данном процессе. Описания и операторы блока исполняются в порядке их следования. Оператор перехода изменяет последовательность выполнения. Допускаются циклы в теле процесса.

Языковые конструкции ОПЕРАТОР, ПЕРВИЧНОЕ-ВЫРАЖЕНИЕ и ИДЕНТИФИКАЦИЯ-ПРЕДИКАТА, определенные выше, имеют доопределение для процессов.

ИДЕНТИФИКАЦИЯ-ПРЕДИКАТА ::= ... | [ОБЪЕКТ-КЛАССА .] ИМЯ-ПРЕДИКАТА

ОБЪЕКТ-КЛАССА ::= ПЕРВИЧНОЕ-ВЫРАЖЕНИЕ

Конструкция ИДЕНТИФИКАЦИЯ-ПРЕДИКАТА используется в вызове предиката для указания вызываемого предиката.

ОПЕРАТОР-РАБОТЫ-С-ПРОЦЕССАМИ ::=

ВЫЗОВ-ПРОЦЕССА | ЗАПУСК-НЕЗАВИСИМОГО-ПРОЦЕССА |

ПАРАЛЛЕЛЬНАЯ-КОМПОЗИЦИЯ-ПРОЦЕССОВ | ПРИЕМ-СООБЩЕНИЯ |

ПОСЫЛКА-СООБЩЕНИЯ | ЗАЩИЩЕННЫЙ-ОПЕРАТОР | ОПЕРАТОР-ПЕРЕХОДА

ВЫЗОВ-ПРОЦЕССА ::=

[ ОБЪЕКТ-КЛАССА . ] ИМЯ-ПРОЦЕССА ( [АРГУМЕНТЫ] (: РЕЗУЛЬТАТЫ-ВЕТВИ)*] )

ОБЪЕКТ-КЛАССА ::= ПЕРВИЧНОЕ-ВЫРАЖЕНИЕ

Процесс, запускаемый на исполнение ВЫЗОВОМ-ПРОЦЕССА, должен иметь соответствующее определение процесса. Если определение процесса принадлежит некоторому классу, то вызов процесса реализуется через ОБЪЕКТ-КЛАССА.

ПАРАЛЛЕЛЬНАЯ-КОМПОЗИЦИЯ-ПРОЦЕССОВ ::= ПАРАЛЛЕЛЬНЫЙ-ОПЕРАТОР

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

ОПИСАНИЕ-СООБЩЕНИЯ ::= message ИМЯ-СООБЩЕНИЯ [( СПИСОК-ТИПОВ )] |

queue ИМЯ-СООБЩЕНИЯ [( СПИСОК-ТИПОВ )]

ИМЯ-СООБЩЕНИЯ ::= ИДЕНТИФИКАТОР

СПИСОК-ТИПОВ ::= ИЗОБРАЖЕНИЕ-ТИПА [, СПИСОК-ТИПОВ]

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

ПОСЫЛКА-СООБЩЕНИЯ ::=

ИМЯ-ПРОЦЕССА> ! ИМЯ-СООБЩЕНИЯ [( СПИСОК-ВЫРАЖЕНИЙ )] |

ИМЯ-СООБЩЕНИЯ ! [( СПИСОК-ВЫРАЖЕНИЙ )]

Оператор посылает сообщение с набором значений, вычисленных СПИСКОМ-ВЫРАЖЕНИЙ. Если сообщение определено описанием message, то выполнение оператора не будет завершено до тех пор, пока это сообщение не будет принято получателем. Для сообщения, определенного описанием queue, оператор вставляет сообщение в конец очереди посланных сообщений и завершает свою работу.

ПРИЕМ-СООБЩЕНИЯ ::= receive СООБЩЕНИЕ |

ПРИЕМ-СООБЩЕНИЯ-ОБЩЕГО-ВИДА

СООБЩЕНИЕ ::= ИМЯ-СООБЩЕНИЯ [(СПИСОК-ПЕРЕМЕННЫХ )]

Допустим, что процесс, исполняющий оператор receive СООБЩЕНИЕ, получил сообщение с именем, указанным в операторе. Исполнение оператора заключается в присваивании перечисленным переменным соответствующих значений, поставляемых сообщением. Если исполняемый процесс не получил сообщения с указанным именем, то исполнение оператора приостанавливается (блокируется) до поступления требуемого сообщения.

ПРИЕМ-СООБЩЕНИЯ-ОБЩЕГО-ВИДА ::= receive { СООБЩЕНИЕ : ОПЕРАТОР

( or СООБЩЕНИЕ : ОПЕРАТОР )*

[ after ВРЕМЯ-ОЖИДАНИЯ : ОПЕРАТОР ]

}

ВРЕМЯ-ОЖИДАНИЯ ::= ВЫРАЖЕНИЕ

В результате выполнения оператора общего вида реализуется прием одного из указанных сообщений: того, которое приходит первым. При этом соответствующим переменным присваиваются значения параметров сообщения. Далее исполняется ОПЕРАТОР, следующий за «:» после пришедшего сообщения. Оператор общего вида также является блокирующим: исполнение текущего процесса приостанавливается до поступления любого из указанных сообщений. Если в операторе присутствует подконструкция after, то ожидание поступления одного из перечисленных сообщений ограничено по времени. Время ожидания имеет тип nat и определяет значение времени в миллисекундах, по истечении которого срабатывает
ОПЕРАТОР, указанный завершителем after.

ПЕРВИЧНОЕ-ВЫРАЖЕНИЕ ::= ... | СООБЩЕНИЕ

Конструкция СООБЩЕНИЕ в любой позиции логического выражения трактуется как неблокирующий прием сообщений. Исполнение конструкции осуществляется следующим образом. В очереди пришедших сообщений исполняемого процесса ищется сообщение с именем, указанным в конструкции СООБЩЕНИЕ. Если сообщение обнаружено, оно вычеркивается из очереди. При этом значения параметров присваиваются соответствующим переменным, перечисленным в круглых скобках. Результатом исполнения конструкции СООБЩЕНИЕ является значение true. Если требуемое сообщение не обнаружено в очереди, исполнение конструкции СООБЩЕНИЕ завершается значением false.

Динамическое создание нового процесса и его запуск реализуется через объект класса. Объект (или значение) типа "класс" является структурой, составленной из полей класса. Описание класса определяется следующим образом:

ОПРЕДЕЛЕНИЕ-КЛАССА ::=

class ИМЯ-КЛАССА [extends ИМЯ-СУПЕРКЛАССА] { ТЕЛО-КЛАССА }

ИМЯ-КЛАССА ::= ИДЕНТИФИКАТОР

ТЕЛО-КЛАССА ::= ОПИСАНИЕ-КЛАССА [; ТЕЛО-КЛАССА]

ОПИСАНИЕ-КЛАССА ::=

ОПИСАНИЕ-ТИПА | ОПИСАНИЕ-ПЕРЕМЕННЫХ | ОПИСАНИЕ-СООБЩЕНИЯ |

ОПРЕДЕЛЕНИЕ-ПРОЦЕССА | ОПРЕДЕЛЕНИЕ-ПРЕДИКАТА |

ОПИСАНИЕ-КОНСТРУКТОРА-КЛАССА

ОПИСАНИЕ-КОНСТРУКТОРА-КЛАССА ::=

ИМЯ-КЛАССА ([<ОПИСАНИЯ-АРГУМЕНТОВ>]) { ТЕЛО-КОНСТРУКТОРА }

ТЕЛО-КОНСТРУКТОРА ::= [ ТЕЛО-БЛОКА ]

Доступ к элементу класса вне описания класса реализуется через объект класса, т. е. конструкцией объект.имя, где имя - имя элемента класса. Доступ к элементу класса в теле класса осуществляется непосредственно по имени элемента. Для обозначения объекта, определяемого данным классом, используется имя this.

Отметим, что классы не интегрированы с системой типов языка P.

ПЕРВИЧНОЕ-ВЫРАЖЕНИЕ ::= ... | СОЗДАНИЕ-ОБЪЕКТА

СОЗДАНИЕ-ОБЪЕКТА ::= new ИМЯ-КЛАССА ( [<АРГУМЕНТЫ>] )

Операция СОЗДАНИЯ-ОБЪЕКТА реализует вызов конструктора, параметры которого соответствуют списку аргументов. Результатом операции является новый объект (значение) типа ИМЯ-КЛАССА. При исполнении конструктора создается объект - структура, полями которой являются переменные, описанные в теле класса. Для созданного объекта исполняются ОПИСАНИЯ-ПЕРЕМЕННЫХ, находящиеся в теле класса и содержащие инициализацию переменных. Далее исполняется тело конструктора.

Если для операции new ИМЯ-КЛАССА( ) нет соответствующего конструктора с пустым списком аргументов, то такой конструктор считается определенным и его тело пусто.

ИМЯ-СУПЕРКЛАССА ::= ИМЯ-КЛАССА

При наличии подконструкции extends ИМЯ-СУПЕРКЛАССА определяемый класс является расширением суперкласса, представленного описателем extends. Структура, создаваемая для определяемого класса, содержит поля суперкласса, за которыми следуют поля определяемого класса. Конструктор класса содержит явный или неявный вызов соответствующего конструктора для суперкласса.

ПЕРВИЧНОЕ-ВЫРАЖЕНИЕ ::= ... | ДИНАМИЧЕСКОЕ-СОЗДАНИЕ-ПРОЦЕССА

 

ДИНАМИЧЕСКОЕ-СОЗДАНИЕ-ПРОЦЕССА ::=

new ИМЯ-ПРОЦЕССА ( [<АРГУМЕНТЫ>] )

Данная операция реализует создание нового независимого процесса и его запуск на исполнение. Процесс с указанным именем должен быть элементом некоторого класса. В начале тела процесса находится явный или неявный вызов конструктора класса. При исполнении операции new срабатывает вызов конструктора в начале тела процесса. Результатом вызова конструктора является новый объект класса. Далее создается новый процесс и запускается на исполнение параллельно с текущим исполняемым процессом. Программой созданного процесса является тело процесса, а глобальными данными - поля созданного объекта. На этом исполнение операции new завершается. Ее результатом является созданный объект. Текущий процесс продолжает исполняться параллельно с созданным процессом. Объект, являющийся результатом операции new, используется в качестве указателя созданного процесса в операторах обмена сообщениями.

ЗАЩИЩЕННЫЙ-ОПЕРАТОР ::=

with СПИСОК-РАЗДЕЛЯЕМЫХ-ПЕРЕМЕННЫХ { ОПЕРАТОР }

СПИСОК-РАЗДЕЛЯЕМЫХ-ПЕРЕМЕННЫХ ::= СПИСОК-ПЕРЕМЕННЫХ

Взаимодействие между параллельными процессами возможно через разделяемые переменные, доступные для нескольких процессов и являющиеся глобальными по отношению к ним. Доступ к разделяемым переменным разрешен только внутри защищенного оператора. При исполнении ОПЕРАТОРА доступ к перечисленным разделяемым переменным блокируется. Блокировка снимается при завершении исполнения ОПЕРАТОРА. Если при попытке исполнить ЗАЩИЩЕННЫЙ-ОПЕРАТОР одна из разделяемых переменных оказалась блокирована другим процессом, исполнение текущего процесса, исполняющего ЗАЩИЩЕННЫЙ-ОПЕРАТОР, приостанавливается до момента снятия блокировки с разделяемой переменной.

– Конец работы –

Эта тема принадлежит разделу:

Предикатное программирование

Новосибирский государственный университет.. факультет информационных технологий..

Если Вам нужно дополнительный материал на эту тему, или Вы не нашли то, что искали, рекомендуем воспользоваться поиском по нашей базе работ: Процессы

Что будем делать с полученным материалом:

Если этот материал оказался полезным ля Вас, Вы можете сохранить его на свою страничку в социальных сетях:

Все темы данного раздела:

Новосибирск
  УДК 004.432.42 ББК 22.183.492 Ш 427   Шелехов В. И. Предикатное программирование: Учеб. пособие / Новосиб. гос. ун-т. Новосибирск, 2009

Язык исчисления вычислимых предикатов,
его логическая и операционная семантика .......................................................... 27 4.1. Структура программы на языке CCP ...............................

Семантика языка предикатного программирования.
Методы доказательства корректности предикатных программ ...................... 47 5.1. Язык P1: подстановка определения предиката на место вызова .........................

Общее понятие программы
Понятие программы обычно определяется в контексте некоторого языка программирования. Представление об общем понятии программы, абстрагированное от конкретного языка программирования, для специалист

Автоматическая вычислимость
Развитие средств вычислений сопровождается все большей степенью автоматизации вычислений. Потребность в проведении сложных и длительных расчетов привела человека к необходимости создания и совершен

Спецификация программы
Для определения связи программы со своей спецификацией рассмотрим следующую модель применения программы (рис. 1). Вычисление по программе является необходимым звеном в цепочке действий некоторого р

Формы спецификации программы
Распространена точка зрения, что спецификацию программы можно представить в виде функции. Поскольку это не всегда так, возникает вопрос о классификации форм, которые может принимать спецификация пр

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

Предикатная спецификация программы
Уточним и дополним понятие предикатной спецификации, определенное в разд. 1.2. Рассмотрим следующую простую схему взаимодействия программы с окружением: ввод входных данных происходит перед началом

Логическая семантика языка программирования
Всякая программа содержит логику. Это, например, бизнес-логика, извлекаемая нетривиальным анализом из текста программы в процессе реинжиниринга программы [16]. Это также логические формулы, получае

Модель корректности программы
Рассмотрим программу с предикатной спецификацией на языке, для которого можно построить логическую семантику. Программа со спецификацией представляется в виде тройки Хоара: {P(x)} S {Q(x,

Система правил вывода программы из спецификации
Понятие корректности программы, введенное в разд. 2.3, состоит из трех условий (2.7–2.9). Главным из них является условие (2.7) соответствия программы и спецификации, согласно которому постусл

Однозначность предикатов
Предикат H(x, y) является однозначным в области X для набора переменных x, если он определяет функцию, отображающую значения набора x в значения набора y. Должно быть истинным следующее усло

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

Отношения порядка
R называется бинарным отношением на множестве D, если R Í D ´ D. Утверждение (a, b) Î R принято записывать в виде a R b. Для произвольного отношения R используются следующ

Наименьшая неподвижная точка
Далее будем считать, что (D, ⊑, ⊥) – полная решетка с наименьшим элементом, т. е. "a Î D. ⊥⊑ a. Пусть F: D→D - произвольная тотальная (т. е. всюду

Математическая индукция
Математическая индукция – это метод доказательства некоторого утверждения P(n) для всех значений натурального параметра n; n = 0, 1, 2, … . Доказательство проводится по следующей схеме.

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

Структура программы на языке CCP
Язык CCP (Calculus of Computable Predicates) - язык исчисления вычислимых предикатов, определяющий множество вычислимых формул исчисления предикатов. К языку предъявляются два требования: по

Система типов данных
Любая переменная характеризуется некоторым типом. Язык CCP является бестиповым в том смысле, что типы переменных не указываются в программе, однако их можно однозначно определить по программе. Сист

Логическая и операционная семантика языка CCP
Логическая семантика есть функция LS, сопоставляющая каждой конструкции S языка CCP некоторую формулу LS в исчислении предикатов, т. е. LS(S) = LS. Пусть j(d:

Семантика вызова предиката
Пусть имеется вызов предиката A(z:u) . (4.12) Здесь A есть имя предиката или имя переменной предикатного типа; z - возможно пустой набор имен переменных; u - непу

Конструктор предиката
Конструктор предиката является базисным предикатом ConsPred(x, B: A), где x - возможно пустой набор переменных; B - имя предиката; A - имя переменной предикатного типа. Значением п

Конструктор массива
Конструктор массива является базисным предикатом ConsArray(x, B: A), где x - возможно пустой набор переменных, B - имя предиката, отличное от ConsPred и ConsArray. Значением переме

Программа
Программа на языке CCP состоит из конечного набора определений предикатов. Для каждого определения правой частью является оператор суперпозиции (4.16), параллельный оператор (4.19) или услов

Рекурсивные определения предикатов
Для определяемых предикатов B и C отношение depend(B, C) обозначает непосредственную зависимость B от C, если в правой части определения B имеется вызов предиката C. Предикат B определяет

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

Методы доказательства корректности рекурсивных программ
Рассмотрим следующую конкретизацию системы (4.36) определений рекурсивного кольца предикатов A1, A2,…, An: Aj(t, xj:

Лексемы
Текст программы представлен в виде последовательности строк символов. Переход на новую строку эквивалентен символу «пробел». Программа может содержать комментарии, текст которых считается не принад

Определение предиката
ОПРЕДЕЛЕНИЕ-ПРЕДИКАТА ::= ИМЯ-ПРЕДИКАТА ОПИСАНИЕ-ПРЕДИКАТА ИМЯ-ПРЕДИКАТА ::= ИДЕНТИФИКАТОР Значением ОПИСАНИЯ-ПРЕДИКАТА является предикат, обозначаемый именем предиката.

Спецификация предиката
Предикат, используемый в программе, должен иметь определение предиката. Если предикат определяется в другом модуле программы, то предикат может быть представлен своей спецификацией. СПЕЦИФ

Вызов предиката
Элементарным оператором программы является вызов предиката. ВЫЗОВ-ПРЕДИКАТА ::= ВЫЗОВ-ПРЕДИКАТА-ФУНКЦИИ | ВЫЗОВ-ПРЕДИКАТА-ГИПЕРФУНКЦИИ ВЫЗОВ-ПРЕДИКАТА-ФУНКЦИИ ::=

Программа
Программа состоит из одного или нескольких модулей. Модуль определяет независимую часть программы. ОПИСАНИЕ-МОДУЛЯ ::= [ЗАГОЛОВОК-МОДУЛЯ] СПИСОК-ОПИСАНИЙ ЗАГОЛОВОК-МОДУЛЯ ::=

Выражения
ПЕРВИЧНОЕ-ВЫРАЖЕНИЕ ::= КОНСТАНТА | ПЕРЕМЕННАЯ | АГРЕГАТ | ИМЯ-ПРЕДИКАТА | ГЕНЕРАТОР-ПРЕДИКАТА | ВЫЗОВ-ФУНКЦИИ | ( ВЫРАЖЕНИЕ ) | ИМЯ-ТИПА |

Описание типа массива
ИЗОБРАЖЕНИЕ-ТИПА-МАССИВА ::= array ( ИЗОБРАЖЕНИЕ-ТИПА-ЭЛЕМЕНТА , ИЗМЕРЕНИЯ-МАССИВА ) ИЗОБРАЖЕНИЕ-ТИПА-ЭЛЕМЕНТА ::= ИЗОБРАЖЕНИЕ-Т

Вырезка массива
ВЫРЕЗКА-МАССИВА ::= ВЫРАЖЕНИЕ-МАССИВ [ СУЖЕННЫЙ-НАБОР-ТИПОВ-ИНДЕКСОВ ] ВЫРАЖЕНИЕ-МАССИВ ::= ВЫРАЖЕНИЕ СУЖЕННЫЙ-НАБОР-ТИПОВ-ИНДЕКСОВ ::=

Определение массива
ОПРЕДЕЛЕНИЕ-МАССИВА ::= ОПРЕДЕЛЕНИЕ-ИНДЕКСОВ ОПРЕДЕЛЕНИЕ-ЭЛЕМЕНТА-МАССИВА | АГРЕГАТ-МАССИВ | ОПРЕДЕЛЕНИЕ-МАССИВА-ПО-ЧАСТЯМ ОПРЕДЕЛЕНИЕ-МАССИВА-ПО-ЧАСТЯМ ::=

Объединение массивов
Операндами операции «+» объединения массивов: ВЫРАЖЕНИЕ-МАССИВ + ВЫРАЖЕНИЕ-МАССИВ являются выражения, значениями которых являются массивы. Объединяемые массивы до

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

Императивное расширение
Императивное расширение языка P определяет дополнительные языковые конструкции, возникающие в программе в результате проведения трансформаций предикатной программы (см. введение). Использование эти

Технология предикатного программирования
Типичный способ реализации языка программирования заключается в реализации транслятора с языка программирования на язык команд целевой ЭВМ или на некоторый другой реализованный язык программировани

Подстановка определения предиката на место вызова
Пусть A(x: y) { S } - определение предиката на императивном расширении языка P, а A(e: z) - вызов предиката в теле некоторого другого предиката B. Здесь x, y, z обозначают списки переменных, а e -

Замена хвостовой рекурсии циклом
Подстановка определения нерекурсивного предиката на место вызова является эффективной при наличии в программе одного вызова. Подстановка определения рекурсивного предиката усложняет программу и поэ

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

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

Трансформация кодирования структурных объектов
Трансформация кодирования структурных объектов реализует представление используемых в программе структурных типов (списков, деревьев и др.) посредством структур более низкого уровня, таких к

Гиперфункции
Пример 7.2. Допустим, для списка s целых чисел требуется извлечь второй элемент и присвоить переменной e. Список может содержать менее двух элементов. Логическая переменная exist =

Else break
} } }; Подставим определения предикатов взятьЧисло и перваяЦифра на место вызовов. Проведем очевидные упрощения. Сумма(string s, nat

Else break
} }; Далее, поскольку внутренний цикл в теле предиката Сумма не имеет нормального выхода, можно заменить оператор #2 на break и убрать скобки оператора продолжени

Else break
} n = n + v } } На четвертом этапе применяется трансформация кодирования строки s вырезкой массива. При этом разные значения списка s представляются вырезками од

Else break
} n = n + v } Можно обнаружить следующий недостаток программы (7.39): если строка s завершается цифрой, то проверка исчерпания строки реализуется

Хотите получать на электронную почту самые свежие новости?
Education Insider Sample
Подпишитесь на Нашу рассылку
Наша политика приватности обеспечивает 100% безопасность и анонимность Ваших E-Mail
Реклама
Соответствующий теме материал
  • Похожее
  • Популярное
  • Облако тегов
  • Здесь
  • Временно
  • Пусто
Теги