LINUX.ORG.RU

[Prolog] Предикат, находящий длину гипотенузы прямоугольного треугольника по длинам катетов.

 


0

0

Здравствуйте!

Решил поупражнять мозги декларативным программированием. Читаю лекции на intuit.ru. В качестве среды использую swipl.

Добрался до лекции «Основные понятия пролога» (http://www.intuit.ru/department/pl/plprolog/3/). В конце этой лекции есть такое задание:

Создайте предикат, находящий длину гипотенузы прямоугольного треугольника по длинам катетов.

http://www.intuit.ru/department/pl/plprolog/3/4.html

В лекциях нигде нет упоминаний о встроенной функции вычисления квадратного корня. Поэтому, насколько я понимаю, вначале надо создать предикат, вычислящий квадратный корень из числа. Ну, хотя бы, работающий в области целых чисел (способный вычислить корень от 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. А как реально можно написать функцию нахождения квадратного корня?


>Например, корректна ли такая запись вычисления куба: cube:-(X, X*X*X).

cube(Y,X) :- Y is X * X * X

Zubok ★★★★★
()
Ответ на: комментарий от Zubok

Я писал на только TurboProlog, там формы is не было, там я бы написал просто:

cube(X,Y) :- X*X*X = Y.

Хочу заметить, что если вызвать cube(x1, x2) и обе переменных будут определены, то предикат просто вернет истину=)

dizza ★★★★★
()
Ответ на: комментарий от dizza

> Я писал на только TurboProlog, там формы is не было, там я бы написал просто:

cube(X,Y) :- X*X*X = Y.


Фигасе, как это работает??? Операция присваивания всегда присваивает левой части значение правой. Что означает «X*X*X = Y» ?

xintrea
() автор топика
Ответ на: комментарий от Zubok

>> Есть какие-то причины размещать ответ в первой позиции?

На этот вопрос я отвечу за деньги. :)


Вон из треда! :))

xintrea
() автор топика
Ответ на: комментарий от dizza

>если разумеется x2 будет равно x1*x1*x1

Ну это, собственно, понятно.

Я писал на только TurboProlog, там формы is не было

Эта форма уже прописана в стандарте ISO Prolog, ЕМНИП.

Zubok ★★★★★
()
Ответ на: комментарий от xintrea

Ну я могу ошибаться, давно все таки писал, но вроде бы такая форма корректна. Знак «=» это не присваивание, это спец. оператор со спец. семантикой и семантика его зависит от аргументов, т.е. если оба аргумента определены, то сравнивает, если хотя бы один определен, то перебрасывает значение, иначе откат, как-то так.

dizza ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.