Степенная функция в прологе - PullRequest
0 голосов
/ 17 апреля 2010

Точно, каково определение Пролога для степенной функции. Я написал этот код, и он дает некоторые ошибки. Я хочу знать точный код для степенной функции.

pow(X,0,1).
pow(X,Y,Z):-Y1=Y-1,pow(X,Y1,Z1),Z1=Z*X.

Что-то не так с этим кодом?

Ответы [ 2 ]

2 голосов
/ 27 сентября 2011

Есть две проблемы с кодом.

  • Чтобы сделать арифметику в прологе, вы должны использовать / 2 вместо =
  • Переменные в умножении пришлось поменять местами (Z - Z1 * X)
  • Вы должны установить охрану, чтобы показатель был положительным, в противном случае вы можете столкнуться с ситуациями, когда программа не прекратит работу.

Вот фиксированный код:

  pow(_,0,1).
  pow(B,E,R) :- E > 0,!, E1 is E -1, pow(B,E1,R1), R is B * R1.

Вот вторая, хвостовая рекурсивная версия с использованием аккумулятора

  powa(B,E,R) :- powa(B,E,1,R).
  powa(_,0,A,A).
  powa(B,E,A,R) :- E > 0, !, E1 is E - 1, A1 is B * A, powa(B,E1,A1,R).
1 голос
/ 17 апреля 2010

Посмотрите здесь - функция мощности в прологе . Встроенный предикат pow не реализован в прологе по соображениям эффективности - как большинство арифметических предикатов.

...