Risoluzione unificazione prologo
-
19-09-2019 - |
Domanda
Perché questo lavoro:
power(_,0,1) :- !.
power(X,Y,Z) :-
Y1 is Y - 1,
power(X,Y1,Z1),
Z is X * Z1.
E questo dà un'eccezione di overflow dello stack?
power(_,0,1) :- !.
power(X,Y,Z) :-
power(X,Y - 1,Z1),
Z is X * Z1.
Soluzione
Poiché le operazioni aritmetiche vengono eseguite solo sulle clausole attraverso l'operatore is
. Nel primo esempio, Y1 è legato al risultato del calcolo Y - 1. In seguito, il sistema tenta di dimostrare la potenza clausola (X, Y1, Z1), che unifica con potenza (X 'Y', Z ') vincolante X' = X, Y '= Y - 1, Z' = Z. Questo poi recurses nuovo, così Y '' = Y - 1 -. 1, ecc per l'infinito, mai che effettua il calcolo
Prolog è in primo luogo proprio l'unificazione dei termini - calcolo, nel senso "comune", deve essere chiesto in modo esplicito.
Altri suggerimenti
Entrambe le definizioni non funzionano correttamente.
Si consideri
?- pow(1, 1, 2).
che loop da entrambe le definizioni perché la seconda clausola può essere applicata indipendentemente dal secondo argomento. Il taglio nella prima clausola non può annullare questo. La seconda clausola ha bisogno di un Y > 0
obiettivo prima che l'obiettivo ricorsiva. Utilizzando (is)/2
è ancora una buona idea per ottenere soluzioni attuali.
Il meglio (per i principianti) è quello di iniziare con successore aritmetica o clpfd e per evitare Prolog-cut tutto .
Si veda ad es .: Prolog predicato - ciclo infinito