Conectando Prolog con Sql Server

 · 7 mins read

Conectando Prolog con Sql Server

En este post realizaremos un ejercicio de Sistemas expertos basados en probabilidad, la probabilidad Bayesiana

Conectaremos Prolog con SQLServer en la plataforma windows. Empezaremos creando la base de datos en sql server, con el nombre "hospital" y con una tabla llamada resumen

Creamos la tabla resumen con los siguientes campos.

tabla prolog

Llenamos la tabla con los siguientes datos.

insert into resumen (dolor,ppeso,vomito,enfermedad,cantidad)values('si','si','si','si',220);
insert into resumen (dolor,ppeso,vomito,enfermedad,cantidad)values('si','si','no','si',220);
insert into resumen (dolor,ppeso,vomito,enfermedad,cantidad)values('si','no','si','si',25);
insert into resumen (dolor,ppeso,vomito,enfermedad,cantidad)values('si','no','no','si',25);
insert into resumen (dolor,ppeso,vomito,enfermedad,cantidad)values('no','si','si','si',95);
insert into resumen (dolor,ppeso,vomito,enfermedad,cantidad)values('no','si','no','si',95);
insert into resumen (dolor,ppeso,vomito,enfermedad,cantidad)values('no','no','si','si',10);
insert into resumen (dolor,ppeso,vomito,enfermedad,cantidad)values('no','no','no','si',10);

insert into resumen (dolor,ppeso,vomito,enfermedad,cantidad)values('si','si','si','no',4);
insert into resumen (dolor,ppeso,vomito,enfermedad,cantidad)values('si','si','no','no',9);
insert into resumen (dolor,ppeso,vomito,enfermedad,cantidad)values('si','no','si','no',5);
insert into resumen (dolor,ppeso,vomito,enfermedad,cantidad)values('si','no','no','no',12);
insert into resumen (dolor,ppeso,vomito,enfermedad,cantidad)values('no','si','si','no',31);
insert into resumen (dolor,ppeso,vomito,enfermedad,cantidad)values('no','si','no','no',76);
insert into resumen (dolor,ppeso,vomito,enfermedad,cantidad)values('no','no','si','no',50);
insert into resumen (dolor,ppeso,vomito,enfermedad,cantidad)values('no','no','no','no',113);

datos de la tabla

Ahora crearemos un nuevo origen de Datos llamado "NuevaConexion".

Nos dirigimos a herramientas administrativas, luego a origen de datos ODBC

Post Sample Image

Agregamos uno nuevo

Post Sample Image

Seleccionamos SQL native client

Post Sample Image

Colocamos el nombre a nuestra conexion y en servidor colocamos un punto "."

Post Sample Image

Seleccionamos autentificacion de Windows

Post Sample Image

Seleccionamos la base de datos creada

Post Sample Image

Establecemos el idioma

Post Sample Image

Probamos el origen de datos y verificamos que la prueba se completo correctamente y aceptamos.

Post Sample Image

Conexión establecida.

Post Sample Image

Ahora comenzaremos con Prolog

Para este tutorial trabajaré con SwiProlog, la instalación es sencilla, puedes descargarlo desde Aquí

Comenzaremos escribiendo el siguiente codigo prolog, y el nombre de la conexión que creamos para este tutorial "NuevaConexion", en usuario lo dejamos en root y password en blanco en mi caso.

Seleccionamos la cantidad de la tabla resumen.

 conexion:- odbc_connect('NuevaConexion',_,[user('root'),password(''),alias(bd),open(once)]),
           odbc_prepare(bd,'SELECT cantidad FROM resumen where enfermedad =? and dolor=? and vomito=? and ppeso=?',
           [atom>char(2),atom>char(2),atom>char(2),atom>char(2)],
           Handle,
           [types([integer])]),
           abolish(odbc_handle/1),
           assert(odbc_handle(Handle)).



run_stmt(R,E,D,V,Pp):- odbc_handle(Handle),
              odbc_execute(Handle,[E,D,V,Pp],row(R)).


sistema:- conexion,
           writeln('Dolor:'),
           read(D),
           writeln('Vomito:'),
           read(V),
           writeln('Perdida de peso:'),
           read(Pp),
           run_stmt(R1,si,D,V,Pp),
           run_stmt(R2,no,D,V,Pp),
           Bayes is R1/(R1+R2),
           format('La probabilidad bayesiana de tener la enfermedad es ~w',[Bayes]).


 

Compilamos y ejecutamos el predicado sistema.

Post Sample Image

Ahora realizarenos el mismo ejercicio usando el modo gráfico de Prolog.

 conexion:- odbc_connect('NuevaConexion',_,[user('root'),password(''),alias(bd),open(once)]),
           odbc_prepare(bd,'SELECT cantidad from resumen where enfermedad=? and dolor=? and vomito=? and ppeso=?',
           [atom>char(2),atom>char(2),atom>char(2),atom>char(2)],
           Handle,
           [types([integer])]),
           abolish(odbc_handle/1),
           assert(odbc_handle(Handle)).



run_stmt(R,E,D,V,Pp):- odbc_handle(Handle),
              odbc_execute(Handle,[E,D,V,Pp],row(R)).


sistema:-  conexion,
	   new(V, dialog('Sistema experto probabilistico')),
	   new(P1,menu('dolor?')),
	   send_list(P1,append, [si,no]),
	   new(P2,menu('perdida de peso?')),
	   send_list(P2,append, [si,no]),
	   new(P3,menu('vomito?')),
	   send_list(P3,append, [si,no]),
	   send_list(V,append,[
		       P1,P2,P3,
		       button(aceptar,message(@prolog,
					     inferencia,
					     P1?selection,
					     P2?selection,
					     P3?selection))]),
	   send(V,open).


inferencia(D,Pp,V):- conexion,
	     run_stmt(R1,si,D,V,Pp),
             run_stmt(R2,no,D,V,Pp),
             Bayes is R1/(R1+R2),
	     new(W,dialog('Teorema de Bayes')),
	     new(E,label(l,Bayes)),
	     send(W,append,E),
	     send(W,open).

 
 

Compilamos y llamamos al predicado sistema, seleccionamos los sintomas y la probabilidad bayesiana de tener la enfermedad, con el siguiente resultado.

Post Sample Image

El codigo fuente de prolog lo puedes descargar desde Aquí