systemII2003 (1086256), страница 2
Текст из файла (страница 2)
Для того, чтобы файл .ari поместить в конец файла .ari, необходимо перейти в буфер, содержащий 2.ari, поместить курсор-в конец этого файла, выбрать опцию Merge File (она находится вподменю File) и выбрать в диалоговом окне файл1.ari. При этом исходный файл .ari сохраняется.
Задание 3. Перейдите из 1-ого буфера во 2-ой (используя клавишу F6), наберите следующую базу и сохраните ее.
Эллен любит чтение. (чтение - reading)
Марк любит компьютеры. (компьютеры - computers)
Джон любит бадминтон. (бадминтон - badminton)
Эрик любит чтение.
Бадминтон - это вид спорта. ( sports(...). )
Теннис - это вид спорта.
Футбол - это вид спорта.
Бейсбол - это вид спорта. (спортсмен - sportsman)
Спортсмен - это тот, кто любит какой-нибудь вид спорта.
Образуйте новую базу, используя слияние файлов, полученного в задании 1 и данного. Сохраните ее.
4. Выполнение и трассировка программы.
Алгоритм выполнения Пролог-программы основан на механизме прямого перебора с возвратом и операции сопоставления. Выполнение программы начинается с запроса. Пролог-система берет первую подцель запроса и пытается доказать ее истинность. Для этого просматриваются программа( сверху вниз) и ищется первое утверждение, функтор и арность которого совпадают с функтором и арностью этой подцели
Если такое утверждение существует и происходит успешное сопоставление аргументов (см. приложение), то в случае утверждения-факта подцель доказана и Пролог-система переходит к доказательству следующей подцели. В случае утверждения-правила Пролог-система пытается доказать истинность подцелей тела правила слева направо.
Если при поиске решения обнаружено несколько вариантов доказательства истинности цели, то Пролог-система запоминает альтернативные варианты решения (точки возврата).
Если для некоторой цели нет ни одного утверждения, с которым ее можно сопоставить, то цель считается неуспешной. Если при этом остались непройденные точки возврата, то выполняется возврат (бектрекинг) и еще раз делается попытка доказательства подцели. Рассмотрим пример выполнения Пролог-программы
Задание 4. Загрузите Пролог-программу из задания 2. Войдите в подменю Debug и выберете опцию Trace On. Войдите в интерпретатор (клавиша F8). Просмотрите базу, задайте запрос
?-likes(X,tennis),likes(X,computers).
и посмотрите, что произойдет. После получения первого решения получите все остальные, вводя ”;”.
Задание 5. Используя команды редактора, заменить всюду' Eric' на 'Tom'. Построить дерево вывода для построенной в задании базы данных и запроса
?-sportsman('Mark').
Задание 6. Построить базу "на русском языке":
Живет зебра на земле. Живет собака на земле. Живет карп в воде.
Живет кит в воде. Кошка живет там же, где живет собака.
Живет крокодил в воде и на земле. Живет лягушка в воде и на земле.
Живет утка в воде, на земле и в воздухе. Живет орел в воздухе и на земле.
Живет буревестник в воде и в воздухе.
Задайте к этой базе запросы (воспользуйтесь Help для поиска отношения "неравно").
Кто где живет?
Кто живет на земле, но не является собакой?
Кто живет и на земле, и в воде?
ЛАБОРАТОРНАЯ РАБОТА 2
I. СТРУКТУРЫ ДАННЫХ. СЛОЖНЫЕ УТВЕРЖДЕНИЯ В ПРОЛОГЕ
ЦЕЛЬ. Знакомство со структурами данных и их унификацией. Построение сложных утверждений в Прологе с помощью связок "и", "или", "не".
1. СТРУКТУРА ЯЗЫКА.
В основе языка Пролог лежит универсальный тип данных, называемый термом. Любой объект задачи и любое отношение между объектами представляется термом того или иного вида. Все типы данных Пролога можно рассматривать как частный случай терма:
терм | |||||||||||||||||
переменная | константа | сложный терм | |||||||||||||||
символьная | текстовая | числовая | список | структура | |||||||||||||
(атом) | (строка) | ||||||||||||||||
(размерн. 0) | |||||||||||||||||
целое число | число с плав. точкой | число для ссылки в базе данных |
В традиционных языках программирования базовой операцией является присваивание значения переменной. В Прологе используется более общий механизм присваивания, известный как унификация (сопоставление, конкретизация).
Унификация заключается в посимвольном или поэлементном сравнении двух конструкций языка и связывании переменных-параметров одной конструкции (образца) с соответствующими элементами другой. Унификация может быть успешной (true) или неуспешной (fail). В случае успеха оба унифицируемых терма могут измениться, при этом они станут синтаксически равными. Кроме того, после унификации две переменные могут оказаться взаимосвязанными.
Унификация сложных термов определяется рекурсивно.
Задание 1. Прочитать приложение 2.
-
Составные цели–запросы.
Составная цель - это несколько предикатов, соединенных знаком запятой ("и"), точкой с запятой ("или"). В конце целевого утверждения указывается точка. Доказательство составных запросов в Прологе осуществляется слева направо.
-
В случае связки "или" переменные в подцелях являются локальными, и связывания одноименных переменных не происходит.
Например, в правиле
c(X):-a(X);b(X).
в подцелях a(X) и b(X) переменные X не будут связаны. Это правило можно заменить двумя:
c(X):-a(X).
c(X):-b(X).
Задание 2.
1) Наберите базу:
/* auto(Type,Price,Color,Age) - предикат */
auto('москвич',9500,'зеленый',1).
auto('москвич',3000,'синий',5).
auto('волга',15000,'черный',1).
auto('волга',8000,'белый',6).
auto('УАЗ',9000,'зеленый',3).
auto('ВАЗ',6000,'белый',4).
auto('ВАЗ',4000,'синий',10).
auto('ВАЗ-2108',8000,'серый',2).
2) Задайте вопрос:"Найти автомобиль с ценой меньше 5000, любого цвета, и любым сроком эксплуатации."
3) Добавьте к нашей базе правило:
"Следует купить автомобиль, если он зеленый или синий, не до роже некоторой суммы и его срок эксплуатации меньше 3-х лет".
4) Задайте вопрос к полученной программе:
"Какие автомобили можно купить за 10000 ?"
Найдите все решения.
-
Составные объекты
Составные объекты или структуры состоят из имени структуры-функтора и нескольких компонент структуры, которые могут быть любыми объектами, в том числе структурами.
Задание 3. Нарисуйте деревья для структур:
avto('марка'('ВАЗ',2108),'цвет'('синий'),'цена'($(7500))).
imeet('студент'('Олег'),kniga('Грибоедов','Горе от ума')).
Задание 4.
1) Введите базу:
imeet('Олег',kniga('Пушкин','Капитанская дочка')).
imeet('Лена',kniga('Монтень','Опыты')).
imeet('Ира',platok('синий')).
imeet('Лена',platok('красный')).
2) Задайте вопросы к этой базе данных:
Кто имеет какую-нибудь книгу Монтеня?
Кто какую книгу имеет?
Кто что имеет?
Верно ли, что Лена имеет синий платок?
Отрицание в прологе.
Логическая операция "не" – отрицание в ARITY/PROLOG обозначается через "not" и применяется к предикатам. Отрицание некоторого предиката является истинным, если невыполнимым является исходный предикат, т.е. не существует возможности доказательства его истины. На момент выполнения операции "not" все переменные исходного предиката должны быть конкретизированы.
База знаний Пролога описывает замкнутый мир объектов и отношений, поэтому отрицательный ответ на вопрос может обозначать как логическую ложь, так и "не знаю".
Чаще всего операция "not" используется в определении цели "проверка" в схеме программирования "метод генерации и проверки", который состоит в порождении множества кандидатов в решение и дальнейшей их фильтрации:
решение(X):-кандидат(X),проверка(X).
Задание 5. Задайте к базе из задания 6 (стр.8) запросы:
Кто живет ровно в одной среде обитания?
Кто живет хотя бы в двух (ровно в двух) средах обитания?
Задание 6.
1) Опишите базу знаний на Прологе со следующими фактами:
Иван имеет 10000 руб. 'имеет'('Иван',rub(10000)).
Иван имеет машину вишневую "Волгу".
Иван имеет телевизор. 'имеет'('Иван','телевизор').
Иван имеет магнитофон. . . .
Петр имеет 5000 руб.
Петр имеет телевизор. Петр имеет холодильник.
Коля имеет 20000 руб. Коля имеет телевизор.
2) Задайте к ней вопросы:
Что имеет Петр?
Кто имеет 10000 рублей? Кто что имеет?
Какие вещи имеет Иван, которых нет у Николая?
(Деньги-не вещь)
3) Добавьте к этой базе данных следующие факты:
Цена машины "Волга"-32000.
Цена телевизора- 8400. Цена холодильника - 4200.
Цена магнитофона - 3500.
Цена видео - 12000.
Цена приемника - 1300.
Цена часов - 500.
4) Задайте к расширенной базе вопросы:
Может ли Петр купить видео?
У кого больше всего денег?
5) Введите правило, определяющее, что некто может купить вещь, если у него хватит денег и этой вещи у него нет.
6) Задайте вопросы:
Что может купить Коля?
Что может купить Коля из того, что имеет Иван?
7) Добавьте к базе следующие факты:
Анна является женой Коли.
Мария является женой Ивана.
Ольга является женой Петра.
8) Введите правило, что "у жены есть все, что есть у мужа".
9) Задайте вопросы:
Имеет ли Мария машину?
Что может купить Анна, чего не имеет Мария?
II. РЕКУРСИЯ В ПРОЛОГЕ
ЦЕЛЬ. Знакомство с основным методом программирования в ПРОЛОГЕ – рекурсией. Замена рекурсии итерацией (программирование с накопителями). Арифметические предикаты.
1.РЕКУРСИЯ.
Основным методом программирования в Прологе является рекурсия. Рекурсивным называется определение функции (предиката) через эту же функцию (предикат).
Рекурсивное правило в общем случае имеет следующий вид:
R:- A,U,В,R,С.
где R - предикат, определяющий рекурсивный вызов, U - предикат, определяющий условие выхода из рекурсии по неуспеху, А,В,С - группы предикатов, не влияющие на рекурсивный вызов. В процессе рекурсии предикаты группы С запоминаются и выполняются лишь по завершении рекурсии (обратный ход).