Задача на Prolog GNU
Здравствуйте!
Помогите доделать задачку на Prolog GNU.
Написать функцию, выполняющую над числовым одноуровневым списком следующую операцию. Причем последовательное возведение в степень выполняется справа налево.
(A B C ...) —> A^B^C...
Дошел до следующего:
// функция а - возведение в степень. работает корректно.
a(A, 1, A):-!.
a(_, 0, 1):-!.
a(A, N, Y):- NN is N-1, a(A, NN, R), Y is R*A.
// функция b - обработка списка. работает криво, проблема, так понимаю, в третей строке. Получается возведение только последних двух чисел,
т.е для списка (2, 3, 2, 4) будет только 2^4.
b([], _):- !.
b([H|[HH|[]]], X):- a(H, HH, Y), X is Y, !.
b([H|T], X):- b(T, X), a(H, X, K).
Пишу по аналогии программы на Lisp, которую писал ранее, может, поможет вам разобраться:
(defun ^ (x n)
(if (= N 0) 1
(if (< N 0)
(/ 1 (^ x (- 0 N)))
(* x (^ x (- N 1))) )
) )
(defun A (L)
(cond
((null L) nil)
((null (cddr L)) (^ (car L) (cadr L)))
(T (^ (car L)(A (cdr L))))
) )
Спасибо за помощь.
- Задача решена.
Как и говорил, проблема была в третей строке функции b.
Нужно было внимательнее разбираться с переменными:
b([H|T], X):- b(T, K), a(H, K, G), X is G.
Источник: Stack Overflow на русском