Visual Prolog
Реализация языка программирования PrologVisual Prolog — продукт датской фирмы Prolog Development Center. Ранее распространялся под названием Turbo Prolog (Borland) и PDC Prolog.
Prolog Development Center затратил более трех лет на разработку системы Visual Prolog с поэтапным бета-тестированием, поставки коммерческой версии которой начались с февраля 1996. Visual Prolog является единственной в мире Prolog-системой со 100% оболочкой выполненной в идеологии Visual и рядом высокоуровневых компонент, которые упрощают разработку программ для систем Windows (версия 5.x поддерживала и платформу OS2).
Visual Prolog автоматизирует построение сложных процедур и освобождает программиста от выполнения тривиальных операций. С помощью Visual Prolog проектирование пользовательского интерфейса и связанных с ним окон, диалогов, меню, строки уведомлений о состояниях и т.д. производится в графической среде. С созданными объектами сразу же могут работать различные Кодовые Эксперты (Code Experts), которые используются для генерации базового и расширенного кодов на языке Prolog, необходимых для обеспечения их функционирования.
Мощность языка Prolog в сочетании с современной системой пользовательских интерфейсов (GUI — Graphical User Interface) делает простой и интуитивно понятной разработку систем, основанных на знаниях, систем поддержи принятия решений, планирующих программ, развитых систем управления базами данных и т.д.
Visual-среда разработки
Среда разработки приложений системы Visual Prolog включает текстовый редактор, различные редакторы ресурсов, средства разработки Help систем в гипертекстовом представлении, систему отслеживания изменений, которая обеспечивает перекомпиляцию и перегенерацию только измененных ресурсов и модулей, ряд экспертов Кода, оптимизирующий компилятор и набор средств просмотра различных типов информации о проекте. Полная интеграция всех средств обеспечивает повышение скорости разработки приложений. Полученные приложения являются исполняемыми .EXE программами и не требуют никаких дополнительных окружения и лицензирования.
Совместимые библиотеки
Система программирования пользовательских интерфейсов (до 6.x VPI — Visual Programming Interface, начиная с 7.x — объектно-ориентированная GUI) системы Visual Prolog является высокоуровневой абстракцией свойств поддерживаемых в базовой оконной системе Windows (в 5.x — также OS2)..
В систему включен также интерфейс с базами данных типа SQL. Почти все типы баз данных доступны с использованием Windows ODBC (Open Database Connectivity) интерфейса. Поддерживаются также обращения к базам данных Oracle, а в платформе OS/2 поддержано взаимодействие с системой управления базами данных DB/2
Среда разработки Visual Prolog 4.0
Примеры:
Hello, World!:
Пример для версий Visual Prolog 7.2Visual Prolog создает проекты автоматически. Для запуска примера следует создать новый проект, выбрав “Console” в качестве UI Strategy, перейти к редактированию файла main.pro
и заменить его содержимое приведенным кодом.
implement main
open core
constants
className = "main".
classVersion = "".
clauses
classInfo(className, classVersion).
clauses
run():-
console::init(),
stdio::write("Hello, World!"),
programControl::sleep(1000),
succeed().
end implement main
goal
mainExe::run(main::run).
Факториал:
Пример для версий Visual Prolog 7.2Для запуска создайте новый проект с UI Strategy “Console” и замените содержимое файлов main.cl
и main.pro
приведенным кодом.
В main.cl
добавлена одна строка factorial : (integer N, integer F) procedure (i,o).
, которая определяет бинарный предикат factorial
с известным первым и неизвестным вторым аргументами. Ключевое слово procedure
описывает поведение предиката, указывая, что его вычисление всегда будет успешным и будет найдено ровно одно решение, так что откаты не понадобятся.
В main.pro
находится собственно определение нового предиката. Для каждого его вызова есть два возможных соответствия — с нулевым или произвольным первым аргументом. Visual Prolog перебирает формулы в порядке их появления в коде, так что если первый аргумент равен нулю, проверка начинается с первой формулы factorial(0,F)
. Первое правило формулы — !, так называемое отсечение, использование которого предотвращает откат ко второй формуле и таким образом обеспечивает наличие ровно одного решения предиката. После этого переменная F, содержащая решение предиката, устанавливается в 1 и выводится на печать. Вторая формула factorial(N,F)
рекурсивно вычисляет F1 как факториал N-1, устанавливает решение предиката равным N*F1 и выводит его на печать. Наконец, stdio::nl
печатает новую строку.
При выполнении основной программы предикат factorial
выполняется ровно один раз, для N=12. С каждым вызовом рекурсии N уменьшается на единицу, пока не становится равным нулю. После этого значения факториалов возвращаются и выводятся на печать в порядке возрастания. Программа обрабатывает только факториалы до 12!, т.к. попытка вычисления 13! вызывает ошибку переполнения целочисленного типа.
% main.cl
class main
open core
predicates
classInfo : core::classInfo.
factorial : (integer N, integer F) procedure (i,o).
predicates
run : core::runnable.
end class main
% main.pro
implement main
open core
constants
className = "main".
classVersion = "".
clauses
classInfo(className, classVersion).
factorial(0,F) :-
!,
F = 1,
stdio::write("0! = 1"),
stdio::nl.
factorial(N,F) :-
factorial(N-1,F1),
F = N*F1,
stdio::write(N, "! = ", F),
stdio::nl.
clauses
run():-
console::init(),
factorial(12,F),
programControl::sleep(1000),
succeed().
end implement main
goal
mainExe::run(main::run).
Числа Фибоначчи:
Пример для версий Visual Prolog 7.2В этом примере определяются два новых предиката — бинарный fibonacci(N,F)
для вычисления N-ого числа Фибоначчи и loop(N)
для его вывода на печать. Единожды вычисленные числа не сохраняются для позднейшего использования, поэтому эта реализация неэффективна.
Следует отметить отличие реализаций предикатов от примера для факториала: формулы, описывающие начальные условия, задаются для произвольного значения переменной, но вычисляются до конца только в том случае, если первое правило (N<3
или N=1
, соответственно) оценивается как истинное. Кроме того, каждый предикат записан как одна формула, использующая конъюнкцию и дизъюнкцию, а не как набор отдельных формул, использующих только конъюнкцию.
% main.cl
class main
open core
predicates
classInfo : core::classInfo.
fibonacci : (integer N, integer F) procedure (i,o).
loop : (integer N) procedure (i).
predicates
run : core::runnable.
end class main
% main.pro
implement main
open core
constants
className = "main".
classVersion = "".
clauses
classInfo(className, classVersion).
fibonacci(N,F) :-
N < 3, !, F = 1;
fibonacci(N-1,F1), fibonacci(N-2,F2), F = F1 + F2.
loop(N) :-
( N = 1, !, fibonacci(1,F);
loop(N-1), fibonacci(N,F) ),
stdio::write(F, ", ").
clauses
run():-
console::init(),
loop(16),
stdio::write("..."),
programControl::sleep(1000),
succeed().
end implement main
goal
mainExe::run(main::run).
Квадратное уравнение:
Пример для версий Visual Prolog 7.2Для запуска создайте новый проект с UI Strategy “Console” и замените содержимое файлов main.cl
и main.pro
приведенным кодом.
В main.cl
добавлена одна строка q : () procedure().
. Ключевое слово procedure
описывает поведение предиката, указывая, что его вычисление всегда будет успешным и будет найдено ровно одно решение, так что откаты не понадобятся.
В main.pro
находится собственно определение нового предиката. Предикат q
не принимает аргументов, поскольку читает необходимые данные из stdio
. Условное оценивание (конструкцияif-then-else
) работает точно так же, как в других языках. Единственным отличием является знак отсечения !
перед then
. Это означает, что как только условие if
выполняется, откат уже не потребуется.
Хитрость этого примера в том, что невозможно сразу вычислить дискриминант, как в других языках. Тип данных по умолчанию для переменной D
в присвоении D = B*B-4*A*C
-uReal
, который может хранить только неотрицательные числа.
% main.cl
class main
open core
predicates
classInfo : core::classInfo.
q : () procedure().
predicates
run : core::runnable.
end class main
% main.pro
implement main
open core
constants
className = "main".
classVersion = "".
clauses
classInfo(className, classVersion).
q() :-
stdio::write("A = "),
A = stdio::read(),
if (A = 0), ! then
stdio::write("Not a quadratic equation."), stdio::nl
else
stdio::write("B = "),
B = stdio::read(),
stdio::write("C = "),
C = stdio::read(),
if (B*B = 4*A*C), ! then
stdio::writef("x = %f", -B/2.0/A)
elseif (B*B > 4*A*C), ! then
D = B*B-4*A*C,
stdio::writef("x1 = %f\n", (-B+math::sqrt(D))/2.0/A),
stdio::writef("x2 = %f", (-B-math::sqrt(D))/2.0/A)
else
D = -B*B+4*A*C,
stdio::writef("x1 = (%f, %f)\n", -B/2.0/A, math::sqrt(D)/2.0/A),
stdio::writef("x2 = (%f, %f)", -B/2.0/A, -math::sqrt(D)/2.0/A)
end if
end if.
clauses
run():-
console::init(),
q(),
succeed().
end implement main
goal
mainExe::run(main::run).
Комментарии
]]>blog comments powered by Disqus
]]>