Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Л.Р._Ш.И_2-6 / L6_Robot_Kran

.doc
Скачиваний:
3
Добавлен:
20.02.2016
Размер:
63.49 Кб
Скачать

ЛАБОРАТОРНАЯ РАБОТА

"Алгоритмы управления роботом-краном"

Общие сведения

Рассмотрим предварительно следующую задачу: на поверхности стола находятся поставленные друг на друга кубики и пирамидки разного цвета. Необходимо разработать программу для робота, выполняющего две команды:

- поставить предмет заданного цвета на указанный другой предмет 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(факт [,имя_ДБД])

Соседние файлы в папке Л.Р._Ш.И_2-6