Академический Документы
Профессиональный Документы
Культура Документы
:- 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, cuidad_de_mexico).
1.- read/1 permite leer expresiones Prolog desde el teclado. Intenta lo siguiente: verifica
las respuestas que te entrega Prolog para las siguientes entradas.
hola.
'hola que tal'.
hola que tal.
hola(hermano).
Hola.
f(X) :- g(Y).
2.- Veamos cmo un programa Prolog es capaz de aquirir nuevas clusulas en tiempo de
ejecucin.
?- capital_of(hawaii, X).
?- listing.
Qu ocurre? listing muestra todas las clusulas que conforman el programa en memoria.
Ahora prueba
?- listing(capital_of).
sto slo muestra aquellas clusulas asociadas al predicado indicado como parmetro.
?- assert(capital_of(hawaii, honolulu)).
Sin embargo, sto slo funciona para predicados que han sido marcados como dnamicos
mediante el predicado dynamic/1.
Ojo, pues en Prolog dos predicados con el mismo functor (i.e. el nombre del predicado) son
distintos si tienen aridad (i.e. nombre de argumentos) distintos. Es algo similar a lo que le
llaman la firma de una funcin en Java por ejemplo. En consecuencia, a(X) y a(X,Y) son
distintos predicados (a/1 y a/2 respectivamente, segn la notacin Prolog).
Prolog internamente compila las clusulas estticas para mejorar la eficiencia. Es por esta
razn que debe hacerse la diferencia.
?- capital_of(hawaii, X).
3.- Obsevemos que assert agrega la clusula al final de la lista de predicados del mismo
nombre. Existe tambien asserta/1 y assertz/1, que agregan la clusula al comienzo y al final
respectivamente.
Agrega dos clusulas nuevas a la base de datos, y verifica luego que stas fueron
efectivamente includas. Qu ocurre si agregas una clsula con un predicado nuevo, por
ejemplo, assert(hola)? Verifica consultando por listing(hola).
?- 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.
4.- Ahora veamos algunos predicados de manejo sencillo de archivos. stos son: see/1,
seen/1, tell/1 y told/1.
5.- 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.
...
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.
...
Librerias ...
import java.sql.*;
public class BaseDatos {
// Atributos de la clase.
private String url = "jdbc:mysql://localhost/miBaseDatos";
private Connection Conexion = null;
private Statement Consulta;
private PreparedStatement ConsultaPrepare;
private ResultSet Resultados;
private int NumRegistros;
public BaseDatos(String login , String password) throws
SQLException, ClassNotFoundException {
try {
Class.forName("com.mysql.jdbc.Driver").newInstance();
Conexion = DriverManager.getConnection(url, login,
password);
Consulta = Conexion.createStatement();
} catch (InstantiationException ex) {
} catch (IllegalAccessException ex) { }
} // fin del construcor
public void Ver_Registros (String Sql) throws SQLException {
Resultados = Consulta.executeQuery(Sql);
// Imprimir Resultados ...........
System.out.println("Resultados de la Consulta /n");
while (Resultados.next()) {
System.out.println("Id = " +
Resultados.getInt("Id"));
System.out.println("Nombre = " +
Resultados.getString("Nombre"));
System.out.println("Direccion= " +
Resultados.getString("Direccion"));
System.out.println("Correo = " +
Resultados.getString("Correo"));
} // fin del while
} // fin del metodo.
public void Insertar_Registro (int Id , String Nombre ,
String Direccion , String Correo) throws
SQLException {
ConsultaPrepare = Conexion.prepareStatement("INSERT INTO
ALUMNO " +
"(ID, Nombre , Direccion ,Correo) "
+ "VALUES (?,?,?,?)");
ConsultaPrepare.setInt(1, Id);
ConsultaPrepare.setString(2, Nombre);
ConsultaPrepare.setString(3, Direccion);
ConsultaPrepare.setString(4, Correo);
NumRegistros = ConsultaPrepare.executeUpdate();
} // fin del metodo conexion
public void Cerrar_Conexion () throws SQLException {
Resultados.close();
Consulta.close();
ConsultaPrepare.close();
Conexion.close();
} // fin del metodo.
} // fin del metodo
Este paquete deja instrucciones especficas para inicializar la base de datos, permitir
conexiones de red e inicializar la base de datos cada vez que arranque el sistema en:
/usr/local/share/doc/postgresql/README.OpenBSD. Los pasos que este escrito
describe son:
# mkdir -p /var/postgresql/data
# chown -R _postgresql:_postgresql /var/postgresql
# su - _postgresql
$ initdb -D /var/postgresql/data
kern.seminfo.semmni=256
kern.seminfo.semmns=2048
kern.shminfo.shmmax=50331648
Configurar scripts de arranque y detencin del sistema para que inicien y detengan
el servidor de PostgreSQL. En /etc/rc.conf.local agregar:
pg_ctl_flags="start \
-D /var/postgresql/data -l /var/postgresql/logfile \
-o '-D /var/postgresql/data'"
En /etc/rc.local agregue:
if [ -f /var/postgresql/data/postmaster.pid ]; then
su -l _postgresql -c "/usr/local/bin/pg_ctl stop -m fast \
-D /var/postgresql/data"
rm -f /var/postgresql/data/postmaster.pid
fi
Inicialmente el servidor queda configurado con sockets Unix (solo desde la misma
mquina). Puede comprobar que est corriendo el servidor (postmaster) con:
# pgrep post
Para emplear el protocolo TCP/IP para conexiones desde algunas mquinas de su eleccin,
edite /var/postgresql/data/pg_hba.conf y agregue por ejemplo mquinas y usuarios
que puedan hacer conexiones. Tambin edite /var/postgresql/data/postgresql.conf
para que incluya lneas de configuracin como:
tcpip_socket = true
max_connections = 32
superuser_reserved_connections = 2
port = 5432
hostname_lookup = false
show_source_port = false
Si por seguridad (e.g cuando ejecuta Apache con chroot en /var/www) decide no permitir
conexiones TCP/IP y emplea una ruta para los sockets diferente a la ruta por defecto (i.e
/tmp), defina la nueva ruta (por ejemplo /var/www/tmp) en
/var/postgresql/data/postgresql.conf en la variable unix_socket_directory (si
en el archivo la lnea tiene comentario, quite el signo # del comienzo de la lnea). Antes de
reiniciar PostgreSQL asegrese de crear el directorio:
# mkdir /var/www/tmp
# chmod a+w /var/www/tmp
# chmod +t /var/www/tmp
Tambin tenga en cuenta que las diversas herramientas reciben como parmetro adicional
-h ruta. Por ejemplo si ejecuta Apache con chroot en /var/www/ puede tener configurado
su directorio para sockets en /var/www/tmp, en ese caso puede iniciar psql con la base
prueba usando:
su - _postgresql
echo "MiClave" > clave.txt
initdb --auth=md5 --pwfile=clave.txt -D/var/postgresql/data
Las claves de los diversos usuarios pueden cambiarse de forma anloga a la presentada para
postgres:
Desde PostgreSQL 8.1 se emplea un esquema de roles que unifica los conceptos de usuario
y grupo. Adems de exigir clave para cada ingreso, cada rol de PostgreSQL que crea
objetos puede modificar permisos para restringir o dar acceso a otros roles. Por ejemplo
para restringir el acceso a una tabla cuenta:
Cuando un rol crea una base de datos, queda como dueo de todas las tablas y en principio
es el nico que puede acceder a estas. Otro rol en principio no podr ni siquiera examinar
los datos de las tablas:
createdb prueba
psql prueba
Desde la interfaz psql, pueden darse comandos SQL y otros especficos de PostgreSQL (ver
Seccin 3.4, Uso de una base de datos). En particular el usuario postgres y desde
cuentas con permiso para crear usuarios, puede crear otros usuarios (globales para todas las
bases de datos manejadas por el servidor). Por ejemplo para crear un usuario normal sin
clave, desde psql ingresar:
createuser usejemplo
dropuser usejemplo
Puede ejecutarse un script SQL (crea.sql) desde la lnea de comandos a un base de datos
con
\dt
\d usuarios
\h update
Da ayuda sobre el comando {\tt update} (que permite actualizar registros de una
tabla.)
3.5. Copias de respaldo
Para sacar una copia de respaldo de todas las base de datos manejadas con PostgreSQL (y
suponiendo que el socket est en /var/www/tmp):