- •2.2.2.1 Вызов Турбо-Пролога и главное меню системы
- •2.2.3 Редактор Турбо-Пролога
- •2.2.3.1 Создание и редактирование программного файла
- •3 Лекция №2. Элементы и конструкции языка Турбо-Пролог
- •3.1 Основные вопросы
- •3.2 Текст лекции
- •3.2.1.1 Имена (идентификаторы)
- •3.2.2.1 Предикаты
- •3.2.2.2 Факты
- •3.2.2.3 Правила
- •3.2.2.4 Цели
- •4 Лекция №3. Объекты данных. Константы, переменные, структуры, списки.
- •4.1 Основные вопросы
- •4.2 Текст лекции
- •Стандартные типы доменов Турбо-Пролога
- •4.2.2.1 Константы
- •4.2.2.2 Переменные
- •4.2.2.3 Структуры
- •4.2.2.3 Списки
- •5 Лекция №4. Структура программы на Турбо-Прологе
- •5.1 Основные вопросы
- •5.2 Текст лекции
- •5.2.2 Структура программы на Турбо-Прологе – до 10 мин.
- •5.2.3.1 Раздел опций компилятора
- •5.2.3.2 Раздел констант
- •5.2.3.3 Раздел доменов
- •5.2.3.4 Раздел предикатов
- •5.2.3.5 Раздел утверждений
- •5.2.3.6 Раздел дбд
- •5.2.3.7 Раздел целей
- •6 Лекция №5. Унификация и поиск с возвратом: программа с фактами
- •6.1 Основные вопросы
- •6.2 Текст лекции
- •7 Лекция №6. Унификация и поиск с возвратом: программа с фактами и правилом
- •7.1 Ключевые (основные) вопросы (моменты)
- •7.2 Текст лекции
- •8 Лекция №7. Унификация и поиск с возвратом: программа с фактами и несколькими правилами
- •8.1 Основные вопросы
- •8.2 Текст лекции
- •9 Лекция №8. Вопросно-ответные системы
- •9.1 Основные вопросы
- •9.2 Текст лекции
- •10 Лекция №9. Средства отладки в Турбо-Прологе
- •10.1 Основные вопросы
- •10.2 Текст лекции
- •/*Программа 5 */
- •11 Лекция №10. Простейший ввод-вывод. Окна.
- •11.1 Основные вопросы
- •11.2 Текст лекции
- •11.2.1 Простейший ввод-вывод
- •11.2.2 Окна
- •12 Лекция №11. Управление поиском решений: предикаты отсечения и возврата
- •12.1 Основные вопросы
- •12.2 Текст лекции
- •/* Программа 5 */
- •Vse_reshenia:-roditel(X,y), write(X, "родитель", y), nl, fail.
- •Vita - родитель sasha
- •/* Программа 6 */
- •/* Программа 7 */
- •13 Лекция №12. Арифметика в Турбо-Прологе. Рекурсия.
- •13.1 Основные вопросы
- •13.2 Текст лекции
- •/* Программа 8 */
- •/* Программа 9 */
- •14 Лекция №13. Динамические базы данных
- •14.1 Основные вопросы
- •14.2 Текст лекции
- •/* Программа работы с дбд*/
- •15 Лекция №14. Работа со списками
- •15.1 Основные вопросы
- •15.2 Текст лекции
- •/* Программа 10*/
- •/* Программа 11 */
- •/* Программа 12 */
- •16 Лекция №15. Экспертные системы
- •16.1 Основные вопросы
- •16.2 Текст лекции
- •/* Программа эс*/
/* Программа работы с дбд*/
domains
name, marka, color = string
database
dcar (name,marka, color)
predicates
car (name, marca, color)
repeat
start
assert_database
clear_database
menu
run(integer)
error
goal start.
clauses
repeat.
repeat:-repeat.
/* Исходные данные */
car ("Иванов","BMW", "жёлтый").
car ("Петров","Волга", "чёрный").
car ("Сидоров","Жигули", "белый").
car ("Полякова","Audi","красный").
/* Начальная загрузка ДБД*/
assert_database:-car (Name, Marka, Color),
assert (dcar (Name, Marka, Color)), fail.
assert_database:-!.
/* Очистка ДБД */
clear_database:- retract(dcar(_,_,_)), fail.
clear_database:-!.
/* Задание цели в виде правила*/
start:-assert_database,
makewindow(1,7,7,"ДБД владельцевавтомобилей", 0, 0, 25, 80),
meny,
clear_database.
/* Меню */
meny :-
repeat,
clearwindow,
write("1. Добавить факт"), nl,
write("2. Удалить факт"), nl,
write("3 Просмотреть факт"), nl,
write("4. Выход из программы"), nl, nl,
write("Нажмите клавишу 1, 2, 3 или 4"), nl,
readln(X), nl,
run(X),
X=4,!.
/* Добавить факт */
run(1):-
makewindow(2, 7, 7, "Добавить факт", 2, 20, 18,58),
shiftwindow(2),
write("Введите факт: "), nl,
write("Имя: "), readln(Name), nl,
write("Марка: "), readln(Marka), nl,
write("Цвет: "), readln(Color), nl,
assert(dcar(Name, Marka, Color)),
write(Name, " - добавлено в ДБД"), nl, !,
write("Нажмите любую клавишу"),
readchar( _ ), removewindow.
/* Удалить факт */
run(2):-
makewindow(3, 7, 7, "Удалить факт", 10, 30, 7, 40),
shiftwindow(3),
write("Введите имя: "), readln(Name),
retract(dcar(Name, _, _)),
write(Name, " - удалён из ДБД"), nl,!,
write("Нажмите любую клавишу"),
readchar( _ ), removewindow.
/* Просмотреть факт */
run(3):-
makewindow(4, 7, 7, " Просмотреть факт ", 7, 30, 16, 47),
shiftwindow(4),
write("Введите имя: "), readln(Name),
dcar(Name, Marka, Color), nl,
write("Имя: ", Name),
write("Марка: ", Marka),
write("Цвет: ", Color),
write("Нажмите любую клавишу"),
readchar( _ ), removewindow.
run(3):-
makewindow(5, 7, 7, " Неудачное имя ", 14, 7, 5, 60),
shiftwindow(5),
write("Такого имени в ДБД нет"), nl, !,
write("Нажмите любую клавишу"),
readchar( _ ), removewindow.
/* Выход из программы */
run(4):-
write("Хотите закончить работу? Ответьте (y или n) "),
readln(Ans),
frontchar(Ans, ’y’, _), !.
/* Неправильное обращение к ДБД */
run(X):-
X<1, error.
run(X):-
X>4, error.
error:-
write("Вводимое число должно быть от 1 до 4"),
write("Для продолжения работы нажмите любую клавишу"), readchar(_).
Для пояснения работы программы ниже на рис.5 показана схема взаимодействия её модулей с ДБД.
Рис. 5 Схема взаимодействия модулей программы с ДБД
Каждый модуль представляет собой правило. Модуль start задаёт цель. Его можно считать главным модулем программы.
Сначала модуль start передаёт управление модулю assert_database, который осуществляет начальную загрузку ДБД. Затем управление передаётся модулю menu и по окончании работы пользователя с ДБД главный модуль передаёт управление модулю очистки ДБД clear_database.
Модуль menu высвечивает на экране опции, предоставляемые пользователю, и даёт возможность выбора одной из них. После этого управление переходит к одному из модулей run(X), где X – целое число от 1 до 4.
Модуль run(1) предназначено для добавления фактов в ДБД. Этот модуль содержит окно для текста, просит пользователя ввести данные с клавиатуры, считывает их и заносит в ДБД новый факт. Затем модуль убирает созданное окно и возвращает управление модулю меню. Точкой возврата в модуль menu является подцель X=4, т.е. место, откуда было передано управление. Обратим внимание на технику, обеспечивающую повторный вызов модуля меню. Если пользователь введёт целое число не равное 4, то подцель X=4 становится неуспешной и произойдёт откат к предикату repeat. Предикат repeat включает в действие правило повторения:
repeat.
repeat:-repeat.
Правило повторения всегда успешно и, поэтому, предикат repeat, помещённый в модуле menu, обеспечивает повторение всех следующих за ним предикатов. Правило повторения в нашей программе размещается в начале раздела clauses. Но мы могли бы его поместить в любом другом месте этого раздела. Важно лишь оба предложения, составляющие это правило, расположить рядом. Кроме того, сам предикат repeat не является стандартным. Можно использовать для написания правила повторения любой другой, синтаксически верный предикат.
Например:
povtor.
povtor:- povtor.
Если пользователь набрал X=4, то при возврате в модуль menu подцель X=4 будет успешной, и произойдёт выход из menu и возврат в модуль start.
Модуль run(2) используется для удаления факта из ДБД. Здесь также создаётся своё окно, запрашивается у пользователя имя владельца автомобиля и удаляется из ДБД факт, содержащий информацию об этом автомобиле.
Назначением модуля run(3) является поиск фактов, содержащихся в ДБД. Этот модуль также создаёт своё окно, а затем запрашивает у пользователя имя владельца. Если в ДБД находится факт с указанным именем, то производится выборка данных и вывод на экран всех объектов с помощью предиката write.
Если в ДБД отсутствует факт с введенным именем, то программа выдаёт сообщение об ошибке, что предусмотрено другим вариантом модуля run(3).
Модуль run(4) обеспечивает нормальное окончание сеанса работы с ДБД. Этот модуль не создаёт своего окна, поскольку сообщения здесь короткие. Модуль требует от пользователя чёткого ответа на вопрос, хочет ли он окончить работу с программой. Стандартный предикат frontchar(A, "y", _ ) успешен только в том случае, если ответ пользователя начинается с символа y. Если же вводится другой символ, то предикат неуспешен и произойдёт возврат к предикату repeat модуля menu.
Аккуратно написанная программа должна надлежащим образом реагировать на допущенные пользователем ошибки при вводе. Если пользователь введёт число, меньшее 1 или больше 4, то будет работать одно из правил run(X), предназначенных для обработки неправильных обращений к ДБД. Пользователь получает сообщение о необходимости ввести число от 1 до 4.