
- •1.Знакомство с swi/prolog. Запуск простой программы
- •1.1.Главное меню
- •1.2.Первая программа
- •Задание 2.1
- •1.3.Использование встроенных предикатов
- •Задание 3.1
- •1.4.Выполнение и трассировка программы
- •Задание 4.1
- •Задание 4.2
- •Задание 4.3
- •2.Структуры данных. Сложные утверждения в прологе
- •2.1.Структура языка
- •Задание 1.1
- •2.2.Составные цели-запросы
- •Задание 2.1
- •2.3.Составные объекты
- •Задание 3.1
- •Задание 3.2
- •2.4.Отрицание в прологе
- •Задание 4.1
- •Задание 4.2
- •3.Рекурсия в прологе
- •3.1.Рекурсия
- •Задание 1.1
- •Задание 1.2
- •3.2.Программирование с накопителями
- •Задание 1.1
- •Задание 1.2
- •4.2.Организация цикла baf-метод
- •Задание 2.1
- •Задание 2.2
- •4.3.Организация цикла udr-метод
- •Задание 3.1
- •Задание 3.2
- •4.4.Использование надрезов (snip)
- •Задание 4.1
- •5.Списки
- •Задание 1.1
- •Задание 1.2
- •Задание 1.3
- •6.Модификация утверждений программы. Работа с базой данных.
- •Задание 1.1
- •Задание 1.2
- •7.2.Символьные константы или атомы
- •7.3.Целые числа.
- •7.4.Рациональные числа
- •7.5.Числа с плавающей точкой
- •7.6.Строки
- •7.7.Структуры
- •8.Приложение 2. Встроенные предикаты и операторы.
- •Литература
2.3.Составные объекты
Составные объекты или структуры состоят из имени структуры-функтора и нескольких компонент структуры, которые могут быть любыми объектами, в том числе структурами.
Задание 3.1
Нарисуйте деревья для структур:
авто(марка('ВАЗ',2108),цвет(синий),цена($(7500))).
имеет(студент('Олег'),книга('Грибоедов','Горе от ума')).
Задание 3.2
Введите базу:
имеет('Олег', книга('Пушкин','Капитанская дочка')).
имеет('Лена', книга('Монтень','Опыты')).
имеет('Ира',платок(синий)).
имеет('Лена', платок(красный)).
ЗАМЕЧАНИЕ. Для создания операторной формы предиката с функтором Name можно воспользоваться встроенным предикатом op(Precedence, Type, Name), где Precedence – приоритет вводимого оператора (целое неотрицательное число), Type – тип вводимого оператора (инфиксный, постфиксный и т.п.). Операторная форма позволяет записывать факты, запросы и правила в операторном виде. Разъясним это на примере.
?-op(550,xfx,имеет).
Здесь тип xfx значит, что оператор имеет не обладает ни правой, ни левой ассоциативностью (в отличие от случаев xfy и yfx соответственно). После выполнения такого запроса можно ввести вышеуказанный факт в виде:
'Олег' имеет книга('Пушкин','Капитанская дочка').
Так же можно написать запросы в функциональной и операторной формах:
?- имеет(Б,Ъ).
Б = 'Олег',
Ъ = книга('Пушкин', 'Капитанская дочка').
?- Б имеет Ъ.
Б = 'Олег',
Ъ = книга('Пушкин', 'Капитанская дочка').
Как видно из выполнения запросов операторная и функциональная формы записи предикатов дают один и тот же результат. Подробнее о предикате op/3 можно прочитать во встроенной справке (для запуска справки можно использовать запрос ?-help(op). или ?-help(op/3).).
Задайте вопросы к этой базе данных:
Кто имеет какую-нибудь книгу Монтеня?
Кто какую книгу имеет?
Кто что имеет?
Верно ли, что Лена имеет синий платок?
2.4.Отрицание в прологе
Логическая операция "не" - отрицание в SWI/PROLOG - обозначается через not и применяется к предикатам. Отрицание некоторого предиката является истинным, если невыполнимым является исходный предикат, т.е. не существует возможности доказательства его истины.
База знаний Пролога описывает замкнутый мир объектов и отношений, поэтому отрицательный ответ на вопрос может обозначать как логическую ложь, так и ответ "не знаю".
Чаще всего операция not используется в определении цели "проверка" в схеме программирования "метод генерации и проверки", который состоит в порождении множества кандидатов в решение и дальнейшей их фильтрации:
решение(X):-кандидат(X),проверка(X).
Задание 4.1
Задайте к базе из задания 1.5 запросы:
Кто живет ровно в одной среде обитания?
Кто живет хотя бы в двух (ровно в двух) средах обитания?
Задание 4.2
Опишите базу знаний на Прологе со следующими фактами:
Иван имеет 10000 руб.
Иван имеет телевизор.
Иван имеет машину-вишневую "Волгу".
Иван имеет магнитофон.
Петр имеет 5000 руб.
Петр имеет телевизор.
Петр имеет холодильник.
Коля имеет 20000 руб.
Коля имеет телевизор.
имеет('Иван',rub(10000)).
имеет('Иван','телевизор').
…
Задайте к ней вопросы:
Что имеет Петр?
Кто имеет 10000 рублей?
Кто что имеет?
Какие вещи имеет Иван, которых нет у Николая?
(Деньги - не вещь)
Добавьте к этой базе данных следующие факты:
Цена машины "Волга"-32000.
Цена телевизора- 8400.
Цена холодильника - 4200.
Цена магнитофона - 3500.
Цена видео - 12000.
Цена приемника - 1300.
Цена часов - 500.
Задайте к расширенной базе вопросы:
Может ли Петр купить видео?
У кого больше всего денег?
Введите правило, определяющее, что некто может купить вещь, если у него хватит денег и этой вещи у него нет.
Задайте вопросы:
Что может купить Коля?
Что может купить Коля из того, что имеет Иван?
Добавьте к базе следующие факты:
Анна является женой Коли.
Мария является женой Ивана.
Ольга является женой Петра.
Введите правило, что "у жены есть все, что есть у мужа".
Задайте вопросы:
Имеет ли Мария машину?
Что может купить Анна, чего не имеет Мария?