- •Методические указания к выполнению лабораторных работ
- •Лабораторная работа «Установка и проверка работы Visual Prolog»
- •ПрОграммирование в лоГике
- •Описание окон Visual Prolog, перечень окон
- •Задание Создание проекта и настройка компилятора
- •Запуск и тестирование работы программы
- •Вопросы для самоконтроля
- •Лабораторная работа «Создание программы с использованием предложений, предикатов, доменов и целей. Создание составных целей»
- •Файлы используемые в проекте
- •Структура программы на Visual Prolog
- •Создание программы на языке Visual Prolog
- •1. В первую очередь необходимо определить факты.
- •2. Необходимо определить правила
- •3. После определения предложений необходимо сформулировать цель на языке Пролог
- •3. Далее в разделе предикатов необходимо описать пользовательские предикаты. Это можно сделать двумя способами
- •Задание Создание программы с использованием предложений, предикатов, доменов и целей
- •Организация запросов
- •Вопросы для самоконтроля
- •Лабораторная работа «Создание составных целей с конъюнкцией и дизъюнкцией»
- •Сложная цель с конъюнкцией и дизъюнкцией
- •Задание Внесение правил
- •Настроить проект как в лабораторной работе №1. * применить к каждой лабораторной работе
- •Организация запросов
- •Лабораторная работа «Использование отладчика приложения для составления целевого дерева»
- •Унификация и поиск с возвратом
- •Поиск с возвратом
- •Детальный поиск с возвратом
- •Задание
- •Создание программы
- •Использование отладчика приложения (Debugger)
- •Вопросы для самоконтроля
- •Лабораторная работа «Управление поиском решения»
- •Управление поиском решений
- •Прерывание поиска с возвратом (отсечение)
- •Использование предиката Fail
- •Предотвращение поиска с возвратом к предыдущей подцели в правиле
- •Использование предиката Not
- •Задание Создание программы поиска с предикатами !, not
- •Лабораторная работа «Организация пользовательского меню»
- •Детерминизм и отсечение
- •Использование правил для условного ветвления
- •Задание
- •Вопросы для самоконтроля
- •Лабораторная работа «Составные объекты»
- •Простые и составные объекты
- •Простые объекты данных
- •Составные объекты данных и функторы
- •Унификация составных объектов
- •Объявление составных доменов
- •Задание
- •Создание программы
- •Вопросы для самоконтроля
- •Лабораторная работа «Списки»
- •Задание
- •Вопросы для самоконтроля
- •Используемая литература
Лабораторная работа «Организация пользовательского меню»
Тема: организация пользовательского меню.
Цель работы: создать пользовательское меню средствами встроенных предикатов Visual Prolog.
Детерминизм и отсечение
В Прологе существует директива компилятора checkdeterm. Если вставить эту директиву в самое начало программы, то Visual Prolog будет выдавать предупреждение в случае обнаружения недетерминированных предложений в процессе компиляции.
Вы можете превратить недетерминированные предложения в детерминированные, вставляя отсечения в тело правил, определяющих данный предикат. Например, помещение отсечений в предложения, определяющие предикат friend, делает этот предикат детерминированным, поскольку в данном случае обращение к friend может возвратить одно и только одно решение.
Использование правил для условного ветвления
Правила Пролога с процедурной точки зрения могут действовать как предложения case, представляя собой булевы функции, а также как оператор GoTo (при использовании cut), и возвращать вычисленные значения.
В случае если мы точно знаем, что решение имеет единственное значение можно использовать предикат cut, который используется для прерывания поиска с возвратом. Отсечение помещается в программу
Одно из основных различий между правилами в Прологе и процедурами в других языках программирования заключается в том, что Пролог позволяет задавать множество альтернативных определений одной и той же процедуры. Человек может быть предком, будучи отцом или матерью, поэтому определение предка состоит из двух правил.
Вы можете использовать множество определений так же, как вы применяете предложение case в Pascal, задавая множество альтернативных определений для каждого значения аргумента (или множества значений аргумента). Пролог же будет перебирать одно правило за другим, пока не найдет то, которое подходит, и затем выполнит действие, заданное правилом.
Встроенный предикат action подразумевает, что переменная уже связана. Если вы вызываете action со свободной переменной в качестве аргумента, то компилятор сгенерирует ошибку.
Отсечение как GoTo
predicates
action(integer)
clauses
action(1):-
nl,
write("You typed l."),
nl.
action(2):-
nl,
write("You typed two."),
nl.
action(3):-
nl,
write("Three was what you typed."),
nl.
action(N):-
nl,
N<>1, N<>2, N<>3,
write("I don't know that number!"),
nl.
goal
write("Type a number from 1 to 3: "),
readint(Choice),
action(Choice).
Если пользователь нажмет клавиши <1>, <2> или <3>, action будет вызвана с соответствующим значением аргумента и будет вызвано одно из первых трех правил этого примера.
Задание
domains
автор=автор(имя,фамилия)
книга=книга(тема_книги,название_книги)
тема_книги,название_книги,имя,фамилия=symbol
код_сотрудника,группа=integer
predicates
студент(имя,фамилия,группа)
сотрудник(имя,фамилия,код_сотрудника)
информация_книга(книга,автор)
выбор_меню(integer)
clauses
выбор_меню(2):-
nl,
информация_книга(книга(«Сети»,Название_книги),автор(Имя,Фамилия)),
write(Название_книги," ",Имя," ",Фамилия),
nl.
выбор_меню(3):-
nl,
информация_книга(книга(«Базы данных»,Название_книги),автор(Имя,Фамилия)),
write(Название_книги," ",Имя," ",Фамилия),
nl.
выбор_меню(4):-
nl,
информация_книга(книга(«Управление данными»,Название_книги),автор(Имя,Фамилия)),
write(Название_книги," ",Имя," ",Фамилия),
nl.
выбор_меню(5):-
nl,
информация_книга(книга(«Информационные системы»,Название_книги), автор(Имя,Фамилия)),
write(Название_книги," ",Имя," ",Фамилия),
nl.
выбор_меню(6):-
nl,
студент(Имя,Фамилия,10),
write(Имя," ",Фамилия," "),
nl.
выбор_меню(7):-
nl,
студент(Имя,Фамилия,Группа),Группа<>10,
write(Имя," ",Фамилия," ",Группа),
nl.
выбор_меню(1):-
nl,
информация_книга(книга(Тема_книги,N),автор(I,F)),F<>"Ручкин",
write(Тема_книги," ",N," ",I," ",F," "),
nl.
выбор_меню(8):-
nl,
сотрудник(I,F,Okl),Okl=1700,
write(I," ",F," "),
nl.
выбор_меню(N):-
nl,
N<>1, N<>2, N<>3,N<>4,N<>5,N<>6,N<>7,N<>8,
write("Всего пунктов меню восемь!"),
nl.
студент(«Иван», «Иванов»,110).
студент(«Иван», «Иванов»,10).
студент(«Николай», «Иванов»,10).
студент(«Петр», «Петров»,15).
студент(«Татьяна», «Сидорова»,13).
студент(«Мария», «Самсонова»,12).
сотрудник(«Ольга», «Зайцева»,310).
сотрудник(«Василий», «Донкин»,4500).
сотрудник(«Ольга», «Гусева»,500).
сотрудник(«Денис», «Серов»,008).
сотрудник(«Александра», «Орлова»,007).
сотрудник(«Ольга», «Зайцева»,350).
информация_книга(книга(«Управление данными», «Аssembler»),автор(«Ильф», «Петров»)).
информация_книга(книга(«Базы данных», «Методичка»),автор(«Алекс», «Ручкин»)).
информация_книга(книга(«Базы данных», «Delphi 7»),автор(«Алекс», «Ручкин»)).
информация_книга(книга(«Информационные системы», «Справочник»),автор(«Александр», «Седов»)).
информация_книга(книга(«Сети», «Методичка»),автор(«Александр», «Седов»)).
информация_книга(книга(«Сети», «Учебник»),автор(«Александр», «Седов»)).
goal
Задание:
1. Добавьте меню (предикат выбор_меню) которое позволит показать:
студентов определенной группы;
темы выбранных книги какого либо читателя;
все книги по теме «Сети»;
всех студентов которые не интересуются темами «Базы данных»;
все книги автора Архангельского.
2. добавить несколько своих пунктов в меню.
3. Создайте цель для использования предиката выбор_меню.
