Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
35
Добавлен:
11.04.2015
Размер:
849.92 Кб
Скачать

3.4.5. Неявное определение функций (Implicit Function Definitions)

Синтаксис:

implicit_function_def ::=

opt-comment-string single_typing formal_function_application

post_condition opt-pre_condition

Контекст и правила видимости. В определении implicit_function_def контекстом конструкции formal_function_application является постусловие post_condition и необязательное предусловие opt-pre_condition.

Контекстные условия. Связываниеbindingв указании типаsingle_typingдолжно быть идентификатором или операциейid_or_op(т.е. декартово произведениеproduct_bindingне допускается).

Если метапеременная id_or_opв конструкцииsingle_typingявляется идентификаторомid, то в качестве значения метапеременнойformal_function_applicationдолжно использоватьсяid_applicationэтого идентификатораid. Еслиid_or_opвsingle_typingявляется префиксной операциейprefix_op, то в качестве значения метапеременнойformal_function_applicationдолжно использоватьсяprefix_applicationэтой операцииprefix_op. И наконец, еслиid_or_opвsingle_typingявляется инфиксной операциейinfix_op, то значением метапеременнойformal_function_applicationдолжно бытьinfix_applicationэтой операцииinfix_op.

Максимальным типом конструкции single_typingдолжен быть функциональный тип. Если значением метапеременнойformal_function_applicationявляетсяinfix_application, то параметрическая часть функционального типа должна представлять собой декартово произведение двух типов. Если значением метапеременнойformal_function_applicationявляетсяid_application, то функциональный тип должен быть сформирован с использованием по крайней мере такого количества типов (все эти типы указываются перед функциональной стрелкой или), сколько формальных параметровformal_function_parameterуказано в определении данной функции.

Это означает, что существуют следующие три допустимые формы неявного определения функции:

id : type_expr1 opt-access_desc-string1 type_expr2

opt-access_desc-stringn type_exprn+1

id(opt-binding-list1)(opt-binding-list2)…(opt-binding-listm)

post_condition opt-pre_condition (m  n)

prefix_op : type_expr1 opt-access_desc-string type_expr2

prefix_op id post_condition opt-pre_condition

infix_op : type_expr1  type_expr2 opt-access_desc-string type_expr3

id1 infix_op id2 post_condition opt-pre_condition

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

Конструкции post_conditionиopt-pre_conditionмогут только статически обращаться по чтению к тем переменным и каналам, которые указаны в описаниях статического доступаoptaccess_desc-string1optaccess_descstringmв первой из вышеприведенных форм и в описаниях статического доступаoptaccess_descstring в двух последних формах.

Контекстно-зависимые расширения. Неявное определение функцииimplicit_function_defявляется краткой формой для определения значения и аксиомы, причем конкретный вид этой формы зависит от вида конструкцииformal_function_application.

Пусть метафункции maximal и express определены так же, как в предыдущем разделе. Тогда если в качестве значения метапеременной formal_function_application используется id_application с единственным формальным параметром formal_function_parameter, то неявное определение функции implicit_function_def вида:

value

id : type_expr1  …  type_exprn opt-access_desc-string type_exprn+1

id(binding1,…,bindingn) post_condition opt-pre_condition

где n  1, является краткой формой следующих определений:

value

id : type_expr1  …  type_exprn opt-access_desc-string type_exprn+1

axiom

 binding1 : maximal(type_expr1),…, bindingn : maximal(type_exprn) •

id(express(binding1),…,express(bindingn)) post_condition opt‑pre_condition

Если список связываний binding1,…,bindingn пуст, то выражение type_expr1  …  type_exprn должно быть Unit и использовать квантор не нужно.

Здесь так же, как и в случае явного определения функции диапазон значений каждого формального параметра bindingi шире максимального типа соответствующего формального параметра type_expri .

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

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

Если в качестве значения метапеременной formal_function_application используется prefix_application, то неявное определение функции implicit_function_def вида:

value

prefix_op : type_expr1 opt-access_desc-string type_expr2

prefix_op id post_condition opt-pre_condition

является краткой формой определений:

value

prefix_op : type_expr1 opt-access_desc-string type_expr2

axiom

 id : maximal(type_expr1) •

prefix_op id post_condition opt-pre_condition

В данном случае диапазон значений формального параметра id шире максимального типа соответствующего формального параметра type_expr1.

Аналогичное расширение имеет место для функциональной стрелки .

Если в качестве значения метапеременной formal_function_application используется infix_application, то неявное определение функции implicit_function_def вида:

value

infix_op : type_expr1  type_expr2 opt-access_desc-string type_expr3

id1 infix_op id2 post_condition opt-pre_condition

является краткой формой для определений:

value

infix_op : type_expr1  type_expr2 opt-access_desc-string type_expr3

axiom

 id1 : maximal(type_expr1),id2 : maximal(type_expr2)•

id1 infix_op id2 post_condition opt-pre_condition

Здесь каждый формальный параметр idi диапазоном своих значений превосходит максимальный тип соответствующего формального параметра type_expri.

Аналогичное расширение справедливо для функциональной стрелки .

3.5. Объявление переменных (Variable Declarations)

Синтаксис:

variable_decl ::=

variable variable_def-list

variable_def ::=

single_variable_def │

multiple_variable_def

single_variable_def ::=

opt-comment-string id : type_expr opt-initialisation

initialisation ::=

:= pure-value_expr

multiple_variable_def ::=

opt-comment-string id-list2 : type_expr

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

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

Определение переменной single_variable_defявляетсяциклическим, если максимальный тип выраженияtype_exprзависит от переменной, которая сама задается этим определениемsingle_variable_def.

Максимальный тип зависит от переменнойv, если он ссылается наvили на любую другую переменную или канал, чей максимальный тип зависит отv.

Контекстно-независимые расширения. Множественное определение переменныхmultiple_variable_defесть краткая запись двух или более определений каждой отдельной переменной, т.е. определение переменныхmultiple_variable_defвида:

variable id1, … ,idn : type_expr

является краткой формой для определений:

Соседние файлы в папке ТРПО