Combinando unos de posts anteriores, el de preguntar al usuario, el de variables estáticas y el de añadir conocimiento dinámicamente, podemos elaborar algo como este codekata o howto en Prolog. En este codekata, en vez de añadir el conocimiento al sistema estáticamente mediante un fichero .pl, se le pregunta al usuario por el dato, en este caso su nombre, y se almacena para después poder consultarlo durante dure la sesión.
El código fuente
% Testing predicados dinámicos..
:- dynamic tuNombreEs/1.
preguntaNombre :-
write('¿Cómo te llamas?'), nl,
read(Nombre),
write('Guardando tu nombre: '), write(Nombre), nl,
assert(tuNombreEs(Nombre)).
escribeNombre :-
tuNombreEs(Nombre),
write('Tu nombre es: '), write(Nombre), nl.
Aquí se declara un predicado dinámico de un parámetro. Es dinámico porque se podrá hacer aserciones para añadir conocimiento como en un post anterior podría añadir el mismo usuario. Ahora se le pregunta al usuario, pero luego se hace la aserción de que tuNombreEs(Nombre). Con lo que luego se puede consultar el nombre del usuario.
Esto traerá problemas porque simplemente así podremos establecer tantos nombre como queramos, pero en este caso sólo queremos uno. Puede ser necesario si queremos añadir tantos datos como queramos, pero si queremos sólo almacenar un sólo dato del nombre, hay que combinar el assert() con un retract() para borrar el anterior.
Si ahora mismo el programa pregunta varias veces por el nombre, podría pasar algo como lo siguiente:
?- preguntaNombre.
¿Cómo te llamas?
|: jaime.
Guardando tu nombre: jaime
true.
?- preguntaNombre.
¿Cómo te llamas?
|: pepe.
Guardando tu nombre: pepe
true.
?- escribeNombre.
Tu nombre es: jaime
true ;
Tu nombre es: pepe
true.
?-
Esto se podría solucionar con la función de borrado de conocimiento, el retractall, algo así:
preguntaNombre :-
write('¿Cómo te llamas?'), nl,
read(Nombre),
write('Guardando tu nombre: '), write(Nombre), nl,
retractall(tuNombreEs(_)),
assert(tuNombreEs(Nombre)).