Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Файлы для подготовки к экзамену / Архитектура компьютеров и ВС, принципы параллельного программирования.doc
Скачиваний:
71
Добавлен:
28.06.2014
Размер:
1.26 Mб
Скачать

3.4.1.2. Задание данных и базисных функций

Данные в общем случае представляют собой множества кортежей одинаковой длины. С теоретической точки зрения, данные в языке представляются как (0, m)-арные, m0, d-отношения. Определение данных осуществляется путем замыкания операций композиции,,,и оператора наименьшей фиксированной точки над непустым множеством конструкторов. Каждое определяемое множество данных относится к определенному типу данных, который характеризуется в некотором смысле и общей структурой построения этого множества и используемыми при этом конструкторами. Идентификация типа данных осуществляется путем однозначного сопоставления ему имени.

Отметим, что операция  на данных (при определении абстрактных типов данных, которые представляются как (0, m)-арные d-отношения), равносильна операции декартова произведения; операция  по-прежнему имеет интерпретацию теоретико-множественного объединения.

Пусть – множество символов конструкторов и– множество символов парных им деструкторов. С каждым конструктором сi и деструктором связана их арность: (ni, 1) и (1, ni) соответственно.

Конструкторы и деструкторы интерпретируются как функциональные d-отношения на эрбрановском универсуме – индуктивном классе DC:

  1. если арность ci есть (0, 1), то ciDC;

  2. если ci имеет арность (ni, 1), ni>0, то ci12…nDC1 для любых iDC, i = 1, 2, …, ni;

  3. других элементов, кроме определенных в п. 1 и 2 в DC нет.

Введем интерпретацию конструкторов:

и

.

Легко видеть, что конструкторы – всюду определенные функции на DC, а деструкторы в общем случае – частичные функции, обратные функциям, сопоставляемым конструкторам.

Множество DC представимо в языке в виде наименьшей фиксированной точки реляционного уравнения:

.

Более того, можно расширить сигнатуру операций композиции d-отношений путем добавления к ней унарной операции взятия обратного отношения:

.

Рассмотрим множество базисных функций , где INT – натуральный ряд чисел, m>0, 1im, .

Можно показать, что на DC теперь выразима любая вычислимая функция при условии, что C содержит хотя бы один (0, 1)-арный конструктор и хотя бы один (m, 1)-арный конструктор для m>0.

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

> (функция-нуллификатор): , где (ni, 1) – арность конструктора ci;

 (тождественная функция): ;

> (функция равенства или на DC – тождества кортежей длины n):

(первое уравнение говорит о том, что кортежи равны, если равны их соответствующие элементы; второе уравнение утверждает, что два элемента множества DC равны, если они тождественны);

>/– (функция неравенства кортежей длины n):

.

Эти функции имеют интерпретацию:

>,

,

>,

>– /–, где n>0;

для n = 0 график первых трех функций есть {((, ()}, у последней он пуст.

Аналогично можно определить комбинаторное функциональное d-отношение:

<, n>0 и для n=0<.

Определимость в языке функции > позволяет исключить операцию композиции функций  (условие), как зависящую операцию:  =   >.

Кроме того, операция взятия обратного отношения становится конструктивной и для всякого определения d-отношения может быть «опущена» на уровень базисных функций путем использования следующих правил [7]:

  1. ;

(>), где1 и 2 имеют арности (n, n1) и (n, n2) соответственно.

  1. Пусть Xi = i, i = 1, 2, …, k; обратным для X1 (не нарушая общности, положим, что в этой системе уравнений нас интересует X1) является наименьшее решение для системы уравнений, i = 1, 2, …, k, где.

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

Очевидно, что любая пара деструкторов ипри ij представляет пару ортогональных функций. Полагая, что арности ci и cj одинаковы, отношение будет функциональным. Также, если1 и 2 – ортогональные функции, а 3 и 4 – произвольные функциональные композиции, то 13 и 24, 13 и 24, 13 и 24 являются парами ортогональных функций. Очевидно, что если в представлении 12…k, k>1, функциональные композиции i и j, ij, попарно ортогональны или совместны, то отношение  является функциональным.

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

Пример.

Определим в языке натуральный ряд чисел следующим образом:

, где o и succ (0, 1)-арный и (1, 1)-арный конструкторы с графиками: ,, где C = {o, succ}.

Обратным для NAT является разрешимый предикат принадлежности DC:

.

Если определить аппликацию для функций-деструкторов o-1 и succ-1 в форме:

,

и рассматривать  как вычислимое неопределенное значение, то

, где – наименьшее решение для PNAT в его определении выше.

Пример.

Для иллюстрации задания функций рассмотрим определение в языке функции умножения на NAT:

Для ясности здесь указаны арности определяемых функций Fум и Fсл; очевидно их тип принадлежит множеству отображений NATNATNAT.

Как только указаны типы базисных функций (в данном примере это функции o: {}NAT, succ: NATNAT, : ‘t‘t‘t, i = 1, 2, где ‘t – произвольный тип, тип определяемых функций Fум и Fсл может быть выведен путем реконструкции типов правых частей их определений в уравнениях выше согласно согласованию типов для операций композиции и решению типовых уравнений, вытекающих из этих уравнений. Таким образом построен алгоритм типового контроля в разработанном языке функционального параллельного программирования

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

По аналогичным соображениям эффективности реализации в язык включены механизмы импортирования функций из других, в том числе, последовательных языков программирования (C, C++, Java и др.), что естественно, существенно расширяет возможности задания «базисных» функций, а сам языке превращается в некотором смысле в полиязычную систему программирования.