En primer lugar cargamos la base de datos con los siguientes datos de países con sus respectivas capitales:
:- dynamic capital_of/2
capital_of(suiza,berna).
capital_of(chile,santiago).
capital_of(eeuu,washington).
capital_of(estados_unidos,washington).
capital_of(italia, roma).
capital_of(francia, paris).
capital_of(austria, viena).
capital_of(alemania, berlin).
capital_of(españa, madrid).
capital_of(peru, lima).
capital_of(mexico, ciudad_de_mexico).
Prolog tiene la capacidad de adquirir nuevas cláusulas en tiempo de ejecución probemos la siguiente linea una vez compilado la base:
?-capital_of(hawaii, X).Nos damos cuenta que no se pudo unificar, ahora prueba:
?- listing.listing muestra todas las cláusulas que conforman el programa en memoria hasta el momento. Ahora prueba:
?- listing(capital_of).Ésto sólo muestra aquellas cláusulas asociadas al predicado indicado como parámetro.
Se pueden incluir más cláusulas a la base de datos mediante el predicado assert/1
:?- assert (capital_of(hawaii, honolulu)).Sin embargo, ésto sólo funciona para predicados que han sido marcados como dínamicos mediante el predicado dynamic/1. de la forma como se marcó al predicado de nuestra base de datos.
Ahora como ya hemos ingresado datos a la memoria hacemos:
?- capital_of(hawaii, X).Y esto nos resulta una respuesta exitosa.
Para Eliminar una cláusula hacemos los siguiente:
?- retract (capital_of(hawaii, honolulu)).Existen más predicados que permiten inspeccionar el estado de la base de datos, inclusive para construir y ejecutar dinámicamente predicados en tiempo de ejecución. Para mayor información, puedes revisar la base de datos.
Usando archivos con tell('mi_archivo') se abre al archivo
'mi_archivo'
y redirige la escritura hacia él, análogo a see. Para cerrar al archivo, aplicar told/0.?-tell('mi_archivo'), write('andrea'), nl, write('javier'), nl, told.Tras ejecutar la consulta anterior, revisa si existe el archivo 'mi_archivo' y si su contenido es el esperado.
Ahora, vuelve a leer los datos escritos mediante:
?-see('mi_archivo'), read(X), read(Y).Ahora carga el programa 'learner.pl' y ejecuta start. Juega un rato con él. Para finalizarlo, ingresa stop.
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%Revisa el programa, modifícalo, de manera que al ingresar
% File learner.pl %
% Un pequeño programa que modifica su propia base de conocimientos. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
start :- consult('bdc.pl'),
nl,
write('Escribe los nombres completamente en minúsculas,'), nl,
write('seguidos de un punto.'), nl,
nl,
process_a_query.
process_a_query :- write('País? '),
read(Pais),
answer(Pais).
% Si el usuario ingresa "stop.", entonces grabar la nueva
% base de conocimientos y salir.
answer(stop) :- write('Grabando la base de conocimientos...'), nl,
tell('bdc.pl'),
listing(capital_of),
told,
write('Listo.'), nl.
% Si el país ya está en la base de conocimientos, entonces retornar
% el nombre de su capital.
answer(Pais) :- capital_of(Pais, Ciudad),
write('La capital de '),
write(Pais),
write(' es '),
write(Ciudad), nl,
nl,
process_a_query.
% Si el país no está en la base de conocimientos, entonces pedir
% el nombre de la capital e ingresar este fact a la base.
answer(Pais) :- \+ capital_of(Pais, Ciudad),
write('No conozco la capital de ese país.'), nl,
write('Por favor, dime cual es.'), nl,
write('Capital? '),
read(Ciudad),
write('Gracias.'), nl, nl,
assert(capital_of(Pais, Ciudad)),
process_a_query.
delete
, el programa borre un país de la base de datos, tal como indica el siguiente diálogo:...
País? chile.
La capital de chile es santiago
País? delete.
Qué país deseas borrar? chile.
Se borró chile.
País? chile.
No conozco la capital de ese país.
...
Esto es una pequeña ayuda que se puede proporcionar para empezar a trabjar con base de datos y archivos usando Prolog.