Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
методическое пособие по ЛБ.doc
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
620.54 Кб
Скачать

Лабораторная работа «Организация пользовательского меню»

Тема: организация пользовательского меню.

Цель работы: создать пользовательское меню средствами встроенных предикатов 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. Создайте цель для использования предиката выбор_меню.