Л.Р._Ш.И_2-6 / L6_Robot_Kran
.docЛАБОРАТОРНАЯ РАБОТА
"Алгоритмы управления роботом-краном"
Общие сведения
Рассмотрим предварительно следующую задачу: на поверхности стола находятся поставленные друг на друга кубики и пирамидки разного цвета. Необходимо разработать программу для робота, выполняющего две команды:
- поставить предмет заданного цвета на указанный другой предмет post(obj, obj);
-
сообщить расположение объектов на текущий момент status.
Опишем типы объектов и зададим их расположение на поверхности стола:
Domains
obj=kub(color); pir(color); stol
color=symbol
Predicates
post(obj, obj)
status
osv(obj) - освободить объект от находящихся на нем
предметов
Database
na(obj, obj)
Clauses
na(kub(whait) , stol).
na(kub(yellow), kub(whait)).
na(pir(green), kub(yellow)).
na(kub(blau), stol).
na(pir(red), kub(blau)).
na(kub(black),stol).
na(pir(fiol),stol).
Рассмотрим фрагмент программы вывода расположения объектов на столе в отдельное окно.
status:- makewindow(1, 7, 7, “ “, 5, 5, 15, 40), открытие окна
na(X,Y),
write(X, “on”, Y), вывод расположения объекта
nl, переход на следующую строку
fail. откат
status:- readchar( _ ). приостановка выполнения программы для просмотра содержимого окна до нажатия любой клавиши
Разработаем программу перестановки объекта X на объект Y с помощью команды post(X, Y). В общем случае перед перемещением объектов необходимо освободить объекты X и Y от находящихся на них предметов, затем выполнить команду перемещения. Выполнение команды перемещения будем имитировать оператором вывода с сообщением о перестановке. После любого перемещения необходимо модифицировать базу данных, которая должна адекватно отображать текущее состояние.
post(X,Y):- osv(X),
osv(Y),
write("поставил ", X, "на", Y),nl
retract(na(X, _ )),
assertz(na(X, Y)).
osv(X):- not(na(_ , X). на объекте ничего нет
osv(stol). стол всегда свободен
osv(X):- na(Y, X), что-то стоит
osv(Y),
write("поставил ", Y, "на cтол"), nl,
retract(na(Y, X_ )),
assertz(na(Y, stol)).
Для правильной работы программы необходимо ввести следующие ограничения:
- нельзя ставить на пирамиду
post( _ , pir( _ )) :- write("сообщение 1"), ! .
- нельзя ставить само на себя
post(X ,X) :- write(("сообщение 2"), ! .
- нельзя ставить стол
post(stol , _ ) :- write(("сообщение 3"), ! .
- ничего не надо делать, если предмет уже стоит на месте
post(X,Y) :- na(X,Y), write(("сообщение 4"), ! .
- нет смысла переставлять, если одного из объектов не существует
post(X,Y) :- not( haves(X,Y)), write(("сообщение 5"), ! .
Здесь предикат haves(X,Y) определяет существование объектов X и Y на столе:
haves(X,Y) :- have(X), have(Y).
have(X) :- na(X, _ ).
have(X) :- na( _ ,X).
Эти предикаты необходимо поставить перед предикатом перестановки, описывающий общий случай. Знак отсечения ! указывает программам унификации Prologa прекратить проверки альтернативных вариантов.
Цель работы.
Разработка и отладка программ управления роботом –краном. Приобретение и закрепление практических навыков составления программ на языке Prolog.
Подготовка к работе.
Изучить правила описания базы данных и операторы модификации базы данных в языке Prolog – retract, asset. Изучить текст программы перекладывания кубиков, приведенный в приложении к лабораторной работе.
Порядок выполнения работы
Часть первая.
1. Загрузить компилятор языка логического программирования PROLOG.
2. Набрать фрагмент программы манипулирования геометрическими фигурами (куб, пирамида), состоящий из описания объектов, предикатов, базы данных и предиката, обеспечивающего вывод информации о текущем размещении объектов. Отладить программу.
3. Дополнить разработанную программу предикатом, обеспечивающим перекладывание указанного объекта в заданное место. Отладить программу.
4. Проверить, как ведет себя программа в "особых" случаях:
- поставить предмет на пирамиду;
- поставить предмет сам на себя;
- поставить несуществующий предмет или на несуществующий предмет;
- поставить стол на предмет;
- предмет уже стоит на указанном месте.
5. Дополнить разработанную программу предикатами, обеспечивающими нормальное поведение робота в указанных выше ситуациях. Отладить программу. Какие еще возможны особые ситуации?
Часть вторая.
1. Разработать программу управления роботом манипулятором в соответствии с индивидуальным заданием.
2. Набрать и отладить разработанную программу.
3. Оформить отчет по лабораторной работе.
Контрольные вопросы
1. Какой предикат обеспечивает удаление факта из базы данных?
2. Какой предикат обеспечивает вставку факта в базу данных?
3. Каким знаком препинания разделяются предикаты подцели?
4. Каким знаком препинания заканчивается описание правила?
5. По какому признаку Prolog различает переменные и символьные константы?
6. Какой предикат обеспечивает вывод информации на монитор? Опишите синтаксис предиката.
7. Какой предикат обеспечивает вывод информации в отдельное окно? Опишите синтаксис предиката.
8. Для каких целей используется предикат FAIL ?
9. Из каких секций состоит Prolog-программа ?
10. Из каких частей состоит любое рекурсивное правило?
Приложение
Текст программы перестановки геометрических фигур
Domains
obj=kub(color); pir(color); stol
color=symbol
Predicates
post(obj, obj)
status
osv(obj)
haves(obj,obj)
have(obj)
Database
na(obj, obj)
Clauses
na(kub(whait),stol).
na( kub(yellow), kub(whait)).
na( pir(green), kub(yellow)).
na(kub(blau), stol).
na(pir(red),kub(blau)).
na(kub(black),stol).
na(pir(fiol),stol).
status:- makewindow(1, 7, 7, " ", 1, 1, 12, 35),
na(X,Y),
write(X, " on ", Y),
nl,
fail.
status:- readchar( _ ).
haves(X,Y):-have(X),have(Y).
have(X):-na(X,_).
have(X):-na(_,X).
% osobyj sluchaj
post(X,Y):-na(X,Y),write("uge stoit "),!.
post(_,pir(_)):-write("na piramidu nelzja "),!.
post(X,X):-write("samogo na sebja nelzja "),!.
post(stol,_):-write("net smysla "),!.
post(X,Y):-not(haves(X,Y)),write("net objekta "),!.
% obshhij sluchaj
post(X,Y):-osv(X),
osv(Y),
write("postavil ", X, " na ", Y),nl,
retract(na(X, _ )),
assertz(na(X, Y)).
osv(X):- not(na(_ , X)).
osv(X):- na(Y, X),
osv(Y),
write("postavil ", Y, " na stol"), nl,
retract(na(Y, X )),
assertz(na(Y, stol)).
Варианты заданий
Станция контейнерных перевозок состоит из площадок ph(a), ph(b), . . . для хранения больших bk(номер) и малых mk(номер) контейнеров, погрузо-разгрузочной площадки с автомашиной – avto и вспомогательной площадки – pv.
Разработать программу управления краном-роботом, выполняющим указанные команды, при выполнении следующих ограничений:
- нельзя ставить большой контейнер на малый;
- вспомогательная площадка служит для временного хранения контейнеров при их перестановке.
№ |
Команды |
Исполнители |
1. |
Переставить все контейнеры с площадки X на площадку Y. Дать сведения о размещении больших контейнеров. |
|
2. |
Погрузить контейнер Z на автомашину. Дать сведения о размещении малых контейнеров. |
|
3. |
Снять контейнер с машины и поставить на площадку X сверху. Дать сведения о размещении контейнеров. |
|
4. |
Снять контейнер с машины и поставить на площадку X на контейнер Z. Сколько малых контейнеров? |
|
5. |
Вытащить контейнер Z на вспомогательную площадку. Сколько больших контейнеров? |
|
6. |
Поставить контейнер Z на контейнер Y. Сколько всего контейнеров? |
|
7. |
Снять контейнер с машины и поставить на свободную площадку. Какие контейнеры на площадке X? |
|
8. |
Собрать контейнеры со вспомогательной площадки на площадку X. Где находиться контейнер Z? |
|
Справочный материал
Секция динамической базы данных
Предикаты в разделе ДБД могут содержать только факты без переменных. Эти факты могут быть вставлены во время выполнения программы или удалены. В программе можно описать несколько ДБД. В этом случае ей необходимо задать уникальное имя. Одному разделу можно не давать имени. Компилятор по умолчанию задаст имя dbasedom.
Описание секции ДБД database [– имя_ДБД]
Предикаты включения фактов в динамическую базу данных
Существуют два предиката:
включение в начала ДБД – asserta(факт [,имя_ДБД])
включение в конец ДБД – assertz(факт [,имя_ДБД])
Список аргументов состоит из двух аргументов – обязательного (предиката-факта) и необязательного (имени базы данных). При отсутствии имени БД Пролог предполагает стандартное имя dbasedom.
Предикаты удаления фактов из динамической базы данных
Удаление единичного факта – retract(факт [,имя_ДБД])
Удаление всех фактов – retractall(факт [,имя_ДБД])