Pregunta

¿Por qué funciona esto:

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

Y esto da una excepción de desbordamiento de pila?

power(_,0,1) :- !.
power(X,Y,Z) :-
  power(X,Y - 1,Z1),
  Z is X * Z1.
¿Fue útil?

Solución

Dado que las operaciones aritméticas se realizan sólo sobre las cláusulas a través del operador is. En su primer ejemplo, Y1 está unido al resultado del cálculo de Y - 1. En la tarde, el sistema intenta demostrar el poder cláusula (X, Y1, Z1), que unifica con el poder (X 'Y', Z ') X unión' = X, Y '= Y - 1, Z' = Z. Esto entonces recursivamente de nuevo, por lo que Y '' = Y - 1 -. 1, etc para el infinito, en realidad nunca realizar el cálculo

Prolog es ante todo justo unificación de términos - cálculo, en el sentido "común", tiene que ser pedido explícitamente.

Otros consejos

Las dos definiciones no funcionan correctamente.

Considere

?- pow(1, 1, 2).

que los bucles para ambas definiciones porque la segunda cláusula se puede aplicar independientemente del segundo argumento. El corte en la primera cláusula no puede deshacer esto. La segunda cláusula necesita un Y > 0 meta antes de la meta recursiva. Usando (is)/2 sigue siendo una buena idea para obtener soluciones reales.

La mejor (para principiantes) es comenzar con o y evitar .

Vea ej .: Prolog predicado - bucle infinito

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top