2015-12-27 9 views
5

Dalla lettura del manuale, non riesco a trovare la differenza tra i due.Qual è la differenza tra abolish/1 e retactall/1?

Il manuale dice:

Si consiglia di utilizzare retractall/1 per cancellare tutte le clausole di un predicato dinamica.

Quindi ho scelto di utilizzare retractall/1 nel mio programma; tuttavia, mi chiedo quale sia la differenza.

risposta

6

Il predicato incorporato standard retractall/1 può essere utilizzato per rimuovere tutte le clausole per un predicato dinamico ma il predicato sarà ancora noto dal runtime. Il predicato incorporato standard abolish/1, d'altra parte, non solo rimuove tutte le clausole del predicato ma rende anche il predicato sconosciuto al runtime. Se si tenta di chiamare un predicato dinamico dopo aver rimosso tutte le sue clausole usando retractall/1, la chiamata semplicemente fallisce. Ma se si abolisce un predicato dinamico, chiamarlo dopo genererà un errore di esistenza predicato.

+0

s (X): succinte! – repeat

2

Prima di leggere la tua domanda e @PauloMoura's fine answer, non sapevo nemmeno la risposta.

Con questa risposta non voglio copiare la risposta di Paulo. Invece, vi suggerisco di prendere in considerazione la lettura/ricerca alternativi fonti Prolog-correlati:

Si noti che quanto sopra may or may not adattano direttamente the Prolog system you use.

Tuttavia, avere più fonti è una buona cosa: può impedirti di rimanere bloccato!

4

In analogia con SQL:

retractall(table_name(_,_,_)) potrebbe essere delete from table_name, mentre abolish(table_name/3) sarebbe giocare come drop table_name

Problemi correlati