Поволжский Государственный Университет...

91
Поволжский Государственный Университет Телекоммуникаций и Информатики Факультет ИСТ Кафедра ИВТ Visual Prolog ЛР Автор-составитель: Акчурин Э.А. д.т.н., профессор Рецензент: Тарасов В.Н. д.т.н., профессор Самара 2012

Upload: hadieu

Post on 02-Jul-2018

227 views

Category:

Documents


0 download

TRANSCRIPT

Поволжский Государственный Университет

Телекоммуникаций и Информатики

Факультет ИСТ

Кафедра ИВТ

Visual Prolog

ЛР

Автор-составитель: Акчурин Э.А. д.т.н., профессор

Рецензент: Тарасов В.Н. д.т.н., профессор

Самара

2012

2

Факультет информационных систем и технологий

Кафедра «Информатика и вычислительная техника»

Автор - д.т.н., профессор Акчурин Э.А.

Другие материалы по дисциплине Вы найдете на сайте

www.ivt.psuti.ru

3

Введение

Методическая разработка содержит лабораторные работы по логическому программированию с использованием ИСР Visual Prolog версии 7.3. Она может использоваться для магистров ИВТ.

Рекомендуемая литература:

1. Коста. Visual Prolog 7.1 для начинающих. Перевод с англ: И. Алексеев, Е.А. Ефимова. Prolog Development Center. 2008.

2. Visual Prolog 7.3 для начинающих. Встроенный в среду учебник. 3. Visual Prolog 7.3. Language Reference. Prolog Development Center. 2010 4. http://www.visual-prolog.com 5. Цуканова, Дмитриева. Логическое программирование на языке Visual

Prolog: уч. пособие для вузов – М: Горячая линия - Телеком, 2008 – 144 с. 6. Солдатова, Лёзина. Логическое программирование на языке Visual Prolog:

учебное пособие – Самара: СНЦ РАН, 2010 – 81.

Содержание отчета

Название работы.

Цель работы.

Задание в соответствии с вариантом.

Листинг программы.

Результаты исполнения.

Выбор варианта задания

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

Сохранение кодов

Чтобы файлы разных студентов не перепутывались друг с другом, каждому студенту следует создавать индивидуальные папки. Рекомендуется такая иерархия вложенных друг в друга папок:

Диск пользователя (устанавливается администратором) Папка Users (пользователи) Папка группы (например, ПО_11) Папка студента (например, Дробышев) Папка проекта (например, Hello)

В дисплейных классах в папке студента на каждом занятии следует сохранять свои файлы (одно задание лабораторной работы – один проект). Рекомендует-ся при выполнении работы периодически сохранять незавершенные проекты в текущем состоянии, чтобы избежать потерь документов при сбоях.

4

1. ИСР Visual Prolog

1.1. Знакомство с ИСР Visual Prolog

Предмет исследования

Изучение ИСР Visual Prolog.

Контрольные вопросы:

1. Назначение ИСР Visual Prolog. 2. Версии ИСР Visual Prolog. 3. Вход в ИСР Visual Prolog. 4. Главное окно ИСР Visual Prolog. 5. Меню ИСР Visual Prolog. 6. Получение справки о ИСР Visual Prolog.

Пример выполнения.

При запуске ИСР отображается ее стартовая страница.

5

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

New Project – новый проект.

Open Project – открыть проект, выделенный в списке.

Browse – поиск и выбор каталога для проекта.

Help – справка. Открыть учебник, встроенный в ИСР.

Из этого окна можно выбрать проект для работы.

ИСР имеет две реализации:

Полная платная версия.

Сокращенная бесплатная версия. В ней в левой позиции имеется пункт Purchase (покупка), позволяющий при желании перейти к платной версии.

Главное окно. Окно содержит меню и панель инструментов.

6

Строка меню содержит следующие пункты:

File (файл)

Edit (правка)

View (вид)

Insert (ввести)

Project (проект)

Build (построить)

Debag (отладка)

Go to (идти к)

Tools (инструменты)

Web (Интернет)

Window (окно)

Help (справка)

Пункт File (файл).

7

Пункт File (файл) содержит команды работы с файлами:

Команда Описание

New in New Package. Создать новую тему в новом пакете.

New in Existing Package Создать новую тему в существующем пакете.

Add Добавить.

Close Закрыть.

Open Открыть.

Save as… Сохранить как …

Print … Печать…

Exit Выход из ИСР

Пункт Edit (правка)

8

Пункт Edit (правка) содержит команды редактирования:

Команда Описание

Undo Отменить операцию

Redo Восстановить операцию

Cut Вырезать выделение

Copy Копировать выделение

Paste Открыть.

Delete Удалить выделение

Copy Position Копировать позицию выделенного

Find… Найти…

Find Next… Найти следующее…

Find in Files… Найти в файлах…

Replace Заменить выделенное…

Upper Case Верхний регистр…

Lower Case Нижний регистр…

Toggle Case Переключить регистр…

Comment Lines Сделать выделенные строки комментарием

Uncomment Lines Сделать выделенные строки не комментарием

Select All Выделить все

9

Пункт View (вид)

10

Пункт View (вид) содержит команды просмотра:

Команда Описание

Project Window Окно проекта

Error/Warnings Window Окно ошибок/предупреждений

Messages Сообщения

Text Windows Текстовые окна

Resource Windows Окна ресурсов

System Information Системная информация

Code Expert Эксперт Кода

Group Members Члены группы

Run Stack Запуск стека

Variables for Current Clause Переменные для текущей Клаузы

Facts Факты

Breakpoints Точки останова

Threads Нити

Modules Модули

Last Search Results Window Окно результатов последнего ноиска

TODO Делать

Disassembly Дизассмблер

Disassembly from Current Line Дизассмблер из текущей строки

Registers Регистры

Memory Dump 0 Дамп памяти 0

Memory Dump 1 Дамп памяти 1

Memory Dump 2 Дамп памяти 2

Memory Dump 3 Дамп памяти 3

Zoom In Увеличить масштаб

Zoom Out Уменьшить масштаб

Zoom Nornal Нормальный масштаб

Change Font Изменить шрифт

11

Пункт Insert (ввести)

Пункт Insert (ввести) содержит команды ввода в файл компонент:

Команда Описание

Constant Константа

Domain Домен

Class Класс

Interface Интерфейс

Predicate Предикат

Fact Факт

Qualification Квалификация

Insert New GUID Ввести новый GUID

RGB Value Значение RGB

Font Name Имя шрифта

File Name Имя файла

Directory Name Имя каталога

Include File Включить файл

Date Stamp Дата

12

Пункт Project (проект)

Пункт Project (проект) содержит команды работы с проектом:

Команда Описание

New Новый

Open Открыть

Close Закрыть

Save Сохранить

Settings Установки

13

Пункт Build (построить)

Пункт Build (построить) содержит команды построения проекта:

Команда Описание

Compile Компилировать

Build Построить

Rebuild All Перестроить все

Step Building Пошаговое построение

Execute Запустить

Run in Windows Запустить в Windows

Script Preview Предварительный просмотр сценария

14

Пункт Debag (отладка)

Пункт Debag (отладка) содержит команды отладки проекта:

Команда Описание

Run Запуск

Stop Debugging Остановить отладку

Break Program Выйти из программы

Restart Запуск повторный

Attach Process Прикрепить процесс

Step Over Шаг без останова в процедуре

Step Into Шаг с заходом в процедуру

Step Out Of Шаг выхода из процедуры

Run to Cursor Прогон до позиции курсора

Go to Executing Predicate Source Перейти к запуску исходника предиката

Break on Exception Выход по Исключению

Toggle Breakpoint Переключить точку прерывания

Remove All Breakpoints Удалить все точки прерывания

15

ПунктGo to (идти к)

Пункт Go to (идти к) содержит команды перемещения по проекту:

Команда Описание

Source Browser Браузер исходника

Go to Declaration Идти к объявлению

Go to Definition Идти к определению

Go to Related Files Идти к связанным файлам

Go to Resource Editor Идти к редактору исходника

Go to Line Number Идти к строке номер

Go to Position on Clipboard Идти к позиции в буфере обмена

Go to Next Error (Warning) Идти к следующей ошибке (предупреждению)

Go to Previous Error (Warn-ing)

Идти к предыдущей ошибке (предупреждению)

Go Back Идти назад

Locate in Project Tree Локализация в дереве проекта

16

ПунктTools (инструменты)

Пункт Tools (инструменты) содержит команды выбора инструментальных средств:

Команда Описание

Memory Profilier Профилировщик памяти

Configure Tools Средства конфигурирования

Source Control Repository Репозитарий управления исходником

IDE Variables Переменные ИСР

Options Опции

17

ПунктWeb (Интернет)

Пункт Web (Интернет) содержит команды доступа в Интернет:

Команда Описание

Tutorials Учебники

Wiki Wiki

Discussion Forum Форум обсуждений

Check for Update Проверить обновление

Knowledge Base База знаний

My Registration Моя регистрация

Visual Prolog Visual Prolog

Prolog Development Center Центр разработки Prolog

18

ПунктWindow (окно)

Пункт Window (окно) содержит команды выбора представления окна.

Команда Описание

Cascade Каскадное

Horisontal Tile Рядом по горизонтали

Vertical Tile Рядом по вертикали

Arrange Icons размещение иконок

Lock All Editor Windows together

Связать все окна редакторов

Close All Editor Windows except Active

Закрыть все окна редакторов кроме активного

Prune Editor Windows Окна черновиков редакторов

19

Пункт Help (справка).

Пункт Help (справка) содержит средства получения справки (доступны при под-ключенном Интернете):

Команда Описание

Visual Prolog Help Visual Prolog справка

Context Help Контекстная справка

Language Reference (wiki) Языковая ссылка (wiki)

Language Reference (book) Языковая ссылка (книга)

Getting Started Начальное обучение

Send Bug Report Послать отчет о дефектах

Enter License Получить лицензию

Install Examples Установить примеры

Restore File Associations Переустановить ИСР

About О производителе ИСР

20

Внимание. При запуске готовой программы Вы увидите окно диалога, в кото-ром будет предложено зарегистрировать персональную версию программы или купить платную версию. Для активизации - кнопка Activate.

Используем всегда кнопку Cancel, чтобы отложить активизацию.

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

21

1.2. Создание проекта

Во всех работах используются правила создания проекта.

ИСР автоматически создает шаблоны проекта, которые включают набор фай-лов. Функциональность проекта включается только в файл реализации.

После задания функциональности компилятор ИСР создает объектные фай-лы, из которых компоновщик формирует исполняемый файл – это итог про-граммы. Этот файл может быть запущен в операционной системе и без ИСР.

Рассмотрим порядок создания проекта.

Выберем команду Project/New в меню задач. Затем заполним диалоговое окно Project Settings. В нем нужно определить:

Имя проекта – Project Name: имя проекта.

Тип проекта – Project Kind: Console или GUI.

Базовый каталог - Base Directory. Выбор осуществляется с помощью браузера Browse, вызывающего диалоговое окно файлов.

Подкаталог - Sub Directory. Задается автоматически.

Создание консольного приложения

22

Создание GUI приложения

Нажимаем OK. ИСР строит шаблон проекта.

Для проекта строится дерево, отображаемое в окне. В левой панели окна пока-зано дерево проекта, которое содержит системные шаблоны и встроенные библиотеки, а в правой – информационный браузер.

Стартовое дерево проекта включает системные компоненты, которые не надо редактировать (ИСР использует их при компиляции):

Проект - ProjectName.prj6.

Манифест для приложения - main.manifest.

Пакет для приложения - main.pack.

Подключаемые системные библиотеки - $(ProDir)\lib.

23

Теперь командой Build/Build осуществляется компиляция проекта, в дерево проекта добавляются файлы проекта без функциональности:

Шаблон класса - main.cl.

Шаблон проекта - main.ph.

Шаблон реализации приложения - main.pro.

Для задания функциональности щелчком мыши выбираем main.pro, в шаблон которого нужно добавить свои операции.

Другие автоматически созданные файлы трогать не надо.

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

% place your own code here

24

После добавления функциональности main.pro принимает, например, вид.

25

Во фрагменте заголовка (строка open core) открываем и класс консоли (con-sole), что позволяет в предикате run() ссылку на консоль не упоминать.

При запуске проекта командой Build/Execute сначала осуществляется повтор-ная компиляция, затем формируется и запускается исполняемый файл.

При наличии ошибок в исходнике выводится сообщения о них (номер ошибки, строка и символ в строке), в листинге делаются пометки ошибок подчеркива-нием красным цветом. К сожалению, в листинге нет нумерации строк.

При щелчке мышью по строке сообщения об ошибке курсор устанавливается на код с ошибкой.

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

ИСР имеет интеллектуальный подсказчик. При наборе очередного символа кода отображается список возможных продолжений для выбора, что избавляет

26

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

Замечание. Подсказчику доступны идентификаторы, содержащиеся в классах проекта. По умолчанию выбирается только класс ядра core. Для работы с кон-солью следует добавить класс con sole, а для работы с математическими функциями класс math, Если это не сделано, то в коде перед идентификато-ром члена класса нужно добавлять имя класса и разделитель – двойное верти-кальное двоеточие.

27

2. Первые программы в Visual Prolog

Предмет исследования

Изучение ИСР Visual Prolog

Создание программы.

Исполнение.

Контрольные вопросы:

1. Что такое проект? 2. Построение проекта. 3. Компиляция проекта. 4. Исполнение проекта. 5. Консольное приложение 6. Графический интерфейс GUI.

Задания.

Создать программы.

Задача 1. Консольное приложение - приветствие Hello World.

Задача 2. Приложение с графическим интерфейсом GUI.

Варианты задания. Личные данные студента.

Примеры выполнения.

28

2.1. Hello console

Консольное приложение – проект HelloCons.

Создание проекта.

Выберем команду Project/New в меню задач.

В нем задаем:

имя проекта HelloCons,

тип - console application.

Построение проекта. Нажимаем OK. ИСР строит шаблон проекта.

Компиляция проекта. Теперь командой Build/Build осуществляется компиля-ция проекта, в дерево проекта добавляются файлы проекта без функцио-нальности:

Для задания функциональности щелчком мыши выбираем main.pro, в шаблон main.pro нужно добавить свои операции.

Добавляем в файл main.pro функциональность. Вставляем в файл команду ожидания ввода Enter,

_=readLine().

Кроме того, во фрагменте заголовка (строка open core) открываем и класс кон-соли (console), что позволяет в предикате run() ссылку на консоль не упоми-нать.

Листинг программы.

implement main open core, console % Открываем класс console

constants className = "main". classVersion = "". clauses classInfo(className, classVersion). clauses run():- init(), write("Hello World and Россия от Акчурина!!"),nl,nl, write("Нажмите Enter”), _=readLine(). % ожидание Enter end implement main goal mainExe::run(main::run).

29

Запуск программы. При запуске проекта командой Build/Execute сначала осу-ществляется повторная компиляция, формируется и запускается исполняемый файл.

Появляется окно консоли с выведенным текстом,

Для завершения нажмите Enter.

30

2.2. Проект GUI

Создание проекта.

Выберем команду Project/New в меню задач.

Создание проекта.

Выберем команду Project/New в меню задач.

В нем задаем:

имя проекта Prohect1

тип - GUI application..

Построение проекта. Нажимаем OK. ИСР строит шаблон проекта.

Компиляция проекта. Теперь командой Build/Build осуществляется компиля-ция проекта, в дерево проекта добавляются файлы проекта без функцио-нальности:

Для задания функциональности щелчком мыши выбираем main.pro, в шаблон main.pro нужно добавить свои операции.

Построение проекта. Нажимаем OK. ИСР строит шаблон проекта.

Компиляция проекта. Теперь командой Build/Build осуществляется компиля-ция проекта, в дерево проекта добавляются файлы проекта без функцио-нальности:

31

Запуск программы. При запуске проекта командой Build/Execute сначала осу-ществляется повторная компиляция, формируется и запускается исполняемый файл.

На экране появится окно, содержащее:

Стандартное графическое окно со строками заголовка и главного меню, панелью инструментов. Меню и панель инструментов содержат компонен-ты по умолчанию.

Встроенную консоль сообщений Messages. Сюда компилятор выводит свои сообщения.

32

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

Для конкретных действий в проекте нужно создать тему. Для этого используем команду File/New in New Package (новый файл в новом пакете).

Генерируется окно создания темы Create Project Item. Можно создавать темы:

Package – встроенный пакет,

Class – класс,

Interface – интерфейс,

Dialog – диалог,

Form – форма,

Control – элемент управления,

Draw Control – элемент управления для рисования,

Toolbar – панель инструментов,

Menu – меню,

Bitmap – растровая картинка.

Icon – иконка,

Cursor - курсор,

33

TextFile – текстовый файл.

Например, выбираем форму с именем form1.

Нажимаем кнопку create, генерируется окно конструктора формы, которое со-держит встроенные окна:

Form1 -форма, в которую по умолчанию включены 3 часто употребляе-мые элементы управления (OK, Cancel, Help).

Properties – свойства,

34

Controls – доступные элементы управления, которые можно использовать в форме (путем копирования их туда),

Layout - средства управления положением компонент в форме.

35

Для регулирования поведения окна формы в дереве проекта нужно открыть поле TaskWindow.win.

Открывается окно эксперта диалога и окон Dialog and Window Expert (TaskWin-dow), содержащее эксперты для компонент:

Window –окно.

Menu – меню.

Scrollbar

Control – элемент управления.

Key – клавиша.

Mouse - мышь

Miscellaneous – разное.

36

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

Для поля Windows нужно сделать доступными:

Destroy – уничтожение,

Show – показать,

Size – размер.

37

Для поля Menu нужно сделать доступными:

in_file_new – новый файл открыть,

in_file_exit – файл закрыть,

id_help_about – открыть справку.

Остальные поля менять не надо.

Поля без галочки выключены. Для включения пункта двойной щелчок по нему.

38

Чтобы открывалось окно формы, нужно разрешить открытие файла формы (по умолчанию это запрещено). Открываем TaskMenu двойным щелчком мышью по TaskMenu.mnu.

39

Открывается окно TaskMenu, в котором для &File\>&New\F7 нужно убрать га-лочку в Disable (недоступно).

40

При закрытии этого окна возникает запрос на сохранение сделанных измене-ний.

Выбираем Save – сохранить.

Осталось прописать ссылку на открываемый файл. Открываем файл TaskWin-dow,pro двойным щелчком по TaskWindow,pro.

41

Открывается файл TaskWindow,pro. Его содержимое создано автоматически при компиляции. Только не прописано правило реагирования на открытие но-вого файла –

clauses onFileNew…

42

43

Вносим туда правило отображения формы form1 с помощью конструктора формы.

Делаем повторную компиляцию и запуск командой Build/Execute. В результате отображается окно проекта без запущенной формы.

44

Команда File/New в окне проекта приводит к отображению формы в окне про-екта.

45

3. Класс Math

Предмет исследования

Встроенные функции класса Math. В классе определены группы функций.

Алгебраические.

Тригонометрические.

Базовые функции.

Контрольные вопросы:

1. Что такое ООП. 2. Что такое класс. 3. Поддерживаемые алгебраические функции. 4. Поддерживаемые тригонометрические функции. 5. Поддерживаемые базовые функции.

Задания:

Создать программы.

Задача 1. Консольное приложение - Алгебра.

Задача 2. Консольное приложение – Тригонометрия.

Задача 3. Консольное приложение – Базовые функции.

Задача 4. Консольное приложение – квадратное уравнение A*X*X+B*X+C=0.

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

Примеры выполнения.

46

3.1. Алгебра

Консольное приложение - Алгебра. Выполняются операции с операндами 5 и 7.

Создание проекта.

Выберем команду Project/New в меню задач.

В нем задаем:

имя проекта algebra,

тип - console application..

Построение проекта. Нажимаем OK. ИСР строит шаблон проекта.

Компиляция проекта. Теперь командой Build/Build осуществляется компиля-ция проекта, в дерево проекта добавляются файлы проекта без функцио-нальности:

Для задания функциональности щелчком мыши выбираем main.pro, в шаблон main.pro нужно добавить свои операции.

Другие автоматически созданные файлы трогать не надо.

Кроме того, во фрагменте заголовка (строка open core) открываем и класс кон-соли (console), что позволяет в предикате run() ссылку на консоль не упоми-нать.

Листинг программы.

implement main open core, console constants className = "main". classVersion = "". clauses classInfo(className, classVersion). clauses run():- init(), write("X = "), X=read(), write("Y = "), Y=read(), nl, write("Исходные числа ",X," и ",Y), nl, nl, _=readLine(), write("Операции с числами: ",X," и ",Y), nl, _=readLine(), Z=X+Y, write("Сумма: ", X, " + ", Y, " = ", Z), _=readLine(), Z1=X-Y, write("Разность: ", X, " - ", Y, " = ", Z1), _=readLine(), Z2=X*Y, write("Произведение: ", X, " * ", Y, " = ", Z2), _=readLine(),

47

Z3=X/Y, write("Частное : ", X, " / ", Y, " = ", Z3), _=readLine(), Z4=X^Y, write("Степень : ", X, " ^ ", Y, " = ", Z4), nl, _=readLine(),

write("Деления с выделением целого и остатка: ",X," и ",Y), nl, _=readLine(),

Z5 = X div Y, write("Целая часть с округлением к минусу: ", X, " div ", Y, " = ", Z5), _=readLine(), Z6=X mod Y, write("Остаток с округлением к минусу: ", X, " mod ", Y, " = ", Z6), _=readLine(), Z7=X quot Y, write("Целая часть с округлением к 0: ", X, " quot ", Y, " = ", Z7), =readLine(), Z8=X rem Y, write("Остаток с округлением к 0: ", X, " rem ", Y, " = ", Z8), _=readLine(), nl, write("Конец, Нажмите : Enter"), _=readLine(). % Ждем Enter end implement main goal mainExe::run(main::run).

Запуск программы. При запуске проекта командой Build/Execute сначала осу-ществляется повторная компиляция, формируется и запускается исполняемый файл.

Появляется окно консоли с именем первого аргумента X= в первой строке. После его ввода нажмите Enter.

В следующей строке появляется имя второго аргумента Y=. После его ввода нажмите Enter.

Далее при каждом нажатии Enter в новой строке отображаются результаты.

Когда все показано, отображается строка с сообщением о конце вычислений..

48

49

3.2. Квадратное уравнение

Консольное приложение – решение квадратного уравнения A*X*X+B*X+C=0.

Создание проекта.

Выберем команду Project/New в меню задач.

В нем задаем:

имя проекта kvadratUrav,

тип - console application..

Построение проекта. Нажимаем OK. ИСР строит шаблон проекта.

Компиляция проекта. Теперь командой Build/Build осуществляется компиля-ция проекта, в дерево проекта добавляются файлы проекта без функцио-нальности:

Для задания функциональности щелчком мыши выбираем main.pro, в шаблон main.pro нужно добавить свои операции.

Другие автоматически созданные файлы трогать не надо.

Кроме того, во фрагменте заголовка (строка open core) открываем и класс кон-соли (console), что позволяет в предикате run() ссылку на консоль не упоми-нать.

В программе предусмотрен рекурсивный запуск run(), что позволяет повторять ее с новыми данными сколько угодно раз. Выход из программы – закрыть окно консоли.

Листинг программы.

implement main open core, console, math constants className = "main". classVersion = "". clauses classInfo(className, classVersion). clauses run():- init(), write("Корни квадратного уравнения A*X*X+B*X+C=0 "),nl, write("Введите коэффициенты A,B.C"),nl, write("A="), A=read(), write("B="), B=read(), write("C="), C=read(), Z=B*B-4*A*C, if Z<0

50

then write("Корней нет"),nl else if Z>0 then X1= (-B+sqrt(B*B -4*A*C))/2/A, X2= (-B-sqrt(B*B -4*A*C))/2/A, write("Два корня"),nl,nl, write("X1 = ",X1),nl, write("X2 = ",X2),nl else X= (-B)/2/A, write("Один корень"),nl,nl, write("X = ",X),nl end if end if, nl, run(), _=readLine(). end implement main goal mainExe::run(main::run).

Запуск программы. При запуске проекта командой Build/Execute сначала осу-ществляется повторная компиляция, формируется и запускается исполняемый файл.

Появляется окно консоли с заголовком и приглашением ввести коэффициенты A,B,C. После ввода каждого нажмите Enter.

Далее отображаются результаты. Возможны 3 варианта: корней нет, корень 1, корней 2.

Когда все показано, для выхода надо закрыть окно консоли.

51

52

3.3. Тригонометрия

Консольное приложение - Тригонометрия. Выполняются прямые и обратные тригонометрические функции с операндом X в градусах.

Создание проекта.

Выберем команду Project/New в меню задач.

В нем задаем:

имя проекта Trigonjm,

тип - console application..

Построение проекта. Нажимаем OK. ИСР строит шаблон проекта.

Компиляция проекта. Теперь командой Build/Build осуществляется компиля-ция проекта, в дерево проекта добавляются файлы проекта без функцио-нальности:

Для задания функциональности щелчком мыши выбираем main.pro, в шаблон main.pro нужно добавить свои операции.

Другие автоматически созданные файлы трогать не надо.

Добавляем в файл main.pro функциональность. Каждую операцию вывода write() завершаем командой паузы _=readLine() и при необходимости команда-ми перехода к новой строке nl. В последней строке выводим сообщение о кон-це программы.

Кроме того, во фрагменте заголовка (строка open core) открываем класс консо-ли (console) и класс математики math, что позволяет в предикате run() ссылки на консоль и math не упоминать.

Листинг программы.

implement main open core, console, math constants className = "main". classVersion = "". clauses classInfo(className, classVersion). clauses run():- init(), write("X градусы = "), X0=read(), X=X0/180*pi, nl, % Перевод в радианы write("X в градусах и радианах ",X0," и ",X), nl, nl, _=readLine(), Z=sin(X), write("Синус от ",X0," градусов = ", Z), _=readLine(),

53

Z10=arcsin(Z), Z1=Z10*180/pi, % Перевод в градусы write("Арксинус от: ", Z, " = ", Z1, " градусов"), _=readLine(), Z2=cos(X), write("Косинус от ", X0, " градусов = ", Z2), _=readLine(), Z30=arccos(Z2), Z3=Z30*180/pi, % Перевод в градусы write("Арккосинус от ", Z2, " = ", Z3, " градусов"), _=readLine(), Z4=tan(X), write("Тангенс от ", X0, " градусов = ", Z4), _=readLine(), Z50 = arctan(Z4), Z5=Z50*180/pi, % Перевод в градусы write("Арктангенс от ", Z4, " = ", Z5, " градусов"), nl,nl, write("Конец. Нажмите Enter"), _=readLine(). end implement main goal mainExe::run(main::run).

Запуск программы. При запуске проекта командой Build/Execute сначала осу-ществляется повторная компиляция, формируется и запускается исполняемый файл.

Появляется окно консоли с именем аргумента X градусы в первой строке. По-сле его ввода нажмите Enter.

Далее при каждом нажатии Enter в новой строке отображаются результаты.

Когда все показано, отображается строка с сообщением о конце вычислений.

54

55

3.4. Базовые функции

Консольное приложение – Базовые функции. Выполняются базовые функции с отрицательным операндом X и положительным операндом Y.

Создание проекта.

Выберем команду Project/New в меню задач.

В нем задаем:

имя проекта baseFunctions,

тип - console application..

Построение проекта. Нажимаем OK. ИСР строит шаблон проекта.

Компиляция проекта. Теперь командой Build/Build осуществляется компиля-ция проекта, в дерево проекта добавляются файлы проекта без функцио-нальности:

Для задания функциональности щелчком мыши выбираем main.pro, в шаблон main.pro нужно добавить свои операции.

Другие автоматически созданные файлы трогать не надо.

Добавляем в файл main.pro функциональность. Каждую операцию вывода write() завершаем командой паузы _=readLine() и при необходимости команда-ми перехода к новой строке nl. В последней строке выводим сообщение о кон-це программы.

Кроме того, во фрагменте заголовка (строка open core) открываем класс консо-ли (console) и класс математики math, что позволяет в предикате run() ссылки на консоль и math не упоминать.

Листинг программы.

implement main open core, console, math constants className = "main". classVersion = "". clauses classInfo(className, classVersion). clauses run():- init(), write("Базовые функции класса math "), nl, nl, write("Отрицательное X = "), X=read(), write("Положительное Y = "), Y=read(), nl, write("Исходные числа ",X," и ",Y), nl, nl, _=readLine(), Z=abs(X),

56

write("Абсолютное значение abs(",X,") = ", Z), _=readLine(), Z1=sqrt(Y), write("Квадратный корень из ", Y, " = ", Z1), _=readLine(), Z2=sqr(X), write("Квадрат ", X, " = ", Z2), _=readLine(), Z3=max(X,Y), write("Максимальное max(", X, ",", Y, ") = ", Z3), _=readLine(), Z4=min(X,Y), write("Минимальное min(", X, ",", Y, ") = ", Z4), _=readLine(), Z5 = ln(Y), write("Натуральный логарифм ln(", Y, ") = ", Z5), _=readLine(), Z6=log(Y), write("Десятичный логарифм log(", Y, ") = ", Z6), _=readLine(), Z7=exp(X), write("Экспонента, exp(", X, ") = ", Z7), _=readLine(), nl, write("Конец. Нажмите Enter "), _=readLine(),nl. end implement main goal mainExe::run(main::run).

Запуск программы. При запуске проекта командой Build/Execute сначала осу-ществляется повторная компиляция, формируется и запускается исполняемый файл.

Появляется окно консоли с заголовком и приглашениями ввода отрицательно-го операнда X и положительного операндаY.

После каждого ввода нажмите Enter.

Далее при каждом нажатии Enter в новой строке отображаются результаты.

Когда все показано, отображается строка с сообщением о конце вычислений.

57

58

4. Логические операции

Предмет исследования

Встроенные операции Visual Prolog. В языке определены операции.

Отношения.

Логические.

Контрольные вопросы:

1. Что такое ООП. 2. Что такое класс. 3. Поддерживаемые операции отношения. 4. Поддерживаемые логические операции.

Задания:

Создать программы.

Задача 1. Консольное приложение - Операции отношения

Задача 2. Консольное приложение – Членство в списке.

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

Примеры выполнения.

59

4.1. Операции отношения

Консольное приложение - Операции отношения с числами X=12 , Y=23.

Создание проекта.

Выберем команду Project/New в меню задач.

В нем задаем:

имя проекта logicOperations,

тип - console application..

Построение проекта. Нажимаем OK. ИСР строит шаблон проекта.

Компиляция проекта. Теперь командой Build/Build осуществляется компиля-ция проекта, в дерево проекта добавляются файлы проекта без функцио-нальности:

Листинг main.pro.

mplement main open core, console constants className = "main". classVersion = "". clauses classInfo(className, classVersion). clauses run():- init(), write("Введите исходные числа X и Y"), nl, nl,

write("X = "), X=read(), write("Y = "), Y=read(), nl, write("Исходные числа ",X," и ",Y), nl, nl, _=readLine(), write("Проверка на равно "), nl, if X=Y then write(X, " равно ",Y) else write(X, " не равно ",Y) end if, nl, _=readLine(), write("Проверка на больше "), nl, if X>Y then write(X, " больше ",Y)

60

else write(X, " не больше ",Y) end if,

nl, _=readLine(), write("Проверка на меньше "), nl, if X<Y then write(X, " меньше ",Y) else write(X, " не меньше ",Y) end if, nl, _=readLine(), write("Проверка на больше или равно "), nl, if X>=Y then write(X, " не меньше ",Y) else write(X, " меньше ",Y) end if, nl, _=readLine(), write("Проверка на меньше или равно "), nl, if X<=Y then write(X, " не больше ",Y) else write(X, " больше ",Y) end if, nl, _=readLine(), write("Проверка на больше или меньше"), nl, if X<>Y then write(X, " не равно ",Y) else write(X, " равно ",Y) end if, nl, _=readLine(),

write("Проверка на меньше или больше"), nl, if X><Y

then write(X, " не равно ",Y) else write(X, " равно ",Y) end if, nl, nl, write("Конец. Нажмите Enter"), nl, nl, _=readLine(). % Ждем Enter end implement main goal mainExe::run(main::run).

61

Запуск программы. При запуске проекта командой Build/Execute сначала осу-ществляется повторная компиляция, формируется и запускается исполняемый файл.

62

4.2. Членство в списке

Консольное приложение – Членство в списке. Программа проверяет наличие числа в списке чисел.

Создание проекта.

Выберем команду Project/New в меню задач.

В нем задаем:

имя проекта chlenSpiska,

тип - console application..

Построение проекта. Нажимаем OK. ИСР строит шаблон проекта.

Компиляция проекта. Теперь командой Build/Build осуществляется компиля-ция проекта, в дерево проекта добавляются файлы проекта без функцио-нальности:

В проекте используется предикат объекта member. Его надо задавать в файле класса main.cl. Его реализация в файле main.pro.

Листинг main.cl. class main open core, console predicates classInfo : core::classInfo. predicates member : (integer, integer*) nondeterm (i,i) (o,i). run : core::runnable. end class main Листинг main.pro. implement main

open core, console constants className = "main". classVersion = "". clauses classInfo(className, classVersion). member(Number, [Number | _ ]). member(Number, [ _ | Tail]) :- member(Number,Tail). clauses run():- init(), write("Введите список в квадратных скобках с запятыми"), nl,nl,

63

write("Список -> "), List = read(), nl, % Список чисел write("Число -> "), Chislo = read(), nl, member(Chislo,List), !, % Проверка наличия числа в списке write(Chislo, " есть в списке ", List), nl, nl, _ = readchar(), write("Конец. Нажмите любую клавишу "), _ = readchar(). run() :- write("Числа в списке нет "), _=readchar(), nl, nl, write("Конец. Нажмите Enter"), _=readLine(). end implement main goal mainExe::run(main::run).Запуск программы.

При запуске проекта командой Build/Execute сначала осуществляется повтор-ная компиляция, формируется и запускается исполняемый файл.

Вариант, когда число в списке есть.

Вариант, когда числа в списке нет.

64

65

5. Работа со списками

Предмет исследования

Средства обработки списков. Определены группы операций.

Численные списки.

Строковые списки.

Иерархические списки.

Контрольные вопросы:

1. Что такое список. 2. Представления списков. 3. Вложенные списки. 4. Голова списка. 5. Хвост списка. 6. Иерархические списки.

Задания:

Создать программы.

Задача 1. Среднее значение списка - SredneeSpiska.

Задача 2. Консольное приложение – Сумма и произведение элементов списка.

Варианты задания. Аргументы для операций берутся из номера зачетной книжки. Длина списка LS – последняя пара цифр, стартовый номер фрагмента St - предпоследняя цифра, длина фрагмента списка L – последняя цифра,

Примеры выполнения.

66

5.1. Среднее списка

Консольное приложение – Среднее списка. Вычисляется среднее значение фрагмента численного списка, начинающегося со стартового номера St и име-ющего длину L.

Создание проекта.

Выберем команду Project/New в меню задач.

В нем задаем:

имя проекта SredneeSpiska,

тип - console application..

Построение проекта. Нажимаем OK. ИСР строит шаблон проекта.

Компиляция проекта. Теперь командой Build/Build осуществляется компиля-ция проекта, в дерево проекта добавляются файлы проекта без функцио-нальности:

Для задания функциональности щелчком мыши выбираем main.pro, в шаблон main.pro нужно добавить свои операции.

Другие автоматически созданные файлы трогать не надо.

В листинге шаблона программы отмечено место, куда надо добавить коды. Фраза комментария на английском языке: % place your own code here

Добавляем в файл main.pro функциональность. Каждую операцию вывода write() завершаем командой паузы _=readLine() и при необходимости команда-ми перехода к новой строке nl. В последней строке выводим сообщение о кон-це программы.

Кроме того, во фрагменте заголовка (строка open core) открываем класс консо-ли (console), что позволяет в предикате run() ссылки на консоль не упоминать.

Листинг программы.

implement main open core, console class predicates avg:(real*, real, integer, real) procedure (i, i, i, o). % предикат SredneeSpiska clauses classInfo("avg", "1.0"). avg([], S, L, S/L). % S - сумма, L - номер, Среднее списка S/L avg([X|Xs], S, L, A) :- avg( Xs, % X - Элемент списка X+S, % Сумма S=S+X L+1, % Увеличить номер на 1 A). % Среднее списка S/L

67

run():- init(), write("Введите список, в квадратных скобках с запятыми"), nl, write("Spisok="), List= read(), nl, % Ввод списка, в квадратных скобках с запятыми avg(List, 0, 0, A),% Вычислить среднее списка write("Среднее = ",A), nl, nl, % Вывод результата _= readLine(), write("Конец. Нажмите Enter"), _= readLine(). end implement main goal mainExe::run(main::run).

Запуск программы. При запуске проекта командой Build/Execute сначала осу-ществляется повторная компиляция, формируется и запускается исполняемый файл.

Появляется окно консоли с приглашением в первой строке и полем ввода спис-ка во второй. После его ввода нажмите Enter.

Появляется приглашение ввести стартовый номер и поле его ввода. После его ввода нажмите Enter.

Появляется приглашением ввести длину фрагмента и поле его ввода. После его ввода нажмите Enter.

В следующей строке появляется результат.

Когда все показано, отображается строка с сообщением о конце вычислений.

68

5.2. Сумма и произведение элементов списков

Консольное приложение – Сумма и произведение элементов списков. Второй список одноэлементный – число. Вычисляется сумма sum и произведение prod элементов численного списка Sp и числа N.

Создание проекта.

Выберем команду Project/New в меню задач.

В нем задаем:

имя проекта SummaProizvedSpiska,

тип - console application..

Построение проекта. Нажимаем OK. ИСР строит шаблон проекта.

Компиляция проекта. Теперь командой Build/Build осуществляется компиля-ция проекта, в дерево проекта добавляются файлы проекта без функцио-нальности:

Для задания функциональности щелчком мыши выбираем main.pro, в шаблон main.pro нужно добавить свои операции.

Другие автоматически созданные файлы трогать не надо.

Добавляем в файл main.pro функциональность.

Определяем домен pp2 процедурного типа с двумя вещественными аргумен-тами и вещественным результатом.

Определяем предикаты prod (произведение), sum (сумма), red (типа pp2 с пер-вым аргументом в виде списка).

Каждую операцию вывода write() завершаем командой паузы _=readLine() и при необходимости командами перехода к новой строке nl. В последней строке выводим сообщение о конце программы.

Кроме того, во фрагменте заголовка (строка open core) открываем класс консо-ли (console), что позволяет в предикате run() ссылки на консоль не упоминать.

Листинг программы.

implement main open core, console

domains pp2 = (real Argument1, real Argument2) -> real ReturnType. % вещ. числа clauses classInfo("main", "hi_order"). class predicates sum:pp2. prod:pp2. red:(pp2, real*, real, real) procedure (i, i, i, o).

69

clauses sum(X, Y)= Z :- Z=X+Y. prod(X, Y)= Z :- Z=X*Y. red(_P, [], A, A) :- !. red(P, [X|Xs], A, Ans) :- red(P, Xs, P(X, A), Ans). run():- init(), write("Введите список в квадратных скобках с запятыми"),nl, write("SP="), Sp = read(), nl, write("Введите число"),nl, write("N="), N = read(), nl, red(prod, Sp, N, X), write("Произведение="), write(X), nl, red(sum, Sp, N, X1), write("Сумма="), write(X1), nl, _=readLine(),nl, write("Конец. Нажмите Enter"), _=readLine(). end implement main goal mainExe::run(main::run).

Запуск программы. При запуске проекта командой Build/Execute сначала осу-ществляется повторная компиляция, формируется и запускается исполняемый файл.

Появляется окно консоли с приглашением в первой строке и полем ввода спис-ка во второй. После его ввода нажмите Enter.

Появляется приглашение ввести число и поле его ввода. После его ввода нажмите Enter.

В следующих строках появляются результаты: произведение и сумма.

Когда все показано, отображается строка с сообщением о конце вычислений.

70

71

5.3. Сумма произведений списков

Консольное приложение – Сумма произведений списков. Вычисляется точеч-ное (поэлементное) произведение Sp численных списков Sp1 и Sp2. Затем для списка Sp производится суммирование элементов.

Создание проекта.

Выберем команду Project/New в меню задач.

В нем задаем:

имя проекта SummaProizvedSpiskov,

тип - console application..

Построение проекта. Нажимаем OK. ИСР строит шаблон проекта.

Компиляция проекта. Теперь командой Build/Build осуществляется компиля-ция проекта, в дерево проекта добавляются файлы проекта без функцио-нальности:

Для задания функциональности щелчком мыши выбираем main.pro, в шаблон main.pro нужно добавить свои операции.

Определяем домен pp2 процедурного типа с двумя вещественными аргумен-тами и вещественным результатом.

Определяем предикаты:

prod (произведение),

sum (сумма),

red и zip (типа pp2 с первым аргументом в виде списка)

dotprodSum (точечное произведение и суммирование),

Каждую операцию вывода write() завершаем командой паузы _=readLine() и при необходимости командами перехода к новой строке nl. В последней строке выводим сообщение о конце программы.

Кроме того, во фрагменте заголовка (строка open core) открываем класс консо-ли (console), что позволяет в предикате run() ссылки на консоль не упоминать.

Листинг программы.

implement main open core, console domains pp2 = (real Argument1, real Argument2) -> real ReturnType. clauses classInfo("main", "1.0"). class predicates sum:pp2. prod:pp2.

72

red:(pp2, real*, real, real) procedure (i, i, i, o). zip:(pp2, real*, real*, real*) procedure (i, i, i, o). dotprodSum:(real*, real*, real) procedure (i, i, o). clauses sum(X, Y)= Z :- Z=X+Y. prod(X, Y)= Z :- Z=X*Y. zip(_P, [], _, []) :- !. zip(_P, _, [], []) :- !. % Точечное произведение списков с суммированием zip(P, [X|Xs], [Y|Ys], [Z|As]) :- Z= P(X, Y), zip(P, Xs, Ys, As). red(_P, [], A, A) :- !. red(P, [X|Xs], A, Ans) :- red(P, Xs, P(X, A), Ans). dotprodSum(Xs, Ys, D) :- zip(prod, Xs, Ys, Z), % Точечное произведение списков red(sum, Z, 0, D). % Суммирование списка run():- init(), write("Введите 2 списка, в квадратных скобках через запятые"),nl,nl, write("Sp1 -> "), Sp1=read(), nl, write("Sp2 -> "), Sp2=read(), nl, zip(prod, Sp1, Sp2, Sp), write("Sp=Sp1*Sp2 -> ",Sp),nl,nl, dotprodSum( Sp1, Sp2, S), write("Summa(Sp) -> ",Summa), nl,nl, write("Нажмите Enter"),nl,nl, _=readLine(), _=readLine(). end implement main goal mainExe::run(main::run).

Запуск программы. При запуске проекта командой Build/Execute сначала осу-ществляется повторная компиляция, формируется и запускается исполняемый файл.

73

Появляется окно консоли с приглашением в первой строке и полем ввода спис-ка Sp1 во второй. После его ввода нажмите Enter.

Появляется приглашение и полем ввода списка Sp2. После его ввода нажмите Enter.

В следующих строках появляются результаты: точечное произведение списков Sp1 и Sp2 и сумма списка sp=Sp1*Sp2.

Когда все показано, отображается строка с сообщением о конце вычислений.

74

6. Работа со строками

Предмет исследования

Средства обработки строк. Определены группы операций.

Численные списки.

Строковые списки.

Иерархические списки.

Контрольные вопросы:

1. Что такое символ. 2. Что такое строка. 3. Что такое слово. 4. Преобразование строки в список символов. 5. Преобразование списка символов в строку. 6. Разделение слов в строке.

Задания:

Создать программы.

Задача 1. Консольное приложение - Строка в список слов (Stroka_v_Spisok).

Задача 2. Консольное приложение – Форматирование строк (formatting).

Варианты задания. Аргументы для операций берутся из номера зачетной книжки. Слова строки – пары цифр.

Примеры выполнения.

75

6.1. Строка в список слов

Консольное приложение – Строка в список слов. Сначала строка преобразует-ся в список символов, затем группы символов, расположенные между пробе-лами, объединяются во вложенные списки символов слов. Наконец, каждый вложенный список преобразуется в слово.

Создание проекта.

Выберем команду Project/New в меню задач.

В нем задаем:

имя проекта Stroka_v_Spisok,

тип - console application..

Построение проекта. Нажимаем OK. ИСР строит шаблон проекта.

Компиляция проекта. Теперь командой Build/Build осуществляется компиля-ция проекта, в дерево проекта добавляются файлы проекта без функцио-нальности:

Для задания функциональности щелчком мыши выбираем main.pro, в шаблон main.pro нужно добавить свои операции.

Определяем домен pp2 процедурного типа с двумя вещественными аргумен-тами и вещественным результатом.

Определяем предикаты:

foldr:(function{L, B, B}, B, L*) -> B. % Выборка символа

hd:(L**) -> L*. % вложенный список -> список

tl:(L**) -> L**. % вложенный список -> вложенный список

tokens:(char*) -> char**. % Список символов -> список символов слов

Каждую операцию вывода write() завершаем командой паузы _=readLine() и при необходимости командами перехода к новой строке nl. В последней строке выводим сообщение о конце программы.

Кроме того, во фрагменте заголовка (строка open core) открываем класс консо-ли (console), что позволяет в предикате run() ссылки на консоль не упоминать.

Листинг программы.

implement main open core, console

class predicates foldr:(function{L, B, B}, B, L*) -> B. % Выборка символа

hd:(L**) -> L*. % вложенный список -> список tl:(L**) -> L**. % вложенный список -> вложенный список tokens:(char*) -> char**. % Формирование списков символов слов clauses

76

classInfo("main", "1.0"). foldr(_P, F, [])= C :- C= F. foldr(P, F, [X|Xs])= C :- C= P(X, foldr(P, F, Xs)). hd(Xs)= C :- if [X|_] = Xs then C=X else C= [] end if. tl(Xs)= C :- if [_|R]=Xs then C=R else C=[] end if. tokens(List_of_chars)= Words :- Wop= {(X, XSS) = C :- if list::isMember(X, [' ', '\n']) then C= [[]|XSS] else if list::isMember(X, [',', '.']) then C=[[],[X]|tl(XSS)] else C= [[X|hd(XSS)]|tl(XSS)] end if end if}, Words= foldr( Wop , [[]], List_of_chars). run():- init(), write("Введите строку текста в двойных кавычках"), nl, write("Моя строка -> "), MyString= read(), % Строка -> в список символов ListSymbols= string::toCharList(MyString), nl, write("Список символов строки -> "),nl, write(ListSymbols),nl,nl, % Формирование списков символов слов, разделитель - пробел S= tokens(ListSymbols), write("Список строки с вложенными списками символов слов -> "),nl, write(S),nl,nl, % Создать слова из списков символов слов Words= list::map(S, string::createFromCharList), write("Список слов строки текста"), nl,

77

write(Words), _=readLine(), _=readLine(). end implement main goal mainExe::run(main::run).

Запуск программы. При запуске проекта командой Build/Execute сначала осу-ществляется повторная компиляция, формируется и запускается исполняемый файл.

Появляется окно консоли с приглашением в первой строке и полем ввода стро-ки текста во второй. После его ввода нажмите Enter.

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

78

6.2. Форматирование строк

Консольное приложение – Форматирование строк Из строки удаляются симво-лы пробелов и табуляторов

Создание проекта.

Выберем команду Project/New в меню задач.

В нем задаем:

имя проекта formatting,

тип - console application..

Построение проекта. Нажимаем OK. ИСР строит шаблон проекта.

Компиляция проекта. Теперь командой Build/Build осуществляется компиля-ция проекта, в дерево проекта добавляются файлы проекта без функцио-нальности:

Для задания функциональности щелчком мыши выбираем main.pro, в шаблон main.pro нужно добавить свои операции.

Каждую операцию вывода write() завершаем командой паузы _=readLine() и при необходимости командами перехода к новой строке nl. В последней строке выводим сообщение о конце программы.

Кроме того, во фрагменте заголовка (строка open core) открываем класс консо-ли (console), что позволяет в предикате run() ссылки на консоль не упоминать, а также класс string для подключения встроенных в ИСР предикатов обработки строк.

Листинг программы.

implement main open core, console, string clauses classInfo("main", "stringops"). % Подключение классов run():- init(), write("Введите строку с пробелами или табуляторами" ), nl, Str = readLine(),nl, T= trim(Str), % Удаление ведущих разделителей write("Удалены ведущие разделители" ), nl, write(T), nl,nl, T1= trimInner(T), % Удаление внутренних разделителей write("Удалены внутренние разделители" ), nl, write(T1), nl,nl, write(“Нажмите Enter”), nl,

79

_= readLine(). end implement main goal mainExe::run(main::run).

Запуск программы. При запуске проекта командой Build/Execute сначала осу-ществляется повторная компиляция, формируется и запускается исполняемый файл.

Появляется окно консоли с приглашением в первой строке и полем ввода стро-ки текста во второй. После его ввода нажмите Enter.

В следующих строках появляются результаты:

строка с удаленными ведущими разделителями,

строка с удаленными внутренними разделителями.

Когда все показано, отображается строка с сообщением о конце работы.

80

6.3. Семья

Консольное приложение – Семья. Программа анализирует пары персон, для которых задаются имена и родственные отношения (отец, дед, предок). По этим данным программа определяет имена персон, находящихся в определен-ных родственных отношениях. Программа сделана на английском языке, чтобы избежать падежных окончаний в русскоязычных именах.

Создание проекта.

Выберем команду Project/New в меню задач.

В нем задаем:

имя проекта family,

тип - console application..

Построение проекта. Нажимаем OK. ИСР строит шаблон проекта.

Компиляция проекта. Теперь командой Build/Build осуществляется компиля-ция проекта, в дерево проекта добавляются файлы проекта без функцио-нальности:

Для задания функциональности щелчком мыши выбираем main.pro, в шаблон main.pro нужно добавить свои операции.

Каждую операцию вывода write() завершаем командой паузы _=readLine() и при необходимости командами перехода к новой строке nl. В последней строке выводим сообщение о конце программы.

Кроме того, во фрагменте заголовка (строка open core) открываем класс консо-ли (console), что позволяет в предикате run() ссылки на консоль не упоминать.

Листинг main.cl

class main open core predicates classInfo : core::classInfo. % @short Class information predicate. % @detail This predicate represents information predicate of this class. % @end predicates run : core::runnable. end class main

Листинг main.pro

implement main

81

open core, console constants className = "main". classVersion = "$JustDate: $$Revision: $". clauses classInfo(className, classVersion). domains gender = female(); male(). class facts - familyDB person : (string Name, gender Gender). parent : (string Person, string Parent). class predicates father: (string Person, string Father) nondeterm anyflow. % Отец clauses father(Person, Father) :- parent(Person, Father), person(Father, male()). class predicates grandFather : (string Person, string GrandFather) nondeterm anyflow. % Дед clauses grandFather(Person, GrandFather) :- parent(Person, Parent), father(Parent, GrandFather). class predicates ancestor : (string Person, string Ancestor) nondeterm anyflow. % Предок clauses ancestor(Person, Ancestor) :- parent(Person, Ancestor). ancestor(Person, Ancestor) :- parent(Person, P1), ancestor(P1, Ancestor). clauses person("Judith",female()). person("Bill",male()). person("John",male()). person("Pam",female()). parent("John","Judith"). parent("Bill","John").

82

parent("Pam","Bill"). clauses run():- init(), write("father test"),nl, father(X, Y), write(Y," is the father of ", X),nl, fail. run():- nl, write("grandFather test"),nl, grandFather(X, Y), write(Y," is the GrandFather of ", X),nl, fail. run():- nl, write("ancestor of Pam test"),nl, X = "Pam", ancestor(X, Y), write(Y," is the ancestor of ", X),nl, fail. run():- nl, write("End of test"), _=readLine(). end implement main goal mainExe::run(main::run).

83

84

7. Модульные проекты

Предмет исследования

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

Создание класса.

Реализация класса.

Связь между классами.

Контрольные вопросы:

1. Зачем проект разбивается на модули 2. Что такое класс. 3. Определение класса.. 4. Реализация класса. 5. Связь между классами..

Задания:

Создать программы.

Задача 1. Консольное приложение Счетчик от Start до End..

Варианты задания. Start – последняя цифра номера зачетной книжки, End = Start+10.

Задача 2. Консольное приложение Возраст.

Варианты задания. Индивидуальные данные студента.

Примеры выполнения.

85

7.1. Счетчик

Консольное приложение – Счетчик. Программа реализует счетчик, начиная со стартового числа Start до конечного End, и выводит значения счетчика.

Создание проекта.

Выберем команду Project/New в меню задач.

В нем задаем:

имя проекта counter,

тип - console application..

Построение проекта. Нажимаем OK. ИСР строит шаблон проекта.

Компиляция проекта. Теперь командой Build/Build осуществляется компиля-ция проекта, в дерево проекта добавляются файлы проекта без функцио-нальности:

Проект содержит классы, которые надо редактировать:

counter.cl. Здесь определяется предикат counter.

counter.pro. Здесь реализация предикат counter.

main.pro. Здесь реализация программы.

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

Каждую операцию вывода write() завершаем командой паузы _=readLine() и при необходимости командами перехода к новой строке nl.

Кроме того, во фрагменте заголовка (строка open core) открываем класс консо-ли (console), что позволяет в предикатах ссылки на консоль не упоминать.

Конечное значение нужно прописать в файле counter,pro как аргумент предика-та counter(Число), который содержит действия, выполняемые, когда значение счетчика на 1 больше End. Например, если End=10, то Число=11.

Листинг counter.cl

class counter open core, console predicates classInfo : core::classInfo. % @short Class information predicate. % @detail This predicate represents information predicate of this class. % @end count : (integer Number) procedure . end class counter

Листинг counter.pro

86

implement counter open core, console

constants

className = "counter". classVersion = "".

clauses

classInfo(className, classVersion).

count(11) :- nl, write("Это все!"), !. count(Number) :- write(Number),

nl, NextNumber = Number + 1, count(NextNumber).

end implement counter

Листинг main.pro

implement main open core, console

constants

className = "main". classVersion = "".

clauses

classInfo(className, classVersion). clauses

run():- init(), write("Start -> "), Start = read(),nl, counter::count(Start), _= readLine(), _= readLine(). end implement main goal

87

mainExe::run(main::run).

Запуск программы. При запуске проекта командой Build/Execute сначала осу-ществляется повторная компиляция, формируется и запускается исполняемый файл.

Появляется окно консоли с приглашением в первой строке ввести значение Start. После его ввода нажмите Enter.

В следующих строках появляются результаты:

88

7.2. Возраст

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

Создание проекта.

Выберем команду Project/New в меню задач.

В нем задаем:

имя проекта Vozrast,

тип - console application..

Построение проекта. Нажимаем OK. ИСР строит шаблон проекта.

Компиляция проекта. Теперь командой Build/Build осуществляется компиля-ция проекта, в дерево проекта добавляются файлы проекта без функцио-нальности:

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

Каждую операцию вывода write() завершаем командой паузы _=readLine() и при необходимости командами перехода к новой строке nl.

Кроме того, во фрагменте заголовка (строка open core) открываем класс консо-ли (console), что позволяет в предикатах ссылки на консоль не упоминать.

Листинг person.cl person.cl class person : person

open core domains

name = string. группа = string.

age = integer. predicates

person : (name, группа, age) multi (o,o,o). % Студенты sumlist : (age*, age, integer) procedure(i,o,o). % Список их данных

predicates

classInfo : core::classInfo. % @short Class information predicate. % @detail This predicate represents information predicate of this class. % @end

89

end class person

Листинг person.pro

person.pro implement person open core constants className = "person". classVersion = "". clauses classInfo(className, classVersion). clauses % Пустой список, сумма возрастов Sum=0 и число студентов N=0 sumlist([],0,0). sumlist([H|T], Sum, N):- sumlist(T, S1,N1), % Вызов для очередного факта Sum=H+S1, % Копим сумму N=1+N1. % увеличиваем N на 1 % Список фактов person("Иванов", "П01в", 42). person("Петров", "П01в", 36). person("Сидоров", "П01в", 36). end implement person

Листинг main.cl

main.cl class main open core predicates classInfo : classInfo. % @short Class information predicate. % @detail This predicate represents information predicate of this class. % @end predicates run : runnable. end class main

Листинг main.pro

main.pro implement main

90

open core, console, person constants className = "main". classVersion = "". clauses classInfo(className, classVersion). clauses run():- init(), write("Список студентов "),nl, L1 = [ Name ||person(Name, _)], % Получить список write(N1),nl,nl, write("Их возраст"),nl, L2 = [ Age || person(_, Age)], % Получить список возрастов write(L1),nl,nl, % Получить из списка L2 сумму возрастов Sum и число студентов N sumlist(L2, Sum, N), Ave = Sum/N, % Средний возраст студентов write("Средний возраст=", Ave),nl,nl, write("Нажмите Enter"), _= readLine(). end implement main goal mainExe::run(main::run).

Запуск программы. При запуске проекта командой Build/Execute сначала осу-ществляется повторная компиляция, формируется и запускается исполняемый файл.

Появляется окно консоли с результатами:

91