2010-03-12 21 views
23

Me preguntaba, soy consciente de que puede usar assert para agregar hechos o reglas o lo que sea si ha declarado que el predicado es -:dynamic, pero esto solo permite que los cambios que se realizan se mantengan en ese sesión solamente, por ejemplo si cierra la ventana de Prolog, los cambios en la base de datos se pierden.Prolog - ASSERT y RETRACT

Así que me preguntaba, ¿hay alguna forma de hacerlo para que los predicados assert y retract puedan realizar cambios permanentes en el archivo .pl de Prolog?

Gracias

Respuesta

37

Te puedo sugerir una manera muy sencilla de hacer esto.

1 ?- assert(a(1)). 
true. 

2 ?- assert(a(2)). 
true. 

3 ?- assert(a(3)). 
true. 

4 ?- a(A). 
A = 1 ; 
A = 2 ; 
A = 3. 

5 ?- tell('a_db.txt'), listing(a), told. 
true. 

A continuación, cierre la sesión, vuelva a abrir.

1 ?- a(A). 
ERROR: toplevel: Undefined procedure: a/1 (DWIM could not correct goal) 
2 ?- ['a_db.txt']. 
% a_db.txt compiled 0.00 sec, 516 bytes 
true. 

3 ?- a(A). 
A = 1 ; 
A = 2 ; 
A = 3. 

4 ?- listing(a). 
:- dynamic a/1. 

a(1). 
a(2). 
a(3). 

true. 
+2

gracias, parece que funciona, me preguntaba si es posible señalar SWI a un directorio en particular en lugar del directorio predeterminado? cuando se usa el comando tell por supuesto, – KP65