Язык "Concurrent Prolog". Язык " *Lisp" ( "Star-Lisp")


Язык "Concurrent Prolog" является расширением логического языка "Prolog" и предназначен для параллельного программирования логических систем. В соответствии с тремя основными логическими операциями (унификация, "и"-объединение "and", "или"-объединение "or") в языке "Concurrent Prolog" имеются три возможных способа параллельной обработки предложений:

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

б) "и" ("and")–параллельность, при которой логические предложения (в правилах или запросах) объединяются логической операцией "i" и могут оцениваться параллельно, если они не зависят друг от друга, т.е. если они не содержат совместных свободных переменных;

в) "или" ( "or")–параллельность, при которой несколько правил или фактов, относящихся к одному и тому же предложению (логическому выражению), могут обрабатываться одновременно.

В языке "Concurrent Prolog" логическое предложения разделяется на две группы: Guard и Body, которые разделяются Commit-оператором:
A G1 … Gm | B1 … Bn ( m, n > 0)
Goal Guard Commit Body

Применение "or"– параллельности допускается только в пределах группы Guard. Первая успешно обработанная группа Guard выполняет Commit-операцию и останавливает ею все другие "or"– параллельные процессы.

Группа Body обрабатывается "i"–параллельно в пределах, допустимых с точки зрения синхронизации взаимозависимых логических предложений, которая обеспечивается с помощью так называемых "read-only" - переменных, обозначаемых знаком вопроса "?". Процесс, обратившийся с целью чтения к "read-only"-переменной, которая в этот момент еще не определена, блокируется до тех пор, пока эта переменная синхронизации получит определение от другого предложения-процесса.

Ниже приведен пример использования языка "Concurrent Prolog" при программировании скалярного произведения (каждый оператор записывается в отдельной строке):
Вызов программы: s_prod ( [1,2,3], [4,5,6], SP). Þ SP=32
s_prod ( [ ], [ ], 0 ):- | s_prod ( [H1 | T1], [H2 | T2 ], X ):- |
X:= H1* H2 + Rest?, s_prod ( T1?, T2?, Rest ).

В этом примере Commit-оператор предотвращает ненужный поиск альтернативного предложения (ограничения "or"– параллельности), поскольку здесь нет множества предложений с одинаковым заголовком. Оба предложения (присвоения и рекурсивного вызова) выполняются параллельно, причем операция присвоения должна подождать, пока ее переменная синхронизации Rest? не примет числового значения от рекурсивного вызова процедуры s_prod.

Язык " *Lisp" ( "Star-Lisp"). Язык "*Lisp" ( "Star-Lisp") базируется на языке "Common Lisp" и содержит следующие параллельные конструктивы, встроенные в "Lisp"-среду:
а) параллельные системные функции с префиксом "*" в скалярной или векторной версиях;
б) параллельные операторы с суффиксом "!!" в скалярной или векторной версиях;
в) функции def-vp-set ("define virtual processor set") совместно с машинно-зависимой функцией greate-geometry, позволяющие выделять из общих процессорных структур определенные группы (многомерные блоки) программных элементов (ПЭ).

Собственный номер каждого ПЭ может быть получен с помощью таких функций:
self!! – выдает адресный объект, который охватывает все размерности декларированной решетки;
self_adress!! - выдает "адрес отправителя" для каждого ПЭ;
self_address_grid!!(!!n) - выдает адресный объект только для n-мерной решетки;

Для локальной передачи данных через быструю решетчатую структуру используется конструктив *news, который выполняет локальный обмен данными вдоль решетки между выражением-источником и целевой переменной величиной. Конструктив news!! возвращает назад "локально перемещенные" данные выражения-источника.

Для глобальной передачи данных через медленный маршрутизатор применяется конструктив *pset, выполняющий глобальный обмен данными между отправителем и целевой переменной величиной, а также конструктив pref!, который возвращает назад "глобально обмененные" данные отправителя.

Редукция вектора в скаляр осуществляется с помощью стандартных функций:
*and *or *xor *logand *logior *logxor *sum *min *max *integer-lehgth

Индикация булевого численного значения всех физических ПЭ осуществляется с помощью функции *light.

Ниже приведен пример использования языка "*Lisp" при программировании оператора Лапласа (каждый оператор "*Lisp" записывается в отдельной строке):
(def-vp-set grid ’ (100) (100)) (*defvar pixel)
( with vp-set grid) (*setpixel (-!! (*!!pixel (!! 4))
(news!!pixel 0 1) (news!!pixel 0 -1) (news!! pixel 1 0) (news!! pixel -1 0))))



Дата добавления: 2023-01-28; просмотров: 258;


Поиск по сайту:

Воспользовавшись поиском можно найти нужную информацию на сайте.

Поделитесь с друзьями:

Считаете данную информацию полезной, тогда расскажите друзьям в соц. сетях.
Poznayka.org - Познайка.Орг - 2016-2024 год. Материал предоставляется для ознакомительных и учебных целей.
Генерация страницы за: 0.007 сек.