AI-2009 Day 05 (1156465), страница 2
Текст из файла (страница 2)
[and e1 e2 … ek] (k≥1)
[or e1 e2 … ek] (k≥1)
[cond (p1 e1,1 e1,2 … e1,k1) … (pn en,1 en,2 … en,kn)] (n≥1, ki≥1)
Блочная и связанные с ней функции
[prog (v1 v2 … vn) e1 e2 … ek] (n≥0, k≥1)
Эту функцию называют «блочной», поскольку ее вычисление напоминает выполнение блоков в других языках программирования. Вычисление функции начинается с того, что вводятся локальные переменные, перечисленные в ее первом аргументе. Если vi – идентификатор (имя), вводится локальная переменная с этим именем и без начального значения. Если же vi – пара (id val), то вводится локальная переменная с именем id и начальным значением val (выражение val при этом не вычисляется). После этого функция последовательно вычисляет остальные свои аргументы – формы ei, которые принято называть операторами. Вычислив последний из них, функция с его значением заканчивает работу, уничтожив при этом свои локальные переменные.
Вычисленные значения всех операторов (кроме последнего) нигде не запоминаются, поэтому имеет смысл в качестве таких операторов использовать только функции/операторы с побочным эффектом. Некоторые из этих функций перечислены ниже.
[set v e]
Это аналог оператора присваивания. Сначала вычисляются оба аргумента, причем значением аргумента v должно быть имя переменной, существующей в данный момент. Функция присваивает этой переменной новое значение – значение аргумента e. Это же значение является значением функции set, но оно, как правило, не используется.
[return e]
Это оператор выхода из блока. Функция return может использоваться только внутри функции prog, поскольку она завершает вычисление ближайшей объемлющей блочной функции, объявляя ее значением значение своего аргумента e.
[go e]
Это оператор перехода. Отметим, что если в качестве оператора функции prog указан идентификатор, то он трактуется как метка. Значением аргумента функции go должен быть идентификатор – одна из меток ближайшей объемлющей блочной функции. Функция go полностью завершает выполнение того оператора этой блочной функции, в который она входит (на любом уровне), и передает управление на оператор, следующий за этой меткой.
В качестве операторов можно использовать составной оператор: [do e1 e2 … ek] ( k≥1),
а также операторы цикла (loop, while, until, for). Мы рассмотрим только первый вид оператора цикла: [loop x l e1 e2 … ek]
При выполнении этого оператора вводится параметр цикла x, локализованный внутри loop, затем x поочередно получает в качестве значения очередной элемент списка L (слева направо), к которому применяются операторы e1 e2 … ek.
Пример: [set L (1 2 3))]
[prog ((R ( ))) [loop E .L [set R (.E !.R)] .R]] - описанный блок переворачивает входной список (значение переменной L), помещая в конец списка R (в начальный момент пустого) элементы L: сначала первый, затем второй, затем третий. Результатом работы prog будет значение переменной R на момент завершения цикла – список (3 2 1).
Константы
Как и в Лиспе, константами в Плэнере называются глобальные перемеенные. Они вводятся так: [cset c v] – константе с именем C присваивается V.
Функции ввода-вывода
В Плэнере имеется достаточно богатый набор функций ввода-вывода, включающий: функции для работы с файловой системой; функции ввода и вывода символов, текста, строк; функции установки цвета фона и символов, управления курсором и др.
Ниже приводится фрагмент программы, использующей некоторые средства ввода-вывода:
[open screen get] файл screen открывавется на ввод
[active screen get] файл screen переводится в состояние "активный файл ввода"
[cset a [read]] считывается очередное выражение (в данном случае, набираемое на клавиатуре)
и его значение присваивается константе a; пусть это выражение – (N O T).
[cset b [rev :a]] константе b присваевается (T O N).
[open ff put] файл с именем ff открывавется на вывод
[active ff put] файл ff переводится в состояние "активный файл вывода"
[print :b] в файл ff "печатается" (записывается) выражение (T O N).
Специальные функции
В Плэнере имеется более десятка т.н. специальных функций, реализующих взаимодействие с операционной средой, интерпретатором (перехват синтаксических ошибок с целью их анализа в программе пользователя), а также преобразование типов. Несколько примеров:
[catch e1 e2]
Функция вычисляет E1 и, если вычисление закончилось успешно, с этим значением заканчивает свою работу. Если же в процессе вычисления возникла ошибка, вычисляется значение второго параметра.
[exit e fn n?]
Выход из функции FN со значением E, если параметр n задан, то выход из N+1 динамически вложенных обращений к функции FN.
Частный случай – выход на верхний уровень программы: [exit ( ) ( )].
[time]
Значение функции – время от начала решения задачи.
[clock]
Дата и астрономическое время.
[atl a]
Функция преобразует идентификатор A в список составляющих его символов. Например, [atl PLAN] → (P L A N).
10
Программное обеспечение работ по ИИ