resolución de la unificación de prólogo
-
19-09-2019 - |
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.
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 -sucesores aritmética o clpfd y evitar prólogo-cortaron por completo .
Vea ej .: Prolog predicado - bucle infinito