Search code examples
prologprolog-toplevel

Prolog program returns false


I implemented the following power program in Prolog:

puissance(_,0,1).
puissance(X,N,P) :- N>0,A is N-1, puissance(X,A,Z), P is Z*X.

The code does what is supposed to do, but after the right answer it prints "false.". I don't understand why. I am using swi-prolog.


Solution

  • You can add a cut operator (i.e. !) to your solution, meaning prolog should not attempt to backtrack and find any more solutions after the first successful unification that has reached that point. (i.e. you're pruning the solution tree).

    puissance(_,0,1) :- !.
    puissance(X,N,P) :- N>0,A is N-1, puissance(X,A,Z), P is Z*X.
    

    Layman's Explanation:

    The reason prolog attempts to see if there are any more solutions, is this:

    At the last call to puissance in your recursion, the first puissance clause succeeds since P=1, and you travel all the way back to the top call to perform unification with P with the eventual value that results from that choice.

    However, for that last call to puissance, Prolog didn't have a chance to check whether the second puissance clause would also be satisfiable and potentially lead to a different solution, therefore unless you tell it not to check for further solutions (by using a cut on the first clause after it has been successful), it is obligated to go back to that point, and check the second clause too.

    Once it does, it sees that the second clause cannot be satisfied because N = 0, and therefore that particular attempt fails.

    So the "false" effectively means that prolog checked for other choice points too and couldn't unify P in any other way that would satisfy them, i.e. there are no more valid unifications for P.

    And the fact that you're given the choice to look for other solutions in the first place, exactly means that there are still other routes with potentially satisfiable clauses remaining that have not been explored yet.