Search code examples
exceptionrecursionprologsuccessor-arithmeticsinstantiation-error

Keep getting the error message "Arguments are not sufficiently instantiated" can't understand why


Keep getting the error Arguments are not sufficiently instantiated for the multiplication by addition rule I wrote as shown below.

mult(_, 0, 0).                                   %base case for multiplying by 0
mult(X, 1, X).                                   % another base case
mult(X, Y, Z) :-
   Y > 1,
   Y1 is Y - 1,
   mult(X, Y1, Z1),
   Z is X + Z1. 

I am new to Prolog and really struggling with even such simple problems.

Any recommendations for books or online tutorials would be great.

I am running it on SWI-Prolog on Ubuntu Linux.


Solution

  • I think you got the last two calls reversed. Don't you mean:

    mult(X,Y,Z):- Y>1,Y1 is Y-1, Z1 is X+Z, mult(X,Y1,Z1).
    

    Edit: nevermind that, looked at the code again and it doesn't make sense. I believe your original code is correct.

    As for why that error is occuring, I need to know how you're calling the predicate. Can you give an example input?

    The correct way of calling your predicate is mult(+X, +Y, ?Z):

    ?- mult(5,0,X).
    X = 0
    
    ?- mult(5,1,X).
    X = 5
    
    ?- mult(5,5,X).
    X = 25
    
    ?- mult(4,4,16).
    yes
    
    ?- mult(3,3,10).
    no
    

    etc. Calling it with a free variable in the first two arguments will produce that error, because one of them will be used in the right side of an is or in either side of the <, and those predicates expect ground terms to succeed.