Здравствуйте!
Решил поупражнять мозги декларативным программированием. Читаю лекции на intuit.ru. В качестве среды использую swipl.
Добрался до лекции «Основные понятия пролога» (http://www.intuit.ru/department/pl/plprolog/3/). В конце этой лекции есть такое задание:
Создайте предикат, находящий длину гипотенузы прямоугольного треугольника по длинам катетов.
В лекциях нигде нет упоминаний о встроенной функции вычисления квадратного корня. Поэтому, насколько я понимаю, вначале надо создать предикат, вычислящий квадратный корень из числа. Ну, хотя бы, работающий в области целых чисел (способный вычислить корень от 1, 4, 9, 16, 25 и т.д.).
Логически, квадратный корень - это число, которое будучи умноженное на само себя, будет равно числу, для которого мы ищем квадратный корень.
То есть, нам каким-то образом надо записать что-то в стиле
sqtr(X, Y):-
Y*Y==X.
Конечно, понятно что такая запись неправильна. А неправильна потому, что в лекциях много не договаривается. Например.
1. Неясно, как вообще передается вычисленный аргумент в результат функции. Я только предполагаю, что вычисленный аргумент обязательно должен быть последним в «заголовке» правила.
2. В лекциях не сказано, как делать сравнения на равенство. Я только предполагаю, что оно обоначается «==».
3. В лекциях не сказано, можно ли в заголовке правила использовать математические/логические выражения. Например, корректна ли такая запись вычисления куба: cube:-(X, X*X*X). ? Swipl на нее ругается.
4. Понятно, что чудес не бывает, и задать прологу задание «а найди-ка число, которое, умножив на само себя, получим входное значение» нельзя без организации перебора значений, квадрат которых мы будем сравнивать с исходным значением. Например, перебирая значения от 1 до X/2. Пускай, это неэффективно, но это решение «в лоб», и пролог должен позволить его сделать. А это значит, что нужно делать какую-то рекурсию, о которой в лекциях к этому моменту еще ничего не рассказано.
Вопрос 1. Как вы думаете, как надо решить задачу нахождения длины гипотенузы? Нужно каким-то образом из астрала узнать, что в прологе есть встроенная функция нахождения квадратного корня? Или есть какое-то другое решение, которое можно построить на основе знаний, выложенных в этих лекциях к главе «Основные понятия пролога»?
Вопрос 2. А как реально можно написать функцию нахождения квадратного корня?