file - tutorial - Swi Prolog, descargando archivos fuente
swi prolog manual (3)
Después de consultar un archivo, se vuelve "irrelevante" para Prolog. Entonces, creo que, en general, la respuesta debería ser no . Pero SWI-Prolog tiene una gran cantidad de integrales que le permiten controlar su prolgram. Por ejemplo
?- [stackoverflow].
?- predicate_property(P, file(''/home/carlo/prolog/stackoverflow.pl'')).
P = yield(_G297, _G298) ;
P = now _G297 ;
P = x(_G297) ;
...
?- abolish(yield/2).
true.
?- predicate_property(P, file(''/home/carlo/prolog/stackoverflow.pl'')).
P = now _G297 ;
P = x(_G297) ;
...
Tenga en cuenta que abolir no requiere que el nombre de archivo funcione, puede eliminar predicados cargados de otros archivos de fuentes.
clause , clause_property y erase deberían dar más control, pero me sale un error que no entiendo (no está documentado) cuando intento usar erase:
?- clause(strip_spaces(_G297, _G298),X,Y),erase(Y).
ERROR: erase/1: No permission to clause erase `<clause>(0x29acc30)''
¿Existe un predicado incorporado o una forma sencilla de eliminar de la base de datos de conocimiento de prolog a los archivos fuente que ya se han consultado? Revisé el manual de referencia y no encontré nada que pudiera hacer eso.
si conoce el nombre del predicado, por ejemplo fact / 2, puede usar:
retractall(fact(_,_)).
Puede hacerlo con estos procedimientos que utilizan source_file/1
y source_file/2
:
unload_last_source:-
findall(Source, source_file(Source), LSource),
reverse(LSource, [Source|_]),
unload_source(Source).
unload_source(Source):-
ground(Source),
source_file(Pred, Source),
functor(Pred, Functor, Arity),
abolish(Functor/Arity),
fail.
unload_source(_).
unload_source/1
suprime todos los predicados definidos por el nombre del archivo de origen de entrada. Se advirtió que debe ser un camino absoluto.
unload_last_source/0
recuperará el último nombre de archivo consultado y lo descargará.