PDF-лекции (1156613), страница 7
Текст из файла (страница 7)
специальных функций, реализующих взаимодействие соперационной средой, интерпретатором (перехват синтаксических ошибок с целью их анализа впрограмме пользователя), а также преобразование типов. Несколько примеров:[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).День 6.
Образцы и сопоставителиДля анализа данных в Плэнере наряду с традиционными способами (применение функций для работы сосписками, логических функций, предикатов, блоков) можно использовать:- функцию is, реализующую сопоставление образца с выражением,- сопоставители – особые процедуры (к которым можно обращаться только в образцах), проверяющиете или иные свойства выражения и его соответствие образцу в целом или отдельному элементу образца.Соответствующие возможности Плэнера мы рассмотрим кратко и в основном напримерах.Образец – выражение, которое используется как шаблон при анализе другого выражения (задаетструктуру и отдельные компоненты этого выражения).Если выражение удовлетворяет требованиям шаблона, то говорят, что оно соответствует образцу,если нет, то не соответствует.
В первом случае сопоставление образца с выражением удачно, вовтором – неудачно.Обращение к функции is выглядит так:[is pat e], где pat – образец, e – выражение (сопоставление производится с E – значением e).Алгоритм сопоставления в общем случае сложен, он предполагает возвраты. Важно, что удачноесопоставление может сопровождаться побочными эффектами – переменным, входящим в состав образцамогут присваиваться в качестве значений соответствующие фрагменты выражения.
Это позволяет резкосократить запись сложных действий по анализу данных и выделению важных для работы фрагментов.Примеры (считаем, что используемые переменные описаны вне обращений к is, например, в каком- тообъемлющем блоке):[is (*X .X) (b b)] T- сопоставление удачно, X (побочный эффект) получает значение bотметим, что при сопоставлении первого элемента образца (*X) спервым элементом выражения (b) переменная X получила значение b;22[is (*X .X) (b (b))] ( )[is (*X !*Y) (1 2 3)] T[is (*X *Y) (1 2 3)] Tвторой элемент образца (.X) требует, чтобы рассматривалось текущеезначение переменной X (префикс точка), т.е.
как раз b; поэтомуудачным будет и сопоставление второго элемента образца со вторымэлементом выражения.- сопоставление неудачно;- сопоставление удачно; X:= 1, Y:= (2 3)- сопоставление неудачно (образец описывает список длиной два).Обращение к сопоставителю внешне выглядит как обращение к функции. Однако: значение невырабатывается, проверяется соответствие выражения/подвыражения образцу/элементу образца,фактические параметры (аргументы) обычно уточняют вид проверки.Пример: [list n] - сопоставитель, соответствующий списку из N элементов[is [list 2] (a b)] T- сопоставление удачно;[is [list 2] (a b c)] ( )- сопоставление неудачно;[is (a <list 2> a) (a b b a)] T - сопоставление удачно (сегмент b b соответствует сегментномуобращению к сопоставителю list;[is (a [list 2] a) (a (b b) a)] T - сопоставление удачно.В Плэнере есть около 30 встроенных сопоставителей, в том числе: логические (типа and и or), типасond, типа prog (вводят локальные переменные).Сопоставитель [ ] соответствует любому выражению, сопоставитель < > - любому сегменту.Некоторые встроенные сопоставителиСопоставители (без параметров): id (идентификатор), num (число), var.
(обращение к переменной спрефиксом "."), var*, var:, var!., var!*, var!:, atomic (атомарное выражение) – проверяют типвыражения.[aut pat1 … patn] – сопоставитель "ИЛИ"; сопоставление с некоторым выражением успешно, есливыражение соответствует одному из указанных образцов.[et pat1 … patn] – сопоставитель "И"; сопоставление с некоторым выражением успешно, если выражениесоответствует каждому из указанных образцов.[when pat1 pat1,1 pat1,2 … pat1,k1) … (patn patn,1 patn,2 … patn,kn)] – "УСЛОВНЫЙ" сопоставитель; есливыражение соответствует образцу pati, то применяется сопоставитель [et pati,1 pati,2 … pati,ki].[star pat] – сопоставитель соответствует списку, каждый элемент (верхнего уровня) которогосоответствует образцу pat.Определение новых сопоставителей[define <имя> (kappa <список параметров> pat)]Пример:[define pal (kappa ( )[aut ( ) [list 1] [same (X) (*X <pal> .X)]])]- рекурсивный сопоставитель pal соответствует любому списку-палиндрому; в нем использованы:логический сопоставитель aut (аналог or), известный нам сопоставитель list, сопоставитель-блок same(вводящий локальную переменную X).
Сопоставитель pal проверяет (последовательно): не является ливыражение пустым списком; списком длиной 1; списком, первый и последний элементы которогосовпадают, а «середина» удовлетворяет требованиям pal.Плэнерская база данныхБаза данных Плэнера не имеет никакого отношения к базам данных как объекту традиционногопрограммного обеспечения (реляционным или сетевым, СУБД). Она похожа на т.н. доску объявлений.Плэнерская база данных – это область памяти системы программирования на Плэнере, в которойхранятся утверждения. Утверждение представляет собой произвольный L-список, семантику которого(как и семантику всего наполнения базы данных) определяет пользователь. Рекомендуется использоватьбазу данных для моделирования динамически меняющейся проблемной среды: текущий наборутверждений отражает текущее состояние проблемной среды, запись или вычеркивание утвержденийсоответствует происходящим в среде изменениям.
Динамика базы данных отражает динамику поиска/планирования решения задач.23Основные операции над базой данных: запись утверждения, вычеркивание утверждение (пообразцу), поиск утверждения (по образцу).Запись[assert asrt with? rec? else?] – функция assert служит для записи явно заданного (в виде L-списка)утверждения asrt в базу данных. Факультативный параметр with задает список свойств записываемогоутверждения (он имеет такую же структуру, что и список свойств идентификатора, но связан сутверждением в целом). Факультативный параметр rec указывает, какие теоремы следует вызвать призаписи данного утверждения (некоторые теоремы могут вызываться в этот момент автоматически).Факультативный параметр else содержит рекомендации по поводу того, что следует делать, еслизаписать указанное утверждение в базу данных не удалось (например, потому, что такое утверждение вбазе данных уже хранится).Пример:пусть переменная X имеет значение green[assert (box A) (with col .X) (else)]- параметр rec в этом примере опущенПри выполнении этого обращения к функции assert происходит следующее:1) в базу данных записывается утверждение (box A) - имеется ящик A,2) с ним связывается список свойств (col green)- его цвет – зеленый,3) если утверждение записать не удалось, то (в соответствии с конкретным видом последнегопараметра – else – вырабатывается неуспех.Поиск[search pat test?] – основная функция для поиска в базе данных утверждений по образцу pat.
Параметрtest (факультативный) позволяет задать требования, предъявляемые к списку свойств утверждения.Функция search ставит развилку; ищет утверждение, соответствующее образцу; проверяет его списоксвойств (если он не удовлетворяет требованиям параметра test, ищется другое утверждениесоответствующее образцу).
Если подходящее (соответствует образцу, удовлетворяет требованиям test,параметр test не задан) утверждение найдено, оно является результатом обращения к search; развилка неуничтожается, следовательно, если в динамике до этого обращения к search «доберется» неуспех,начнется поиск новых утверждений, соответствующих pat. Если найти утверждение, соответствующееpat и удовлетворяющее test, не удалось, развилка отменяется и вырабатывается неуспех.Пример:пусть после выполнения обращения к assert из предыдущего примера мы задаем:[search (box [ ]) (test col [non red])]Результат поиска – утверждение (box A).Поиск утверждений можно вести поэтапно – находить утверждения, «частично соответствующие»образцу (функция candidates, обращение к которой имеет вид [candidates pat type?]), а затем болеедетально анализировать полученный «список кандидатов».
Можно искать только одно подходящееутверждение (функция search1).Вычеркивание[erase pat test?] – функция для удаления из базы данных утверждений, соответствующих образцу pat иудовлетворяющих требованиям параметра test (если он задан).Пример:стереть утверждение (box A) со списком свойств (col green) можно так:[erase (box [ ]) (test col [non red])]Плэнерская база данных, отображающая состояние проблемной среды:(room R1)(room R2)(conn R1 R2 D)(door D)(at ROBBY R1)(box A) – (col green)(at A R2)(box B) – (col red)(at B R2)В этой ситуации можно выполнять операциипоиска:[search (at ROBBY R1)] → T[search (at ROBBY R2)] → ( )[search (at ROBBY *X)] → T, X:= R1R1R2ROBBYABD24[find all (Y) .Y [search (room *Y)]] → (R1 R2)Режим возвратовВ язык Плэнер встроен т.н. режим возвратов, который упрощает реализацию различныхпоисковых алгоритмов, использующих перебор вариантов.
Суть этого режима в следующем. В любомместе программы может быть установлена т.н. развилка, от которой возможно несколько вариантовпродолжения работы программы. Выбирается один из вариантов, и программа продолжает свою работу.Если затем окажется, что этот вариант неуспешен, вырабатывается т.н. неуспех, по которому программаавтоматически «откатывается» к последней (по времени) развилке. При этом отменяются все изменения(в значениях переменных и т.п.), произведенные на неуспешном пути, и в этой развилке выбираетсяследующий вариант, после чего программа снова «идет вперед».
Если в развилке уже не оказалосьнерассмотренных альтернатив, то неуспех возвращает программу к предыдущей развилке.В каких местах программы ставить развилки и с какими альтернативами, считать ли выбранныйпуть вычисления неуспешным и когда вырабатывать неуспех – за все это отвечает автор программы.Встроенный же режим возвратов обеспечивает запоминание мест развилок и то, какие альтернативы вних еще не рассматривались, обеспечивает возврат программы по неуспеху к последней развилке иотмену ранее произведенных изменений в значениях переменных.Ниже перечислены некоторые из встроенных функций языка Плэнер, позволяющих реализоватьрежим возвратов.[among e]Значением аргумента должен быть список.