2014-11-10 5 views
3

Я пытаюсь вычислить рекурсивную функцию:Рекурсивные функции в Прологе

f(x, y) = 0 if x = 0; 
f(x, y) = 1 if x = 1; 
f(x, y) = y*y*f(x-2,y) if x>1. 

Я попробовал этот путь:

f(0,_,0). 
f(1,_,1). 
f(X,Y,Z):- 
      X>1, 
      XX is X-2, 
      ZZ = Y*Y*Z, 
      f(XX,Y,ZZ). 

я могу получить только истина/ложь. Как я могу вычислить значение этой функции?

спасибо!

+1

Использовать 'as/2' для арифметического назначения (' =/2' используется для эквивалентности при подстановке). Например, «XX - это X-2». –

+1

Первые два правила могут быть заменены на 'f (0, _, 0) .' и' f (1, _, 1) .' –

+0

Ted Hopp, Wouter Beek, я изменился, но это не поможет. Я не могу получить результат – user3649515

ответ

1

Ваше последнее правило выглядит немного странным для меня. Я хотел бы попробовать что-то вроде этого:

f(X,Y,Z) :- 
    X > 1, 
    XX is X-2, 
    f(XX,Y,ZZ), 
    Z is Y * Y * ZZ. 
+0

Тед Хопп, спасибо вам большое! – user3649515

3

Вы можете легко превратить это в истинном отношении, если вы просто используете CLP (FD) ограничения:

:- use_module(library(clpfd)). 

f(0, _, 0). 
f(1, _, 1). 
f(X, Y, Z):- 
     X #> 1, 
     XX #= X-2, 
     Z #= Y*Y*ZZ, 
     f(XX, Y, ZZ). 

Пример запроса и его результат:

?- f(X, 5, Z). 
X = Z, Z = 0 ; 
X = Z, Z = 1 ; 
X = 2, Z = 0 ; 
X = 3, Z = 25 . 
Смежные вопросы