Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
1414-Лекции.doc
Скачиваний:
29
Добавлен:
25.12.2018
Размер:
419.84 Кб
Скачать

/* Программа работы с дбд*/

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.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]