Jordanthedud
Jordanthedud

Reputation: 61

Prolog Recursion (Factorial of a Power Function)

I am having some troubles with my CS assignment. I am trying to call another rule that I created previously within a new rule that will calculate the factorial of a power function (EX. Y = (N^X)!). I think the problem with my code is that Y in exp(Y,X,N) is not carrying over when I call factorial(Y,Z), I am not entirely sure though. I have been trying to find an example of this, but I haven been able to find anything.

I am not expecting an answer since this is homework, but any help would be greatly appreciated.

Here is my code:

/* 1.2: Write recursive rules exp(Y, X, N) to compute mathematical function Y = X^N, where Y is used
to hold the result, X and N are non-negative integers, and X and N cannot be 0 at the same time
as 0^0 is undefined. The program must print an error message if X = N = 0.
*/

exp(_,0,0) :-
    write('0^0 is undefined').

exp(1,_,0).

exp(Y,X,N) :-
    N > 0, !, N1 is N - 1, exp(Y1, X, N1), Y is X * Y1.

/* 1.3: Write recursive rules factorial(Y,X,N) to compute Y = (X^N)! This function can be described as the
factorial of exp. The rules must use the exp that you designed.
*/

factorial(0,X) :-
    X is 1.

factorial(N,X) :-
    N> 0, N1 is N - 1, factorial(N1,X1), X is X1 * N.

factorial(Y,X,N) :-
    exp(Y,X,N), factorial(Y,Z).

Upvotes: 0

Views: 928

Answers (1)

Miloslav Raus
Miloslav Raus

Reputation: 767

The Z variable mentioned in factorial/3 (mentioned only once; so-called 'singleton variable', cannot ever get unified with anything ...).

Noticed comments under question, short-circuiting it to _ won't work, you have to unify it with a sensible value (what do you want to compute / link head of the clause with exp and factorial through parameters => introduce some parameter "in the middle"/not mentioned in the head).

Edit: I'll rename your variables for you maybe you'll se more clearly what you did:

factorial(Y,X,Result) :-
    exp(Y,X,Result), factorial(Y,UnusedResult).

now you should see what your factorial/3 really computes, and how to fix it.

Upvotes: 1

Related Questions