Скачиваний:
38
Добавлен:
22.05.2015
Размер:
560.64 Кб
Скачать

Лабораторная работа 1

Общие сведения о среде Visual Prolog 7.2

1. Создание консольных приложений

2. Классы Visual Prolog

3. Разработка GUI-приложений

Настоящая лабораторная работа призвана ознакомить студентов со средой Visual Prolog и использованием ряда статических классов. Содержание примеров и заданий не требует каких-либо предварительных знаний о синтаксисе языка Visual Prolog и механизмов логического вывода.

1. Создание консольных приложений

Разработка как консольных, так и GUI-приложений начинается с запуска пункта New в меню Project. Для создания консольного приложения необходимо на вкладке General диалогового окна Project Setting ввести имя проекта, в нашем случае это Console1, а также ввести путь по которому этот проект будет сохранён – D:\ , и установить стратегию пользовательского интерфейса Console, как показано на рис.1.

После нажатия кнопки Ok будет сформировано консольное приложение, компоненты которого отображаются в виде древа на левой панели окна проекта (рис.2). На правой панели отображается информация о выбранном в левой панели компоненте проекта. Кроме этого по умолчанию создаётся окно сообщений, отображающее все действия с проектом.

На данном этапе всё готово для компиляции и запуска нашего приложения. Оно пока не выполняет никаких полезных функций, а только создаёт консольное окно. Нажмём кнопочку E (Execute) на панели инструментов и подождём несколько секунд, пока Visual Prolog скомпилирует приложение. Вновь созданный проект компилируется долго, так как компилируются все модули, указанные в файле main.pack. Однако последующие компиляции будут быстрыми, ибо перекомпилироваться будет только тот модуль, в котором произведены изменения исходного кода.

На рисунке 3 изображён результат запуска приложения. Так как мы пользуемся свободно распространяемой (Personal Edition) версией Visual Prolog, то каждый запуск приложения будет сопровождаться окошком с предупреждением о том, что данный продукт нельзя использовать в коммерческих целях. Коммерческая версия Visual Prolog стоит 299 у.е.

После закрытия предупреждающего окошка окно приложения также будет закрыто, так как никаких действий, кроме отображения консольного окна, наше приложение пока не выполняет. Во время первой компиляции Visual Prolog создал все необходимые файлы с исходным кодом, которые мы можем наблюдать в окне проекта (рис.4). Файлы проекта носят имя main. Просмотреть любой файл можно двойным щелчком по нему в дереве проекта. При этом в правой панели откроется подробная информация о выбранном файле, а содержимое файла будет показано в отдельном окне (рис.4).

Папка ProDir содержит две папки: lib – подключаемые библиотеки, pfc – необходимые для консольного приложения классы из комплекта Prolog Foundation Classes.

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

  • main.pack – содержит команды подключения локально используемых пакетов.

  • main.ph – содержит команды подключения глобально используемых пакетов.

  • main.cl – содержит декларацию класса.

  • main.pro – содержит исходный код выполнения (implementation) класса.

На рисунке 5 с целью иллюстрации открыты все файлы класса. Однако на начальных этапах изучения языка Пролог нам достаточно иметь открытым только файл main.pro, так как модифицировать мы будем только его.

Рассмотрим содержимое файла main.pro. Во-первых, комментарии могут начинаться со знака процента и заканчиваться концом строки. Такие комментарии являются однострочными. Одну или несколько строк можно закомментировать или раскомментировать, выделив эти строки и выбрав соответствующий пункт контекстного меню, которое вызывается по нажатию правой кнопки мыши. Также комментарии могут быть блочными. Такие комментарии начинаются с символов /* и заканчиваются символами */. Во-вторых, исходный код имплементации состоит из нескольких разделов, как обязательных, так и необязательных, которые выделяются бледно-жёлтыми ключевыми словами, являющимися названием разделов. Например, запись implement main означает, что сразу за ней следует описание имплементации класса main, которое заканчивается ключевыми словами end implement main. Синтаксические конструкции выделяются разными цветами, однако Вы можете установить свой набор цветов с помощью пункта меню Tools  Options  Editor  Change Token Coloring.

Раздел цели goal mainExe::run(main::run). является входом в программу. Именно с него начинается выполнение программы.

Разделы предложений clauses (русская транскрипция – клозов) являются по своей сути именно той программой, которая и выполняется. Раздел clauses может быть и один. В дальнейшем мы более подробно рассмотрим структуру программы на Visual Prolog, а сейчас попробуем внести минимальную функциональность в нашу первую программу.

Для задержки закрытия окна консольного приложения можно либо запускать приложение с помощью пункта Run in Window меню Build, либо закрывать окно программно – по нажатию клавиши “Ввод”.

Пример 1. Модифицируем предикат run (цель программы), вставив предикат вывода сообщения в консольное окно, и запустим приложение с помощью пункта Run in Window меню Build:

run():-

console::init(),

console::write("Это моё первое консольное приложение на Visual Prolog 7.2"),

succeed().

Этот способ, по сути, запускает консольное приложение через автоматически создаваемый bat-файл, в котором после выполнения приложения вызывается команда ожидания ввода с клавиатуры с целью просмотра результата работы программы в окне консоли. Исполнимый файл Console1.exe и bat-файл Capdos.bat можно найти в папке EXE проекта Console1.

Обратите внимание, что строки в Visual Prolog заключаются в кавычки, а вызовы предикатов в данном примере разделяются запятыми.

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

run():-

console::init(),

console::write("Это моё первое консольное приложение на Visual Prolog 7.2"),

_=console::readChar().

Перед каждым предикатом можно не указывать имя класса, к которому он принадлежит. Для этого надо добавить через запятую имя класса в директиве open, которая находится в начале файла main.pro. Это называется “открыть класс”.

В этой и последующих программах предикат succeed() в цели использоваться не будет.

Пример 3. В данном примере продемонстрировано открытие класса console и вызов предикатов init и write без указания имени класса:

open core, console

run():-

init(),

write("Это моё первое консольное приложение на Visual Prolog 7.2"),

_= readChar().

Примечание: следует иметь в виду, что в случае неоднозначности (ambiguity) предикатов, то есть когда в программе вызываются одноимённые предикаты из двух разных классов, указывать имя класса необходимо!

Пример 4. При необходимости вместо ожидания ввода с клавиатуры можно использовать временную задержку в миллисекундах. Консольное окно закроется через указанный промежуток времени (в данной программе 1 сек.):

run():-

init(),

write("Это моё первое консольное приложение на Visual Prolog 7.2"),

programControl::sleep(1000).

2. Классы Visual Prolog (console,string,math)

Visual Prolog имеет 36 предикатов, встроенных в компилятор, которые вызываются без указания имени класса. Основная же масса предикатов хранится в библиотеке статических и динамических классов. Эта библиотека устанавливается при инсталляции Visual Prolog и носит название Prolog Foundation Classes (PFC). Предикаты из этих классов следует вызывать, указывая перед ними имя класса и два двоеточия в качестве разделителя, если только этот класс не открыт директивой open и если отсутствует неоднозначность (ambiguity). В примере 4 предикат sleep(1000) вызывался с указанием класса, в котором он описан programControl::sleep(1000).

Для тех, кто владеем английским языком, описание классов PFC приведено в файле справки, открываемый с помощью пункта меню Help  Visual Prolog Help  Содержание  Prolog Foundation Classes. Кроме этого, с помощью пункта меню Help  Reference Language Book можно ознакомиться с книгой по языку Visual Prolog в формате pdf.

Для тех, кто не читает по-английски в приложениях приведено описание основных классов на русском языке. Рассмотрим несколько примеров использования классов console, string, math.

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

run():-

init(), % инициализация консоли

setConsoleTitle("Замена подстрок"), % имя окна консоли

ВходСтрока = readLine(), % чтение строки с консоли

nl, % переход на новую строку

ВыхСтрока = string::replaceAll(ВходСтрока,"Prolog", "Пролог"), % замена всех вхождений

write(ВыхСтрока), % вывод результата

_=readchar(). % ожидание ввода для закрытия консоли

Вставьте вышеуказанное описание предиката run() в наш консольный проект вместо имеющегося предиката run(). После запуска программа ждёт от Вас ввода строки и, если в ней будут встречаться слова Prolog, то она заменит все вхождения этого слова на слово Пролог и выведет на экран полученный результат. Иначе – выведет исходную строку.

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

Задание 1. Разработайте программу разделения строки на две равные по длине половины. Подсказка: воспользуйтесь предикатом string::front(Source, Count, First, Last), который разделяет строку на две строки First и Last, причём длина первой подстроки равна Count. Для определения половины длины воспользуйтесь встроенной функцией div.

Пример 6. Разработаем программу определения максимального из двух чисел X и Y, вводимых с клавиатуры.

run():-

init(),

setConsoleTitle("Определение максимального числа"),

write("Введите первое число: "), X = read(), % ввод X

write("Введите второе число: "), Y = read(), % ввод Y

Max = math::max(X,Y), % определение максимального числа

setLocation(console_native::coord(25,10)),%столб,строка

write("Максимальное число = ", Max), % вывод рез-та

clearInput(), % очистка буфера клавиатуры

_=readchar().

Очистка буфера клавиатуры перед закрытием окна делается для корректной работы предиката ожидания нажатия клавиши “Ввод”. Если этого не делать, то оставшийся после ввода чисел код в буфере клавиатуры считывается предикатом readchar() и консольное окно закрывается без ожидания ввода от пользователя. Чтобы убедиться в этом, попробуйте выполнить программу из примера 6, предварительно закомментировав предикат очистки буфера клавиатуры.

Задание 2. Разработайте программу определения значения выражения max(A,B,C) - min(B,C) от трёх целых чисел A,B,C, вводимых с клавиатуры. Подсказка: воспользуйтесь предикатами math::max/3 и math::min/2, описание которых приведено в соответствующем приложении.

Пример 7. Данный пример показывает способ определения системной информации с использованием различных классов.

run():-

init(),

setConsoleTitle("Определение системной информации"),

write("Система:\n",environment::getSystemInfo()),

write("\n\CodePage:\n",console_native::getConsoleCP()),

Software = registry::getSubKeys(registry::currentUser(),"Software"),

write("\n\nSoftware:\n", Software),nl, 

Hardware = registry::getAllValues(registry::localMachine(),"Hardware\\Description\\System"),

write("\n\n Hardware:\n", Hardware),

_=readchar().

Пример 8. Данный пример показывает способ сохранения текста в файле в форматах Ansi и Unicode.

run():-

init(),

setConsoleTitle("Файловый ввод-вывод"),

file::writeString("unicode.txt","Тест Test",true),

file::writeString("ansi.txt","Тест Test", false),

write("Готово"),

_=readchar().

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

Задание 3. Разработайте программу получения системной информации (пример 7) и сохранения её в файл в формате ansi. Подсказка: для соединения строк воспользуйтесь предикатом string::concat/4. Так как переменные Software и Hardware не являются строками, то их надо по очереди преобразовать в строки функцией toString и только потом конкатенировать.

Соседние файлы в папке Лабораторные работы