Anda di halaman 1dari 3

Inteligencia artificial

Manipulacin de Base de Datos y Archivos con


Prolog
:- 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(espaa, madrid).
capital_of(peru, lima).
capital_of(mexico, ciudad_de_mexico).

Prolog tiene la capacidad de adquirir nuevas clusulas en tiempo de ejecucin 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 clusulas que conforman el programa en memoria hasta el momento. Ahora prueba:

?- listing(capital_of).
sto slo muestra aquellas clusulas asociadas al predicado indicado como parmetro.

Se pueden incluir ms clusulas a la base de datos mediante el predicadoassert/1:

?- assert (capital_of(hawaii, honolulu)).


Sin embargo, sto slo funciona para predicados que han sido marcados como dnamicos 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 clusula hacemos los siguiente:

?- retract (capital_of(hawaii, honolulu)).


Existen ms predicados que permiten inspeccionar el estado de la base de datos, inclusive para construir y
ejecutar dinmicamente predicados en tiempo de ejecucin. Para mayor informacin, puedes revisar la base
de datos.

Usando archivos con tell('mi_archivo') se abre al archivo 'mi_archivo' y redirige la escritura hacia l,

Docente: Arturo Daz Pulido


Inteligencia artificial

anlogo 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 pequeo programa que modifica su propia base de conocimientos.
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

start :- consult('bdc.pl'),
nl,
write('Escribe los nombres completamente en minsculas,'), nl,
write('seguidos de un punto.'), nl,
nl,
process_a_query.

process_a_query :- write('Pas? '),


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 pas 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.

Docente: Arturo Daz Pulido


Inteligencia artificial

% Si el pas 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 pas.'), nl,
write('Por favor, dime cual es.'), nl,
write('Capital? '),
read(Ciudad),
write('Gracias.'), nl, nl,
assert(capital_of(Pais, Ciudad)),
process_a_query.

TAREA:
Revisar el programa, modifcalo, de manera que al ingresar delete, el programa borre un pas de la base de
datos, tal como indica el siguiente dilogo:

...
Pas? chile.
La capital de chile es santiago

Pas? delete.
Qu pas deseas borrar? chile.
Se borr chile.

Pas? chile.
No conozco la capital de ese pas.
...

Docente: Arturo Daz Pulido

Anda mungkin juga menyukai