Квадратное уравнение в Prolog
Для запуска создайте новый проект с 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
]]>