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.
È stato utile?

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 o e per evitare tutto .

Si veda ad es .: Prolog predicato - ciclo infinito

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top