Prolog program returns false

前端 未结 3 1461
温柔的废话
温柔的废话 2021-01-29 04:34

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 cod

3条回答
  •  无人及你
    2021-01-29 05:20

    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.

提交回复
热议问题