Question

Pourquoi ce travail:

   power(_,0,1) :- !.
   power(X,Y,Z) :-
      Y1 is Y - 1,
      power(X,Y1,Z1),
      Z is X * Z1.

Et cela donne une exception de débordement de pile?

power(_,0,1) :- !.
power(X,Y,Z) :-
  power(X,Y - 1,Z1),
  Z is X * Z1.
Était-ce utile?

La solution

Parce que les opérations arithmétiques sont effectuées uniquement sur les clauses par l'opérateur is. Dans votre premier exemple, Y1 est lié au résultat du calcul Y - 1. Dans la suite, le système tente de prouver la puissance de l'alinéa (X, Y1, Z1), qui unifie la puissance (X «Y », Z ') de liaison X' = X, Y '= Y - 1, Z' = Z. Ce récursif là encore, si Y '' = Y - 1 -. 1, etc pour l'infini, jamais réellement effectuer le calcul

Prolog est avant tout simplement l'unification des termes - calcul, dans le sens « commun », doit être demandé explicitement.

Autres conseils

Les deux définitions ne fonctionnent pas correctement.

Considérons

?- pow(1, 1, 2).

qui boucles pour les deux définitions car la deuxième clause peut être appliquée quel que soit le deuxième argument. La coupe dans la première clause ne peut pas annuler cette. La deuxième clause a besoin d'un Y > 0 de but avant que l'objectif récursive. L'utilisation (is)/2 est toujours une bonne idée pour obtenir des solutions réelles.

Le meilleur (pour les débutants) est de commencer par et éviter tout à fait .

Voir .: par exemple prédicat Prolog - boucle infinie

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top