Manipulación de Base de Datos y Archivos con Prolog

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.

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% 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.
Revisa el programa, modifícalo, de manera que al ingresar 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.

8 comentarios:

Jorge Valverde-Rebaza dijo...

Bien mickito ta wena la informazion de prolog, sigue azi, aposhando la CC.

Jorge Valverde-Rebaza dijo...

oe man seria bueno que escribas acerca de tu SE,me han comentado ke es muy bueno y es de un area similar al que hice yo, tal ves podriamos intercambiar ideas.

MKT dijo...

tratare de hacerlo en un apartado, para hacer un intercambio, pero no es para tanto solo son ideas básicas explicadas en clase por el profe las cuales se han implementado.

Anónimo dijo...

Oe amigo, no seas pz man, dime tu, en ke diccionario existe la palabra Primeramente???, ya pz marco aurelio jajaja, acaso martita no te ha enseñado???

MKT dijo...

Hola amigo Erick, me da gusto que estes posteando mi blog, pero me gustaria que sea algo respecto al tema que se trata y no a cosas que estan de mas, alguna cosa personal me la puedes hacer a mi correo el cual ya conoces.
Y bueno la palabra "Primeramente" la puedes encontrar en este diccionario el cual supongo que si conoces no??? o sino sigue este vínculo

Jorge Valverde-Rebaza dijo...

jajaja ya pz erik,no vas a hacer roche por una palabrita, primeramente fijate que posteas en el blog del gran marco aurelio, lider en la LENGUA española, jajaja. cuidense y antes de pelearse, primeramente amense, jajaja
oe micki, ya pz, pon algo mas en tu blog, actualizalooooooo

Anónimo dijo...

buena mickitoons, justo lo que me faltaba :)

Christian Pantoja dijo...

me gustaria que resovieran la parte de eliminar.