ПАВЛОДАрский государственный 


Мы поможем в написании ваших работ!



ЗНАЕТЕ ЛИ ВЫ?

ПАВЛОДАрский государственный



ПАВЛОДАрский государственный

Педагогический ИНСТИТУТ

 

КАБЕНОВ Д.И.

 

 

Практикум решения задач

По курсу «Основы искусственного интеллекта»

 

учебно-методическое пособие

для студентов, обучающихся по специальности «Информатика»

 

ПАВЛОДАр 2014


Рассматриваются типовые задачи и контрольные задания по курсу «Основы искусственного интеллекта». Пособие может быть использовано при организации самостоятельной работы студентов по выполнению заданий в среде Visual Prolog

 

Учебно-методическое пособие предназначено для студентов, обучающихся по специальности «информатика», а также может использоваться всеми, кто интересуется вопросами логического программирования.

 


ОГЛАВЛЕНИЕ

Введение……………………………………………..……………….4

1. Основы ПРОЛОГа……………………………………………….5

1.1. Cреда Visual Prolog: основные понятия, интерфейс……….5

1.2 Набор, редактирование и тестирование простейших
программ в режиме Test Goal…………………………………….7

1.3 Создание простейших проектов…………………………….13

1.4 Поиск с возвратом……………………………………………17

1.5 Управление поиском с возвратом: предикаты fail и отсечения ………………………………………………………...20

1.6 Арифметические вычисления……………………………….25

1.7 Рекурсия………………………………………………………28

1.8 Решение логических задач в ПРОЛОГе…………………….32

1.9 Списки………………………………………………………...36

2. Разработка графического интерфейса пользователя….....41

2.1 Создание простейших проектов с графическим интерфейсом………………………………………………….......41

2.2 Создание новых окон в проекте с использованием
кнопок и полей ввода…………………………………………….45

2.3 Использование элемента ListBox…………………………..51

3. Создание экспертных систем средствами ПРОЛОГа…...54

Литература……………………………………………..…………....61


Введение

 

Предлагаемое методическое пособие представляет собой описание лабораторных работ по курсу «Основы искусственного интеллекта» и предназначено для студентов, обучающихся по специальности «Информатика».

Основная цель пособия – помощь студентам в подготовке к выполнению лабораторных работ.

Целью выполнения данных лабораторных работ является приобретение студентами навыков работы в среде Visual Prolog (формальная постановка задачи, преобразование в форму, пригодную для программирования на Прологе, трассировка и оценка результатов) а также закрепление теоретических знаний, полученных при прослушивании курса лекций «Основы искусственного интеллекта».

Пособие содержит необходимый теоретический материал, примеры решения задач и задания по программированию на языке Пролог.

К каждому разделу приводятся несколько типовых задач с решениями, что позволяет студентам самостоятельно подготовиться к выполнению лабораторной работы.

В качестве результата выполнения лабораторной работы студентом должен быть подготовлен отчет о проделанной работе, который включает:

1. Постановку задачи

2. Входные/Выходные данные (при необходимости)

3. Текст программы на языке Пролог (с необходимыми комментариями)

4. Трассировку программы

5. Результаты тестирования (наборы входных и выходных данных).

В настоящем пособии приводится список литературы, которая может быть использована при подготовке к лабораторным работам.

 


1. Основы ПРОЛОГа

1.1. Cреда Visual Prolog: основные понятия, интерфейс.

Prolog является языком, основанным на программировании логики (PROgramming in LOGic). Вместо детальных инструкций, предписывающих как решать ту или иную задачу, программист на языке Prolog уделяет основное внимание описанию задачи.

В среде Visual Prolog используется подход, получивший название «визуальное программирование», при котором внешний вид и поведение программ определяются с помощью специальных графических средств проектирования без традиционного программирования на алгоритмическом языке.

Visual Prolog автоматизирует построение сложных процедур и освобождает программиста от выполнения тривиальных операций. С помощью Visual Prolog проектирование пользовательского интерфейса и связанных- с ним окон, диалогов, меню, линии уведомлений о состояниях и т.д. производится в графической среде. С созданными объектами сразу же могут работать различные Кодовые Эксперты (Code Experts), которые используются для генерации базового и расширенного кодов на языке Prolog, необходимых для обеспечения их функционирования.

В Visual Prolog входят интерактивная среда визуальной разработки (VDE — Visual Develop Environment), которая включает текстовый и различные графические редакторы, инструментальные средства генерации кода, конструирующие управляющую логику (Experts), а также являющийся расширением языка интерфейс визуального программирования (VPI — Visual Programming Interface), Пролог-компилятор, набор различных подключаемых файлов и библиотек, редактор связей, файлы, содержащие примеры и помощь.

Visual Prolog поддерживается различными ОС, в том числе MS-DOS PharLap-Extended DOS, всеми версиями Windows, 16- и 32-битовыми целевыми платформами OS/2, а также некоторыми другими системами, требующими графического пользовательского интерфейса.

В зависимости от выбранного интерфейса разработчику обеспечивается доступ к множеству генераторов кода (Code Expert), всевозможным ресурсным редакторам и особым дополнительным VPI-предикатам, определениям и библиотекам. Ресурсные редакторы применяются для создания, компоновки и редактирования окон, диалогов, меню, панелей инструментов, строк помощи, строковых таблиц, ярлыков, курсоров, битовых карт и оперативной помощи. Генераторы кода на основе подобных структур создают необходимый первичный Prolog-код. В результате появляется первичный код («скелет»), готовый для компиляции, редактирования связей и выполнения.

Интерфейс Visual Prolog включает: главное меню, панель инструментов, окно проекта. Если во время последнего использования системы Visual Prolog там был открытый проект, то система автоматически вновь откроет этот проект.


На рис.1 изображен внешний вид среды Visual Prolog после запуска. В окне проекта отображаются модули открытого проекта route.prj: karta.pro, route.pro, VPITools.pro.

 

кнопки для работы с компонентами проекта
компоненты проекта

рис.1. Среда разработки Visual Prolog 6.1

 

Левая панель кнопок в окне проекта позволяет выбирать нужный компонент проекта: модуль, окно, меню и т.д. С помощью кнопок правой панели выбранный компонент можно редактировать(кнопка Edit), удалять(кнопка Delete), а также добавлять новый(кнопка New).

Пункт меню File содержит команды для работы с файлами. Чтобы создавать новое окно редактирования, можно использовать команду File | New. Эта команда создаст новое окно редактора с заголовком "NONAME".

В меню Edit представлены команды, позволяющие редактировать текст программы. Встроенный редактор системы по интерфейсу похож на обычный текстовый редактор. Можно производить вырезку, копирование и вставку текста, операции Отмена/Восстановление, которые можно активизировать из меню Edit. Также меню Edit показывает "горячие клавиши", связанные для этих действий.

Пункт меню Project содержит команды для работы с проектом: создать новый, открыть, запустить и т.д. Запуск проекта на исполнение выполняется нажатием кнопки <R> на панели инструментов (или F9, или с помощью команд меню Project | Run).

Команды меню Options позволяют выполнять настройку проекта, устанавливать необходимые параметры.

ЗАДАНИЯ ДЛЯ САМОСТОЯТЕЛЬНОЙ РАБОТЫ

Запустите среду Visual Prolog. Откройте проект, указанный преподавателем. Запустите его на исполнение и проверьте его работу.


Пример 1.

Имеется база данных, содержащая следующие факты:

родитель(илья, марина).

родитель(марина, ира).

родитель(елена, иван).

родитель(николай, ира).

родитель(ольга, алексей).

родитель(марина, саша).

родитель(сергей, иван).

Определить:

1) верно ли, что Марина является родителем Саши;

2) верно ли, что Алексей является родителем Ольги;

3) кто является ребенком Николая;

4) кто родители Ивана;

5) всех родителей и их детей.

Решение.

1. Запустите среду Visual Prolog. Закройте окно проекта (если оно открыто) и откройте новый файл (File|New) (рис.2)

В появившемся окне наберите текст программы, содержащий разделы: PREDICATES (описание предиката родитель), CLAUSES (перечисляются имеющиеся факты) и GOAL (запрос).


рис.2. Рабочее окно редактора

DOMAINS

имя=string

PREDICATES

nondeterm родитель(имя, имя)

CLAUSES

родитель(илья, марина).

родитель(марина, ира).

родитель(елена, иван).

родитель(николай, ира).

родитель(ольга, алексей).

родитель(марина, саша).

родитель(сергей, иван).

GOAL

родитель(марина, саша).

 

Запустите и протестируйте программу с помощью команды Project | Test Goal (можно использовать кнопку на панели инструментов <G> или сочетание клавиш <Ctrl>+<G>). Результат выполнения программы будет выведен в отдельном окне

рис3. Окно вывода результата

Указание: перед следующим запуском программы следует закрыть это окно.

 

2. Для ответа на вопрос: верно ли, что Алексей является родителем Ольги, измените запрос:

GOAL

родитель(алексей, ольга).

После запуска программы (Project | Test Goal) будет получен ответ:

no


3. Для ответа на вопрос: кто является ребенком Николая, запишите цель:

GOAL

родитель(николай, X).

Результат:

X=ира

1 Solution

 

4. Для ответа на вопрос: кто родители Ивана, укажите запрос:

GOAL

родитель(X, иван), родитель(Y, иван), X<>Y.

 

Результат:

X=елена, Y=сергей

X=сергей, Y=елена

2 Solutions

 

5. Для определения всех родителей и их детей, запишите:

GOAL

родитель(X, Y).

Результат:

X=илья, Y=марина

X=марина, Y=ира

X=елена, Y=иван

X=николай, Y=ира

X=ольга, Y=алексей

X=марина, Y=саша

X=сергей, Y=иван

7 Solutions

Пример 2

Имеются факты вида: родитель(имя, имя) и женщина(имя).

а) составить правило мать и определить, кто мать Маши.

Решение:

DOMAINS

имя=string

PREDICATES

родитель(имя, имя)

женщина(имя)

мать(имя,имя)

CLAUSES

родитель("Марина","Ирина").

родитель("Елена", "Анна").

родитель("Ольга","Марина").


родитель("Ольга","Татьяна").

родитель("Татьяна","Катя").

родитель("Анна", "Маша").

женщина("Ольга").

женщина("Маша").

женщина("Ирина").

женщина("Елена").

женщина("Анна").

женщина("Марина").

женщина("Татьяна ").

женщина("Катя").

мать(X,Y):-родитель(X,Y),женщина(X).

GOAL

мать(X,"Маша").

Результат:

X=Анна

1 Solution

 

b) составить правило бабушка и определить, кто бабушка Маши.

Решение:

DOMAINS

имя=string

PREDICATES

nondeterm родитель(имя,имя)

женщина(имя)

nondeterm мать(имя,имя)

nondeterm бабушка(имя,имя)

CLAUSES

родитель("Марина","Ирина").

родитель ("Елена", "Анна").

родитель("Ольга","Марина").

родитель("Ольга","Татьяна").

родитель("Татьяна","Катя").

родитель ("Анна", "Маша").

женщина("Ольга").

женщина("Маша").

женщина("Ирина").

женщина("Елена").

женщина("Анна").

женщина("Марина").

женщина("Татьяна ").

женщина("Катя").

мать(X,Y):-родитель(X,Y),женщина(X).

бабушка(X,Z):-мать(X,Y),родитель(Y,Z).

GOAL

бабушка(X,"Маша").


Результат:

X=Елена

1 Solution

 

Замечание: ключевое слово nondeterm определяет недетерминированные предикаты, которые могут совершать откат назад и генерировать множественные решения. Таким образом, если задача предполагает возможность получения несколько решений, следует объявлять предикаты как недетерминированные.

 

c) составить правило внучка и определить, сколько внучек у Ольги и как их зовут.

Решение:

DOMAINS

имя=string

PREDICATES

nondeterm родитель(имя,имя)

женщина(имя)

nondeterm мать(имя,имя)

nondeterm бабушка(имя,имя)

nondeterm внучка(имя,имя)

CLAUSES

родитель("Марина","Ирина").

родитель ("Елена", "Анна").

родитель("Ольга","Марина").

родитель("Ольга","Татьяна").

родитель("Татьяна","Катя").

родитель("Анна", "Маша").

женщина("Ольга").

женщина("Маша").

женщина("Ирина").

женщина("Елена").

женщина("Анна").

женщина("Марина").

женщина("Татьяна ").

женщина("Катя").

мать(X,Y):-родитель(X,Y),женщина(X).

бабушка(X,Z):-мать(X,Y),родитель(Y,Z).

внучка(X,Y):-бабушка(Y,X),женщина(X).

GOAL

внучка(X, "Ольга").

Результат:

X=Ирина

X=Катя

2 Solutions


ЗАДАНИЯ ДЛЯ САМОСТОЯТЕЛЬНОЙ РАБОТЫ

1. Имеется база данных, содержащая следующие факты:

любит(“Aнна,” яблоки).

любит(“Сергей”, бананы).

любит(“Андрей”, яблоки).

любит(“Света”, шоколад).

любит(“Вова”, шоколад).

любит(“Анна”, шоколад).

любит(“Света”, апельсины).

любит(“Вова”, бананы).

Составить программу, определяющую:

a) всех, кто любит бананы;

b) кто любит и шоколад, и яблоки;

c) что любит Вова;

d) что любят и Света, и Вова.

2. Имеется база данных, содержащая следующие факты:

играет (“Саша”, футбол).

играет (“Катя”, теннис).

играет (“Саша”, теннис).

играет (“Андрей”, футбол).

играет (“Олег”, футбол).

играет (“Ольга”, теннис).

играет (“Катя”, волейбол).

играет (“Олег”, волейбол).

Составить программу, определяющую:

a) каким видом спорта увлекается Андрей;

b) всех, кто играет в волейбол;

c) каким видом спорта увлекаются и Ольга, и Саша;

d) кто увлекается и футболом, и волейболом.

3. Имеется база данных, содержащая следующие факты:

любит(“Aнна,” яблоки).

любит(“Сергей”, бананы).

любит(“Андрей”, яблоки).

любит(“Света”, шоколад).

любит(“Вова”, шоколад).

любит(“Анна”, шоколад).

любит(“Света”, апельсины).

любит(“Вова”, бананы).

фрукты(яблоки).

фрукты(бананы).

фрукты(апельсины).

конфеты(шоколад).

a) используя имеющиеся факты, составить новое правило люб_фрукты (Х) и определить всех, кто любит фрукты;


b) используя имеющиеся факты, составить новое правило люб_конфеты (Х) и определить всех, кто любит конфеты;

c) используя имеющиеся факты, составить правило люб_вкусное ) и определить всех, кто любит и фрукты, и конфеты.

4. Имеется база данных, содержащая следующие факты:

играет (“Саша”, футбол).

играет (“Катя”, теннис).

играет (“Саша”, теннис).

играет (“Андрей”, футбол).

играет (“Олег”, футбол).

играет (“Ольга”, теннис).

играет (“Катя”, волейбол).

играет (“Олег”, волейбол).

женщина(“Катя”).

женщина(“Ольга”).

мужчина(“Саша”).

мужчина(“Андрей”).

мужчина(“Олег”).

a) используя имеющиеся факты, составить новое правило волейбол_жен(Х) и определить всех женщин, играющих в волейбол;

b) используя имеющиеся факты, составить новое правило футбол_муж(Х) и определить всех мужчин, играющих в футбол;

c) используя имеющиеся факты, составить правило теннис_пара(Х,Y), позволяющее найти смешанную теннисную пару (мужчина+женщина). Определить все такие пары.

 

Отчет о выполненной самостоятельной работе должен содержать:

1) тему лабораторной работы;

2) условие задачи;

3) листинг программы;

4) результаты ее тестирования.

Пример.

Заданы отношения-факты:

родитель(“Иван”,”Катя”).

родитель(“Анна”,” Олег ”).

родитель(“Олег”,”Дима”).


родитель(“Игорь”,”Ольга”).

родитель(“Олег”,”Виктор”).

родитель(“Игорь”,”Иван”).

мужчина(“Дима”).

мужчина(“Иван”).

мужчина(“Игорь”).

мужчина(“Олег”).

мужчина(“Виктор”).

женщина(“Катя”).

женщина(“Ольга”).

женщина(“Анна”).

Составить новое отношение-правило дед(X,Y) и определить, кто является дедушкой Кати. Создать проект и протестировать пример как автономную исполняемую программу.

Решение

1. Запустите среду Visual Prolog и создайте новый проект (Project | New Project), активизируется окно Application Expert (эксперт приложения).

2. Определите имя проекта (Primer) и базовый каталог, куда будет сохранен проект (например, D:\VP\Primer)

 

рис.4. Окно Application Expert

 

На вкладке Target установите параметры и нажмите кнопку Create для создания проекта (рис. 5):


рис.5. Установки на вкладке Target окна Application Expert

 

3. Откройте окно Compiler Options (Options | Project | Compiler Options), откройте вкладку Warnings и установите опции компилятора для созданного проекта (рис.6):

рис.6. Установки опций компилятора

Нажмите OK.

4. В окне проекта выделите файл Primer.pro и откройте его для редактирования (двойной щелчок или кнопка Edit)

 

рис.7. Окно проекта


Файл с расширением.pro содержит секции PREDICATES, GOAL, CLAUSES. Допишите необходимые определения так, чтобы получилась программа:

DOMAINS

имя=string

PREDICATES

родитель(имя,имя)

женщина(имя)

мужчина(имя)

дед(имя, имя)

CLAUSES

родитель("Иван","Катя").

родитель("Анна","Олег").

родитель("Олег","Дима").

родитель("Игорь","Ольга").

родитель("Олег","Виктор").

родитель("Игорь","Иван").

мужчина("Дима").

мужчина("Иван").

мужчина("Игорь").

мужчина("Олег").

мужчина("Виктор").

женщина("Катя").

женщина("Ольга").

женщина("Анна").

дед(X,Z):-родитель(X,Y), родитель(Y,Z),

мужчина(X).

GOAL

дед(X,"Катя"),write(X).

5. Откомпилируйте исходный код примера и запустите его как автономную исполняемую программу. (Project | Run, или клавиша <F9>, или кнопка <R>). Результат выполнения программы должен отобразиться в окне:

 

рис.8. Окно вывода результата

ЗАДАНИЯ ДЛЯ САМОСТОЯТЕЛЬНОЙ РАБОТЫ

Доработайте исходный код примера следующим образом:

1) добавьте новое правило бабушка и определите, кто является бабушкой;

2) добавьте новое правило внук и определите, кто внук Анны;

3) добавьте новое правило брат и определите, кто брат Димы;

4) добавьте новое правило сестра и определите, кто сестра Ивана.


Отчет о выполненной самостоятельной работе должен содержать:

1) тему лабораторной работы;

2) условие задачи;

3) полный окончательный код примера;

4) результаты ее тестирования.

Поиск с возвратом

Поиск с возвратом (backtracking) – это один из основных приемов поиска решений поставленной задачи в ПРОЛОГ’е. Выполняя поиск, ПРОЛОГ может столкнуться с необходимостью выбора между альтернативными путями. Тогда он ставит маркер у места развилки (точка отката) и выбирает первую подцель. Если она не выполняется, то ПРОЛОГ возвращается в точку отката и переходит к следующей подцели.

Среда Visual Prolog позволяет использовать отладчик для пошагового выполнения программы. Отладчик работает с откомпилированным кодом. В исходном коде можно ставить точки останова и выполнять программу по шагам. В режиме пошагового выполнения программы можно просматривать значения переменных и содержимое утвержденных фактов.

Пример

Имеется база данных, содержащая факты вида отдыхает(имя, город ), украина(город), россия(город),прибалтика(город). Составить правило, позволяющее определить, кто отдыхал в России.

Проследить поиск решения задачи с помощью отладчика Visual Prolog и построить целевое дерево поиска с возвратом.

Решение:

1. Создайте новый проект (Project | New Project) и наберите текст программы:

DOMAINS

имя, город=string

PREDICATES

отдыхает(имя, город)

украина(город).

россия(город).

прибалтика(город).

отдых_Россия(имя)

CLAUSES

отдыхает(sasha, antalia).

отдыхает(anna, sochi).

отдыхает(dima, urmala).

отдыхает(oleg, kiev).

украина(kiev).

россия(sochi).

прибалтика(urmala).


отдых_Россия(X):-

отдыхает(X,Y),

россия(Y).

GOAL

отдых_Россия(X),

write(X),nl.

 

3. Сохраните проект (Project | Save Project)

 

4. Запустите его на исполнение (Project | Run, или клавиша <F9>, или кнопка <R>). Результат выполнения программы:

anna

 

5. Проследите поиск этого решения с помощью отладчика(Debugger). Для этого:

а) запустите отладчик (Project | Debug);

б) в окне отладчика выберите команду View | Local Variables (для просмотра текущих значений переменных);

в) нажимайте клавишу <F7> (или Run | Trace Into) для пошагового выполнения программы, текущие значения переменных отображаются в окне Variables For Current Clause

 

 

рис.9. Окно отладчика


Поиск решения можно представить следующим образом:

решение: X= anna

рис.10. Целевое дерево поиска решения

ЗАДАНИЯ ДЛЯ САМОСТОЯТЕЛЬНОЙ РАБОТЫ

1. База данных содержит следующие факты:

увлекается(“Коля”, гитара).

увлекается(“Оля”, скрипка).

увлекается(“Дима”, плаванье).

увлекается(“Таня”, теннис).

спорт(плаванье).

спорт(теннис).

муз_инстр(скрипка).

муз_инстр(гитара).

а) составить правило спортсмен и определить, кто увлекается спортом;

б) проследить за поиском решения с помощью отладчика;

в) построить целевое дерево поиска с возвратом.

 

2. База данных содержит следующие факты:

увлекается(“Дима”, плаванье).

увлекается(“Таня”, теннис).

увлекается(“Коля”, гитара).

увлекается(“Оля”, скрипка).

спорт(плаванье).

спорт(теннис).

муз_инстр(скрипка).

муз_инстр(гитара).

а) составить правило музыкант и определить, кто увлекается музыкой;

б) проследить за поиском решения с помощью отладчика;

в) построить целевое дерево поиска с возвратом.


Отчет о выполненной самостоятельной работе должен содержать:

1) тему лабораторной работы;

2) условие задачи;

3) листинг программы;

4) результаты ее тестирования;

5) целевое дерево поиска решения.

Пример 1

База данных содержит факты вида: student(имя, курс). Создать проект, позволяющий сформировать список студентов 1-го курса.

Решение:

PREDICATES

student(symbol,integer)

spisok

CLAUSES

student(vova,3).

student(lena,1).

student(dima,1).

student(ira,2).

student(marina,1).

spisok:-student(X,1),write(X),nl,fail.

GOAL

write("Список студентов 1-курса"),nl,spisok.

Результат выполнения программы:

Список студентов 1-курса

lena

dima

marina


Пример 2

База данных содержит факты вида father(name, name). Создать проект, позволяющий определить кто чей отец.

Решение:

DOMAINS

name=symbol

PREDICATES

father (name, name)

everybody

CLAUSES

father ("Павел", "Петр").

father ("Петр", "Михаил").

father ("Петр", "Иван").

everybody:- father (X, Y),

write(X," - это отец",Y,"а"),nl,

fail.

GOAL

everybody.

Результат выполнения программы:

Павел - это отец Петра

Петр - это отец Михаила

Петр - это отец Ивана

Пример 3

Создать проект, реализующий железнодорожный справочник. В справочнике содержится следующая информация о каждом поезде: номер поезда, пункт назначения и время отправления.

а) вывести всю информацию из справочника.

Решение:

DOMAINS

nom=integer

p, t=string

PREDICATES

poezd(nom,p,t)

CLAUSES

poezd(233,moskva,"12-30").

poezd(257,moskva,"22-40").

poezd(133,armavir,"10-20").

poezd(353,armavir,"20-40").

poezd(353,adler,"02-30").

poezd(413,adler,"11-10").

poezd(256,piter,"21-30").

GOAL

write(" Расписание поездов"), nl,

write("Номер Пункт прибытия Время отправления"),

nl, poezd(N,P,T), write(N," ",P," ",T),nl,fail.


Пример 4

Имеется база данных, содержащая данные о спортсменах: имя и вид спорта. Определить возможные пары одного из спортсменов-теннисистов с другими теннисистами.

Решение:

DOMAINS

имя,вид_сп=string

PREDICATES

играет(имя,вид_сп)

спис_спортс

CLAUSES

играет("Саша",теннис).

играет("Аня",волейбол).

играет("Олег",футбол).

играет("Коля",теннис).

играет("Саша",футбол).

играет("Андрей",теннис).

спис_спортс:- играет(X,теннис),!,играет(Y,теннис),

X<>Y,write(X,"-",Y),nl,fail.

GOAL

write("Пары теннисистов"),nl,

спис_спортс.

Результат выполнения программы:

Пары теннисистов

Саша-Коля

Саша-Андрей

 

Пример 5

Студенту в зависимости от набранной в процессе обучения суммы баллов Z присваивается квалификация:

магистр (М), если 80<=Z<=100

специалист (S), если 60<= Z< 80

бакалавр (B), если 40<= Z< 60

неудачник (N), если 0<=Z< 40

Составить программу, которая определит квалификацию в зависимости от введенного значения Z

Решение:

Для решения задачи составим правило grade, устанавливающее связь между количеством баллов (z) и квалификацией (r). Правило состоит из нескольких частей. Первые две части обеспечивают проверку недопустимых значений Z с выводом соответствующего сообщения. Остальные части правила определяют квалификацию в зависимости от значения Z.

DOMAINS

z=integer

r=string


PREDICATES

grade(z,r)

CLAUSES

grade(Z,""):-Z<0,!, write("Неверный ввод данных!").

grade(Z,""):-Z>100,!,write("Неверный ввод данных!").

grade(Z,"M"):-Z>=80,!.

grade(Z,"S"):-Z>=60,!.

grade(Z,"B"):-Z>=40,!.

grade(Z,"N").

GOAL

write("Z="), readint(Z), grade(Z,R),write(R).

Комментарий: readint – стандартный предикат ввода целочисленного значения

Результат выполнения программы:

1-й случай:

Z=88

M

2-й случай:

Z=65

S

3-й случай:

Z=39

N

4-й случай:

Z=110

Неверный ввод данных!

ЗАДАНИЯ ДЛЯ САМОСТОЯТЕЛЬНОЙ РАБОТЫ

1. База данных содержит факты вида: отдыхает(имя, город), украина(город), россия(город), женщина (имя), мужчина(имя).

а) вывести список женщин, отдыхающих в России;

б) вывести список мужчин, отдыхающих на Украине.

2. База данных содержит факты вида: книга(автор, название, издательство, год_издания), украина(город).

а) вывести весь список книг;

б) вывести список книг авторов Пушкина и Чехова;

в) вывести список книг, изданных в издательстве «Питер» не ранее 2000 года.

3. Составить программу, реализующую авиасправочник. В справочнике содержится следующая информация о каждом рейсе: номер рейса, пункт назначения, время вылета, дни(ежедн., чет, нечет). Вывести:

а) всю информацию из справочника;

б) информацию о самолетах, вылетающих в заданный пункт по четным дням;


в) информацию о самолетах, вылетающих ежедневно не позже указанного времени.

4. Составить программу, реализующую географический справочник. В справочнике содержится следующая информация о каждой стране: название страны, название столицы, численность населения, географическое положение (Европа или Азия). Вывести:

а) всю информацию из справочника;

б) информацию о странах, численность населения которых превышает заданное значение;

в) информацию о европейских странах, численность населения которых не превышает заданное значение.

5. Составить программу, реализующую словарь. В словаре содержится следующая информация: слово и его перевод (русские и английские слова). Реализовать вывод всего словаря, перевод с русского на английский, с английского на русский (с несколькими значениями).

6. Составить программу, реализующую телефонный справочник. В справочнике содержится следующая информация о каждом абоненте: имя и телефон. Реализовать вывод всей информации из справочника, поиск телефона по имени, поиск имени по телефону

7. База данных содержит факты вида: ученик(имя, класс) и увлекается(имя, хобби). Составить программу, которая выводит:

а) список всех учеников и их увлечения;

б) подбирает одному из учеников указанного класса, увлекающемуся кино, пару из других классов. Вывести все возможные пары.

8. База данных содержит факты вида: ученик(имя, класс) и играет(имя, вид_спорта). Составить программу, которая:

а) выводит список всех учеников заданного класса и вид спорта, которым они увлекаются;

б) подбирает одному из учеников указанного класса, играющему в бадминтон, пару из других классов. Вывести все возможные пары.

 

Отчет о выполненной самостоятельной работе должен содержать:

1) тему лабораторной работы;

2) условие задачи;

3) листинг программы;

4) результаты ее тестирования с различными исходными данными.

Арифметические вычисления

Хотя Пролог не предназначен для решения вычислительных задач, его возможности вычислений аналогичны соответствующим возможностям таких языков программирования как Basic, C, Pascal.

В языке Пролог имеется ряд встроенных функций для вычисления арифметических выражений, некоторые из которых перечислены в таблице 1.


Таблица 1. Математические операции и функции в Прологе

X + Y Сумма X и Y
X – Y Разность X и Y
X * Y Произведение X и Y
X / Y Деление X на Y
X mod Y Остаток от деления X на Y
X div Y Целочисленное деление X на Y
abs(X) Абсолютная величина числа X
sqrt(X) Квадратный корень из X
random(X) Случайное число в диапазоне от 0 до 1
random(Int,X) Случайное целое число в диапазоне от 0 до Int
round(X) Округление Х
trunc(X) Целая часть Х
sin(X) Синус X
cos(X) Косинус X
arctan(X) Арктангенс Х
tan(X) Тангенс X
ln(X) Натуральный логарифм X
log(X) Логарифм Х по основанию 10

Пример 1.

Вычислить значение выражения Z=(2*X+Y)/(X-Y) для введенных X и Y.

Решение:

PREDICATES

знач_выраж(real,real)

CLAUSES

знач_выраж(X,Y):-X<>Y, Z=(2*X+Y)/(X-Y),

write("Z=",Z);

write ("Делить на 0 нельзя!").

GOAL

Write("X="),readreal(X),

Write("Y="),readreal(Y),знач_выраж(X,Y),nl.

Комментарий: readreal – предикат для ввода действительных чисел

Результат выполнения программы:

1-й случай:

X=4

Y=4

Делить на 0 нельзя!

2-й случай:

X=5

Y=2

Z=4


Пример 2.

Найти минимальное из двух введенных A и B.

Решение:

PREDICATES

min(integer,integer,integer)

CLAUSES

min(A,B,A):-A<=B,!.

min(A,B,B).

GOAL

Write("A="),readreal(A),Write("B="),readreal(B),

min(A,B,Min),write("min=",Min),nl.

Результат выполнения программы:

1-й случай:

A=5

B=17

min=5

2-й случай:

A=35

B=18

min=18

3-й случай:

A=8

B=8

min=8

 

Пример 3.

Определить, является четным или нечетным случайным образом выбранное число от 0 до 20.

Решение:

PREDICATES

chet

CLAUSES

chet:-random(20,X),write(X),X mod 2=0,

write(" - четное"),!.

chet:-write(" - нечетное").

GOAL

chet.

 

Результат выполнения программы:

1-й случай:

6 – четное

2-й случай:

19 – нечетное


ЗАДАНИЯ ДЛЯ САМОСТОЯТЕЛЬНОЙ РАБОТЫ

1. Составить программу для вычисления значения выражения Y=(X2+1)/(X-2) для введенного X.

2. Составить программу для вычисления значения выражения S=2(X2+Y2)/(X+Y) для введенных X и Y.

3. Составить программу для вычисления значения выражения z=exsinx +3lnx для введенного X.

4. Составить программу для вычисления значения выражения y=ln(lg(sinx+ex))для введенного X.

5. Составить программу для вычисления среднего арифметического двух введенных чисел.

6. Составить программу для вычисления среднего геометрического двух введенных чисел.

7. Составить программу для проверки введенного натурального числа на четность.

8. Составить программу для проверки попадает ли введенное число X в заданный промежуток [a,b].

9. Составить программу для выбора наименьшего из трех введенных чисел.

10. Составить программу для выбора наибольшего из трех введенных чисел.

 

Отчет о выполненной самостоятельной работе должен содержать:

1) тему лабораторной работы;

2) условие задачи;

3) листинг программы;

4) результаты ее тестирования с различными исходными данными.

Рекурсия

Рекурсивная процедура – это процедура, вызывающая сама себя до тех пор, пока не будет соблюдено некоторое условие, которое остановит рекурсию. Такое условие называют граничным. Рекурсивное правило всегда состоит по крайней мере из двух частей, одна из которых является нерекурсивной. Она и определяет граничное условие.

В рекурсивной процедуре нет проблемы запоминания результатов ее выполнения, потому что любые вычисленные значения можно передавать из одного вызова в другой как аргументы рекурсивно вызываемого предиката. Рекурсия является эффективным способом для решения задач, содержащих в себе подзадачу такого же типа.

Пример 1.

База данных содержит следующие факты:

roditel(ivan,oleg).

roditel(inna,oleg).

roditel(oleg,dima).

roditel(oleg,marina).


Составить рекурсивное правило предок и определить всех предков и их потомков.

Решение:

DOMAINS

name=string

PREDICATES

roditel(name,name)

predok(name,name)

CLAUSES

roditel(ivan,oleg).

roditel(inna,oleg).

roditel(oleg,dima).



Поделиться:


Последнее изменение этой страницы: 2016-04-08; просмотров: 497; Нарушение авторского права страницы; Мы поможем в написании вашей работы!

infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 18.191.88.249 (0.564 с.)