ВУЗ: Не указан
Категория: Не указан
Дисциплина: Не указана
Добавлен: 16.05.2021
Просмотров: 2459
Скачиваний: 23
СОДЕРЖАНИЕ
.1.Основные элементы программирования в CLIPS
.2.Наблюдение за процессом интерпретации программы
.4.Задачи на планирование действий
.5.Пример программы по планированию действий робота – "Робот и ящик"
.6.Порядок выполнения работы. Задания
.7.Элементы математической логики. Логика высказываний
.8.Примеры программ логического доказательства
.10.Эвристический алгоритм поиска в пространстве состояний
.11.Пример решения задачи поиска в пространстве состояний
.13.Использование объектно-ориентированных средств в CLIPS
.14.Пример объектно-ориентированного программирования в CLIPS.
В языке CLIPS правила имеют следующий формат:
(defrule <имя правила>
< необязательный комментарий >
< необязательное объявление >
< предпосылка_1 >
< предпосылка_m >
=>
< действие_1 >
< действие_n >
)
Например:
(defrule chores
“Things to do on Sunday”
(declare (salience 10))
(today is Sunday)
(weather is warm)
=>
(assert (wash car))
(assert (chop wood))
)
В этом примере Chores – произвольно выбранное имя правила. Предпосылки условной части правила – это:
(today is Sunday)
(weather is warm)
сопоставляются затем интерпретатором с базой фактов, а действия, перечисленные в выполняемой части правила (она начинается после пары символов =>), вставят в базу два факта:
(wash car)
(chop wood)
в случае, если правило будет активизировано. Приведенный в тексте правила комментарий “Things to do on Sunday” (Что сделать в воскресенье) поможет в дальнейшем вспомнить, чего ради это правило включено в программу. Выражение
(declare (salience 10))
указывает на степень важности правила. Пусть, например, в программе имеется другое правило
(defrule fun
“Better things to do on Sunday”
(salience 100)
(today is Sunday)
(weather is warm)
=>
(assert (drink beer))
(assert (play guitar))
)
Поскольку предпосылки обоих правил одинаковы, то при выполнении оговоренных условий они будут «конкурировать» за внимание интерпретатора, Предпочтение будет отдано правилу, у которого параметр salience имеет более высокое значение, в данном случае – правилу fun. Параметру salience может быть присвоено любое целочисленное значение в диапазоне [-10 000, 10 000]. Если параметр salience в определении правила опущен, ему по умолчанию присваивается значение 0.
Обычно в определении правила присутствуют и переменные (они начинаются с символа ?). Если, например, правило
(defrule pick-a-chore
“Allocating chores to days”
(today is ?day)
(chore is ?job)
=>
(assert (do ?job on ?day))
)
будет сопоставлено с фактами
(today is Sunday)
(chore is carwash)
то в случае активизации оно включит в базу новый факт
(do carwash on Sunday)
Аналогично, правило
(defrule drop-a-chore
“Allocating chores to days”
(today is ?day)
?chore <- (do ?job on ?day)
=>
(retract ?chore)
)
отменит выполнение работ по дому (?chore). Обратите внимание на то, что оба экземпляра переменной ?day должны получить одно и то же значение. Переменная ?chore в результате сопоставления должна получить ссылку на факт (это делает оператор <-), который мы собираемся исключить из базы. Таким образом, если это правило будет сопоставлено с базой фактов, в которой содержатся
(today is Sunday)
(do carwash on Sunday)
то при активизации правила из базы будет удален факт
(do carwash on Sunday)
Отметим, что факт:
(do carwash on Sunday)
будет сопоставлен с любым из представленных ниже образцов
(do ? ? Sunday)
(do ? on ?)
(do ? on ?when)
Если за префиксом ? не следует имя переменной, он рассматриваются как универсальный символ подстановки, которому может быть сопоставлен любой элемент.
При написании правил в части посылок иногда требуются некоторые логические операции, например, необходимо указать факты, что «сегодня суббота или воскресенье», «цветок не синий», «шар большой и зеленый». Это реализуется специальными логическими операторами: «ИЛИ», «НЕ», «И», которые обозначаются как |, ~, & соответственно. Таким образом указанные выше факты запишутся следующим образом:
(today is Saturday|Sunday)
(flower is ~blue)
(ball is big&green)
-
Функции для манипулирования данными. Определение функций
Существует несколько типов функций: пользовательские и системные. Системные определены внутри среды CLIPS изначально, пользовательские – фрагменты кода, написанные пользователями на CLIPS или С.
Хотя CLIPS не ориентирован на численные вычисления, в нем предусмотрены стандартные математические и арифметические функции: +, -, *, /, ** (возведение в степень), Abs, Sqrt, Mod, Min, Max.
Пример 1:
(+ 2 5 8)
Конструкция deffunction позволяет пользователю определять новые функции непосредственно в среде CLIPS.
(deffunction <имя функции> (<аргумент> ... < аргумент >)
<выражение>
<выражение>
)
Пример 2:
(deffunction hypotenuse (?a ?b)
(sqrt (+ (* ?a ?a) (* ?b ?b)))
)
Аргументы-переменные должны иметь префикс ?, как это показано в приведенном примере.
Вызовы функций в CLIPS имеют префиксную форму: аргументы стоят после ее названия. Вызов функции производится в скобках:
(hypotenuse 7 4 )
После открывающейся скобки следует имя функции, затем идут аргументы, каждый из которых отделен одним или несколькими пробелами. Аргументами функции могут быть данные простых типов, переменные или вызовы других функций.
Функция возвращает результат последнего выражения в списке. Иногда выполнение функции имеет побочные эффекты, как в приведенном ниже примере.
(deffunction init (?day)
(reset)
(assert (today is ?day))
)
В результате после запуска функции на выполнение командой
CLIPS> (init Sunday)
будет выполнена команда reset и, следовательно, очищена база фактов, а затем в нее будет включен новый факт (today is Sunday).
А в результате запуска функции hypotenuse на выполнение командой
CLIPS> (hypotenuse 3 4)
будет выдан известный ответ
CLIPS> 5.0
Пример 3 .
(deffunction between(?lb ?value ?ub)
(or (> ?lb ?value) (> ?value ?ub)))
Эта функция определяет, попало ли заданное целочисленное значение в диапазон между нижним и верхним пределами.
В некоторых задачах бывает полезным оператор присвоения bind. Например, переменной ?a присваивается значение 4:
(bind ?a 4)
Для подробного изучения функциональных возможностей языка CLIPS рекомендуем воспользоваться литературным источником [5].
.2.Наблюдение за процессом интерпретации программы
Теперь на простом примере познакомимся с возможностями, которые предоставляет среда разработки CLIPS в части отладки программы, состоящей из правил и фактов. Введите в текстовый файл правило, а затем загрузите этот файл в среду CLIPS.
(defrule start
(initial-fact)
=>
(printout t “hello, world” crlf)
)
Здесь стандартная команда printout t организует вывод на экран, символ crlf – это символ перевода строки.
Выполните команду reset. Для этого либо введите эту команду в командной строке интерпретатора
CLIPS> (reset)
либо выберите в меню команду Execution->Reset, либо нажмите <CTRL+U>.
Затем запустите интерпретатор. Для этого либо введите эту команду run в командную строку интерпретатора
CLIPS> (run)
либо выберите в меню команду Execution->Reset, либо нажмите <CTRL+R>.
В ответ программа должна вывести сообщение hello, world, знакомое всем программистам мира. Для повторного запуска программы повторите команды reset и run.
Если в меню Execution->Watch ранее был установлен флажок Rules или перед запуском программы на выполнение вы ввели в командную строку команду watch rules, то на экране появится результат трассировки процесса выполнения
CLIPS> (run) FIRE 1
start: f-0
hello, world
В этом сообщении в строке, начинающейся с FIRE, выведена информация об активизированном правиле: start – это имя правила, а f-0 – имя факта, который «удовлетворил» условие в этом правиле. Команда watch позволяет организовать несколько разных режимов трассировки. Если перед запуском программы вы ввели
CLIPS> (dribble-on “dribble.clp”)
TRUE
то выведенный протокол трассировки будет сохранен в файле dribble.clp. Сохранение протокола прекратится после ввода команды
CLIPS> (dribble-off)
TRUE
Это очень удобная опция, особенно на этапе освоения языка.
.3.GUI-интерфейс CLIPS
Для того чтобы иметь возможность наблюдать за всеми изменениями, происходящими в состоянии CLIPS, используется команда Window->All Above Данная команда открывает окна Facts (содержит факты из списка фактов) и Agenda (содержит все правила из списка активных правил).
Ввести программу в CLIPS можно непосредственно из диалогового окна, появившегося после запуска. Но в этом случае все написанные правила после закрытия CLIPS будут потеряны. Поэтому текст программы необходимо сохранить в файле. В CLIPS имеется встроенный редактор.
Для загрузки содержимого файла в базу знаний CLIPS, нужно воспользоваться пунктом Load Constructs меню File.
Для того чтобы CLIPS активизировал начальный факт (initial-fact с идентификатором F-0) необходимо выбрать Executtion->Reset . Данная команда удаляет существующие факты из списка фактов, включает в список фактов исходный факт (initial-fact), включает в список фактов все факты, описанные в конструкциях (deffacts).
Затем, по команде Executtion->Run CLIPS начнет выполнение всех правил программы. Для сохранения протокола работы программы, а также получения ответа в текстовом файле необходимо сразу после запуска CLIPS выполнить команду File -> TurnDribbleOn и в диалоговом окне ввести имя файла, в который будет сохраняться содержимого главного окна CLIPS. После окончания работы программы выполнить TurnDribbleOff, по этой команде файл для вывода будет закрыт.
-
Лабораторная работа №1. Решение задач на планирование
Цель работы: ознакомление с основными принципами программирования на языке CLIPS, получение навыков работы в оболочке CLIPS, разработка программы на составление планов действий технической системой в заданной предметной области.
Технические средства: персональный компьютер с операционной системой Windows 9x/Me/NT/2000/XP.
Программные средства: текстовый редактор (Блокнот, WordPad и т.п.), оболочка языка CLIPS версии 6.2 и выше.
.4.Задачи на планирование действий
Задачи планировщика – определить последовательность действий модуля решения, например системы управления. Традиционное планирование основано на знаниях, поскольку создание плана требует организации частей знаний и частичных планов в процедуру решения. Планирование используется в экспертных системах при рассуждении о событиях, происходящих во времени. Планирование находит применение в производстве, управлении, робототехнике, в задачах понимания естественного языка.
Планы создаются путем поиска в пространстве возможных действий до тех пор, пока не будет найдена последовательность, необходимая для решения задачи. Это пространство представляет состояния мира, котрые изменяются при выполнении каждого действия. Поиск заканчивается, когда достигается целевое состояние (описание мира).
.5.Пример программы по планированию действий робота – "Робот и ящик"
Имеются 2 комнаты – A и B, в комнате A находится робот, в комнате B – ящик; задача – вытолкнуть ящик в комнату A.
Решим эту задачу с помощью шаблонных фактов. Введем шаблон in, определяющий местоположение предмета:
(deftemplate in
(slot object (type SYMBOL))
(slot location (type SYMBOL))
)
Слот Object будет задавать название предмета или робота, location – название места, где этот предмет или робот находится.
Чтобы задать роботу конкретную цель действий зададим шаблон goal:
(deftemplate goal
(slot object (type SYMBOL))
(slot from (type SYMBOL))
(slot to (type SYMBOL))
)
слот object – определяет название объекта, который необходимо переместить, слоты from и to определяют откуда и куда.
На основе шаблонов in и goal запишем начальные факты:
(deffacts world
(in (object robot) (location RoomA))
(in (object box) (location RoomB))
(goal (action push) (object box) (from RoomB) (to RoomA))
)
Первый факт соответствует тому, что робот находится в комнате A, второй, что ящик в комнате B, третий – перетащить ящик из комнаты B в A.
Заключительным этапом создания данной программы является создание правил. В данной задаче необходимо реализовать три правила, которые осуществляли бы следующие действия робота:
-
перемещение робота в комнату, где находится объект;
-
перемещение робота с объектом в комнату, указанную в цели;
-
останов программы если цель достигнута.
Реализуем первое действие:
(defrule move
(goal (object ?X) (from ?Y))
(in (object ?X) (location ?Y))
?robot-position <- (in (object robot) (location ~?Y))
=>
(modify ?robot-position (location ?Y))
)
В данном правиле имеются три предпосылки. В первой предпосылке, использующей шаблон goal задаются значения переменных ?X и ?Y. Во второй определяется наличие объекта ?X в комнате ?Y. В третьей предпосылке проверяется, что местоположение робота не соответствует ?Y и запоминается ссылка на данный факт в переменной ?robot-position. Если все предпосылки данного правила истинны, то с помощью оператора modify меняется значение слота location на значение переменной ?Y факта ?robot-position, т. е. робот перемещается в комнату, в которой находится объект, который необходимо переместить.
Аналогично реализуется правило перемещения робота с ящиком, в комнату, указанную в цели:
(defrule push
(goal (object ?X) (from ?Y) (to ?Z))
?object-position <- (in (object ?X) (location ?Y))
?robot-position <- (in (object robot) (location ?Y))
=>
(modify ?robot-position (location ?Z))
(modify ?object-position (location ?Z))
)
В данном случае изменяются два факта, ссылки на которые задаются в переменных ?object-position и ?robot-position: значение слота location меняется на значение переменной ?Z, соответствующей значению куда необходимо переместить предмет роботом.
Останов выполнения программы в CLIPS осуществляется с помощью команды (halt). Условием останова является наличие факта, что предмет, указанный в цели (слот object) находится в комнате, указанной в слоте to:
(defrule stop
(goal (object ?X) (to ?Y))
(in (object ?X) (location ?Y))
=>
(halt)
)
Полный текст программы представлен в листинге 1.
Листинг 1. Программа «робот и ящик»
;; ШАБЛОНЫ
;; Шаблон «цель»
(deftemplate goal
(slot action (type SYMBOL))
(slot object (type SYMBOL))
(slot from (type SYMBOL))
(slot to (type SYMBOL))
)
;; Шаблон “в”
(deftemplate in
(slot object (type SYMBOL))
(slot location (type SYMBOL))
)
;; ФАКТЫ
;; Робот в комнате А,
;; ящик в комнате B,
;; цель - вытолкнуть ящик в комнату A.
(deffacts world
(in (object robot) (location RoomA))
(in (object box) (location RoomB))
(goal (action push) (object box) (from RoomB) (to RoomA))
)
;;ПРАВИЛА
;; Прекратить процесс, когда цель будет достигнута.
(defrule stop
(goal (object ?X) (to ?Y))
(in (object ?X) (location ?Y))
=>
(halt)
)
;; Если робот отсутствует в том месте, где находится объект,
;; который нужно передвинуть,
;; переместить туда робот.
(defrule move
(goal (object ?X) (from ?Y))
(in (object ?X) (location ?Y))
?robot-position <- (in (object robot) (location ~?Y))
=>
(modify ?robot-position (location ?Y))
)
;; Если робот и объект не в том помещении,
;; которое указано в цели,
;; переместить туда робот и объект.
(defrule push
(goal (object ?X) (from ?Y) (to ?Z))
?object-position <- (in (object ?X) (location ?Y))
?robot-position <- (in (object robot) (location ?Y))
=>
(modify ?robot-position (location ?Z))
(modify ?object-position (location ?Z))
)
Чтобы запустить программу в CLIPS необходимо:
1) скопировать текст программы в любой текстовый редактор (редактор CLIPS, Notepad) и сохранить его с расширением clp, например, robot.clp;
2) загрузить этот файл в среду CLIPS с помощью меню File\Load… (Ctrl+L);
3) выполнить команду reset. Для этого либо введите эту команду в командной строке интерпретатора:
CLIPS> (reset)
либо выберите в меню команду Execution->Reset (CTRL+U);
4) в меню Execution->Watch установите флажок Rules, чтобы наблюдать результат трассировки процесса выполнения;
5) затем запустите интерпретатор. Для этого либо введите эту команду run в командную строку интерпретатора:
CLIPS> (run)
либо выберите в меню команду Execution->Reset (CTRL+R).
.6.Порядок выполнения работы. Задания
-
Изучение интерфейса оболочки языка CLIPS.
-
Знакомство с основами программирования на языке CLIPS и выполнение примеров из части 1 данного руководства .
-
Выполнение в режиме отладки (включить просмотр правил и фактов) программы "Робот и ящик" (предварительно набрать исходный текст программы из листинга 1 в текстовом редакторе и сохранить под именем robot.clp, затем загрузить в CLIPS).
-
Модифицировать программу "Робот и ящик" таким образом, чтобы ящик необходимо было передвинуть в комнату C. Выполнить в режиме отладки.
-
Разработать программу на планирование действий технического объекта согласно варианту задания, выданного преподавателем.
Варианты заданий.
В каждой задаче необходимо вводить в базу фактов несколько заданий для робота или процесса, которые должны выполняться последовательно.
-
Авиаперевозки. Организовать перевозку с помощью воздушного грузового транспорта. Следует предусмотреть ситуации загрузки и разгрузки грузов в самолет, взлет, перелет из одного аэропорта в другой в другой, посадку, учет веса груза и грузоподъемность самолета.
-
Шиномонтажная мастерская. Робот должен проводить диагностику и смену колеса с пробитой покрышкой. Для каждой марки автомашины определен свой класс колес. Колес ограниченное количество, если какие-либо колеса отсутствуют, программа должна известить об этом.
-
Планирование действий по построению пирамиды из блоков(А,В,С,....) разного размера и разной формы по заранее определенным правилам установки, которые задаются в базе фактов.
-
Робот и ящик. Существуют 4 комнаты, выходящие дверями в коридор. Робот, который может перемещаться из комнат в коридор и обратно, двигать ящики.
-
Разработать предметную область, связанную с управлением грузовым лифтом. Лифт может перемещаться между этажами, согласно вызовам, и перевозить грузы, учитывая их вес.
-
Автомат по продаже воды. Автомат имеет конечное количество газированной воды и несколько видов сиропа. Выдача воды с сиропом и без сиропа выдается в соответствии с номиналом монеты и запросом (без сиропа, с вишневым сиропом, лимонным и т. п.).
-
Музыкальный автомат. Имеется определенное количество пластинок, автомат должен по требованию, заданному в базе фактов устанавливать нужную пластинку, если такой не имеется в базе, сообщить об этом. Предусмотреть счетчик времени (каждый шаг выполнения программы – окончание определенного количества времени), по окончании времени проигрывания пластинки она должна автоматически убираться.
-
Автомат разлива воды в бутылки. Имеется определенное количество воды и бутылки заданной емкости. Необходимо разлить воду в бутылки. Автомат должен сообщать, что вода закончилась или не хватает емкости. Не наполнять емкость, если воды меньше, чем объем заданной емкости.
-
Закачка файлов. Имеется список файлов в очереди закачки и их размер. За каждый шаг программы закачивается определенное количество байт (квота). Если количество байт оставшееся для полного скачивания файла меньше, чем квота, то остаток должен передаваться другому файлу.
-
Гирлянда. Имеются лампочки различных цветов, формы и т. п. Необходимо в базе правил задать правила включения и выключения определенных лампочек в момент времени. Под моментом времени считать один шаг программы.
-
Кофе-машина. В кофе-машину загружаются зерна кофе. Машина берет определенную порцию зерен, перемалывает, варит кофе и подает его. Предусмотреть возможность ввода нескольких сортов кофе, добавление сливок и сахара по запросу. Количество ресурсов (кофе, сахара, сливок, воды) должно быть ограничено, если какое-либо кофе получить не возможно, автомат должен сообщить об этом.
-
Процесс сборки изделия. Имеются детали, которые участвуют в сборке деталей. Каждая деталь должна использоваться в определенной последовательности. Когда изделии собрано, автомат должен переходить к сборке нового изделия. Процесс прекращается только тогда, когда сборка не возможна (закончились или не хватает какой-либо детали).
-
Продажа билетов. Имеется определенное количество билетов на различные мероприятия. Необходимо по запросу и заданному количеству монет выдавать билеты. Автомат должен выдавать сдачу и оповещать, если билеты на запрашиваемое мероприятие закончилось.
-
Библиотека. Необходимо выдавать книги из заданной базы абонентам по запросу. Книга может отсутствовать в библиотеке или быть на руках у другого абонента.
-
Комплексный обед. Имеется меню с ценами. По предъявленным запросам (перечень блюд, закусок и напитков и их количество) составить комплексные обеды и предъявить цену.