Sei sulla pagina 1di 62

SISTEMAS BASADOS EN EL CONOCIMIENTO I GUIA PARA LA CONSTRUCCIN DE SISTEMAS BASADOS EN EL CONOCIMIENTO A PARTIR DE UNA TABLA Y A PARTIR DE UN RBOL DE DECISIN.

Pervys Rengifo Rengifo Los procedimientos bsicos para la construccin de sistemas basados en el conocimiento, se aplicarn a unos ejemplos que ilustran claramente cmo hacer esta construccin para los casos en que el conocimiento est representado o estructurado como una tabla o como un rbol de decisin: CASO 1: EL CONOCIMIENTO EST REPRESENTADO COMO UNA TABLA DE DECISIN. EJEMPLO: DE QU ANIMAL SE TRATA? A partir de la siguiente tabla de datos construya un sistema basado en el conocimiento que permita determinar de qu animal se trata, a partir de la clase y la alimentacin del mismo. El conocimiento disponible est embebido en la siguiente tabla: ANIMAL 'LEON' 'MUSARAA' 'CABALLO' 'COCODRILO' 'CAMALEON' 'TORTUGA DE TIERRA 'AGUILA' 'GOLONDRINA' 'PERDIZ' CLASE Mamfero Mamfero Mamfero Reptil Reptil Reptil Ave Ave Ave ALIMENTACION carnivoro insectivoro herbivoro carnivoro insectivoro herbivoro carnivoro insectivoro herbivoro

Paso 1: Construya la base de conocimiento en Prolog, utilizando lgica de predicados animal('LEON'):-clase(mamifero),alimentacion(carnivoro). Quiere decir: Un animal es un tigre si es mamfero y carnvoro. animal('MUSARAA'):-clase(mamifero),alimentacion(insectivoro). animal('CABALLO'):-clase(mamifero),alimentacion(herbivoro). animal('COCODRILO'):-clase(reptil),alimentacion(carnivoro). animal('CAMALEON'):-clase(reptil),alimentacion(insectivoro). animal('TORTUGA DE TIERRA'):-clase(reptil),alimentacion(herbivoro). animal('AGUILA'):-clase(ave),alimentacion(carnivoro). animal('GOLONDRINA'):-clase(ave),alimentacion(insectivoro). animal('PERDIZ'):-clase(ave),alimentacion(herbivoro). Predicados Prolog Anlisis El len es un mamfero que se animal('LEON'):clase(mamifero),alimentacion(carnivoro). alimenta de carne o de otros animales La musaraa es un mamfero que animal('MUSARAA'):clase(mamifero),alimentacion(insectivoro). se alimenta de insectos El caballo es un mamfero que se animal('CABALLO'):Pervys Rengifo Rengifo: http://pervys-cienciaytecnologia.blogspot.com/

clase(mamifero),alimentacion(herbivoro). animal('COCODRILO'):clase(reptil),alimentacion(carnivoro). animal('CAMALEON'):clase(reptil),alimentacion(insectivoro). animal('TORTUGA DE TIERRA'):clase(reptil),alimentacion(herbivoro). animal('AGUILA'):clase(ave),alimentacion(carnivoro). animal('GOLONDRINA'):clase(ave),alimentacion(insectivoro). animal('PERDIZ'):clase(ave),alimentacion(herbivoro).

alimenta de vegetales El cocodrilo es un reptil que se alimenta de carne o de otros animales El camalen es un reptil que se alimenta de insectos Este predicado indica que no hay un reptil que se alimente con slo vegetales El guila es un ave que se alimenta de carne. La golondrina es un ave que se alimenta de insectos. La perdiz es un ave que se alimenta de vegetales.

Paso 2: Construya las preguntas en donde solicitar al usuario las caractersticas del animal que desea clasificar: pregunta1:write(' El grupo al que pertenece el animal es:'),nl,nl, write('1. Mamifero.'),nl, write('2. Reptil.'),nl, write('3. Ave.'),nl, read(N), clasificar1(N). Construya predicados para proceder de acuerdo con la respuesta a la pregunta 1: clasificar1(1):-assert(clase(mamifero)),!. clasificar1(2):-assert(clase(reptil)),!. clasificar1(3):-assert(clase(ave)),!. clasificar1(_):-pregunta1,!. pregunta2:write(' Segun tipo de alimentacion puede ser:'),nl,nl, write('1. Carnivoro.'),nl, write('2. Insectivoro.'),nl, write('3. Herbivoro.'),nl, read(N2), clasificar2(N2). Construya predicados para proceder de acuerdo con la respuesta a la pregunta 2: clasificar2(1):-assert(alimentacion(carnivoro)),!. clasificar2(2):-assert(alimentacion(insectivoro)),!. clasificar2(3):-assert(alimentacion(herbivoro)),!. clasificar2(_):-pregunta2,!.

Pervys Rengifo Rengifo: http://pervys-cienciaytecnologia.blogspot.com/

Paso 3: Defina un predicado que determine la clasificacin de acuerdo con las respuestas del usuario: clasificar:animal(M), write('El animal puede ser : '),nl, write(' '),write(M),nl,nl. Paso 4: Defina el predicado que permita ejecutar todo el programa: empezar:pregunta1, pregunta2, consultar,!. Ahora, que hacer si usted quiere proveer al usuario la posibilidad de hacer otra consulta: Paso 1: Limpie todas las acciones del predicado assert, para esto puede definir un predicado de nombre purgar limpiar:-retract(clase(_)), retract(alimentacion(_)),!. Paso 2: Defina un predicado que permita continuar si el usuario responde adecuadamente: continue('s'):-empezar,!. continue('S'):-empezar,!. continue('n'):-continue('N'). continue('N'):-write(' NOS AGRAD AYUDARTE '),nl, write('............HASTA PRONTO............'). Paso 3: Defina el predicado que pregunte al usuario si desea continuar. pregunta:-nl,nl, write('Desea continuar s/n : '), read(X), continue(X). Paso 4: redefina el predicado consultar para que responda la clasificacin y pregunte al usuario si desea continuar: clasificar:animal(M), write('El animal puede ser : '),nl, write(' '),write(M),nl,nl, limpiar, pregunta.

FINALMENTE EL PROGRAMA QUEDARA ASI:

Pervys Rengifo Rengifo: http://pervys-cienciaytecnologia.blogspot.com/

animal('LEON'):-clase(mamifero),alimentacion(carnivoro). animal('MUSARAA'):-clase(mamifero),alimentacion(insectivoro). animal('CABALLO'):-clase(mamifero),alimentacion(herbivoro). animal('COCODRILO'):-clase(reptil),alimentacion(carnivoro). animal('CAMALEON'):-clase(reptil),alimentacion(insectivoro). animal('TORTUGA DE TIERRA'):-clase(reptil),alimentacion(herbivoro). animal('AGUILA'):-clase(ave),alimentacion(carnivoro). animal('GOLONDRINA'):-clase(ave),alimentacion(insectivoro). animal('PERDIZ'):-clase(ave),alimentacion(herbivoro). empezar:pregunta1, pregunta2, clasificar,!. pregunta1:write(' La clase a la que pertenece el animal es:'),nl,nl, write('1. Mamifero.'),nl, write('2. Reptil.'),nl, write('3. Ave.'),nl, read(N), clasificar1(N). clasificar1(1):-assert(clase(mamifero)),!. clasificar1(2):-assert(clase(reptil)),!. clasificar1(3):-assert(clase(ave)),!. clasificar1(_):-pregunta1,!. pregunta2:write(' Segun tipo de alimentacion puede ser:'),nl,nl, write('1. Carnivoro.'),nl, write('2. Insectivoro.'),nl, write('3. Herbivoro.'),nl, read(N2), clasificar2(N2). clasificar2(1):-assert(alimentacion(carnivoro)),!. clasificar2(2):-assert(alimentacion(insectivoro)),!. clasificar2(3):-assert(alimentacion(herbivoro)),!. clasificar2(_):-pregunta2,!. limpiar:-retract(clase(_)), retract(alimentacion(_)),!. continue('s'):-empezar,!. continue('S'):-empezar,!. continue('n'):-continue('N').

Pervys Rengifo Rengifo: http://pervys-cienciaytecnologia.blogspot.com/

continue('N'):-write(' NOS AGRAD AYUDARTE write('............HASTA PRONTO............'). clasificar:animal(M), write('El animal puede ser : '),nl, write(' '),write(M),nl,nl, limpiar, pregunta. pregunta:-nl,nl, write('Desea continuar s/n : '), read(X), continue(X). 1.

'),nl,

El programa empieza cuando en la consola le digitamos empezar. El smbolo :- se lee si y corresponde a una implicacin de derecha a izquierda. Empieza a cargar las preguntas 1 y 2:

empezar:pregunta1, pregunta2, clasificar,!. 2. El programa muestra al usuario la pregunta y las diferentes opciones a escoger. En este caso, escribe en pantalla si el animal pertenece al grupo de los mamferos, reptiles o aves. En cualquier caso, el nmero que se digite ser ledo y guardado en una variable N.

pregunta1:write(' El grupo al que pertenece el animal es:'),nl,nl, write('1. Mamifero.'),nl, write('2. Reptil.'),nl, write('3. Ave.'),nl, read(N), clasificar1(N).

Pervys Rengifo Rengifo: http://pervys-cienciaytecnologia.blogspot.com/

3. El programa al leer el nmero digitado por el usuario lee si es un 1 guarda la clase mamfero, si es 2 guarda la clase reptil, si es 3 guarda la clase ave y si digita cualquier otro nmero presenta de nuevo la pregunta 1: clasificar1(1):-assert(clase(mamifero)),!. clasificar1(2):-assert(clase(reptil)),!. clasificar1(3):-assert(clase(ave)),!. clasificar1(_):-pregunta1,!. Se pueden incluir ms clusulas a la base de datos mediante el predicado assert. Es decir, que para cada nmero que ingrese el usuario se le asigna una clase. 4. El programa a continuacin muestra al usuario las diferentes opciones a escoger con la pregunta 2. En este caso, escribe en pantalla si el animal segn el tipo de alimentacin puede ser carnvoro, insectvoro o herbvoro. Igual al caso anterior, leer el nmero digitado y lo guardar en la variable N2.

pregunta2:write(' Segun tipo de alimentacion puede ser:'),nl,nl, write('1. Carnivoro.'),nl, write('2. Insectivoro.'),nl, write('3. Herbivoro.'),nl, read(N2), clasificar2(N2).

Pervys Rengifo Rengifo: http://pervys-cienciaytecnologia.blogspot.com/

6. El programa al leer el nmero digitado por el usuario lee si es un 1 guarda el tipo carnvoro, si es 2 guarda el tipo insectvoro, si es 3 guarda el tipo herbvoro y si digita cualquier otro numero presenta de nuevo la pregunta 2 clasificar2(1):-assert(alimentacion(carnivoro)),!. clasificar2(2):-assert(alimentacion(insectivoro)),!. clasificar2(3):-assert(alimentacion(herbivoro)),!. clasificar2(_):-pregunta2,!. 7. El programa empieza a hacer bsquedas de que animal cumple con las caractersticas dadas por el usuario segn la clase y la alimentacin y hace una eliminacin de clusulas de predicados. limpiar:-retract(clase(_)), retract(alimentacion(_)),!. 8. Encuentra el animal y lo guarda en la variable M y luego lo muestra al usuario el animal encontrado.

clasificar:animal(M), write('El animal puede ser : '),nl, write(' '),write(M),nl,nl, limpiar, pregunta.

Pervys Rengifo Rengifo: http://pervys-cienciaytecnologia.blogspot.com/

9.

El programa pregunta si desea continuar. Si el usuario le dice que si se devuelve a hacer la pregunta No. 1 y as sucesivamente hasta que a la pregunta Desea Continuar se le d que no.

pregunta:-nl,nl, write('Desea continuar s/n : '), read(X), continue(X). continue('s'):- continue('S'). continue('S'):-empezar,!. continue('n'):-continue('N'). continue('N'):-write(' NOS AGRAD AYUDARTE'),nl, write('............HASTA PRONTO............'). Funciones desconocida: Aadiendo clusulas Para insertar clusulas de un predicado dinmico existe una familia de predicados ISO-standard, la familia assert, consistente en los siguientes predicados: asserta/ Inserta una nueva clusula como si se hubiera escrito al 1 principio del programa. Pervys Rengifo Rengifo: http://pervys-cienciaytecnologia.blogspot.com/

assertz/ Inserta una nueva clusula como si se hubiera escrito al 1 final del programa. assert/1 Idntico a asserta/1. Eliminando clusulas Anlogamente, es posible eliminar clusulas de predicados dinmicos mediante la familia de predicados retract consistente en: Elimina nicamente la primera clusula que unifique con el argumento. Siempre se elimina por el principio del programa. rectractall/ Elimina todas las clusulas que unifiquen con el 1 argumento. retract/1 AADIENDO INTERFACE GRFICA CON WINPROLOG 4.2 Win-Prolog, permite la creacin de interfaces grfica de usuario, tanto desde el cdigo como a travs de una utilidad ayuda a construir de forma ms sencilla estas interfaces. A esta utilidad se puede acceder a travs de la siguiente ruta:

Con lo cual aparecer una ventana como la siguiente:

Pervys Rengifo Rengifo: http://pervys-cienciaytecnologia.blogspot.com/

En la ventana de controles, se pueden seleccionar el tipo de control que se desea crear y luego se ubica control en la ventana de la derecha, dimensionndolo con el ratn

Despus de esto se obtendra una ventana con la siguiente apariencia

Pervys Rengifo Rengifo: http://pervys-cienciaytecnologia.blogspot.com/

Al hacer doble clic en el control (en este caso un botn), se abre una pantalla de configuracin bsica (en este caso se le va a cambiar la leyenda que aparece en el control, por Prueba 1.

Cuando ya se tenga listo el paquete de controles, se hace clic en export, obteniendo un texto con un conjunto de instrucciones que se pegara al cdigo de Prolog que se est implementando y se adaptara segn las necesidades que se tengan.

Pervys Rengifo Rengifo: http://pervys-cienciaytecnologia.blogspot.com/

Si desea un listado de los predicados usados en este tutorial puede consultar el apndice 1, al final de este documento. A continuacin se muestra un ejemplo del programa anterior utilizando una interface grfica de usuario: animal('LEON'):-clase(mamifero), alimentacion(carnivoro),!. animal('MUSARAA'):-clase(mamifero), alimentacion(insectivoro),!. animal('CABALLO'):-clase(mamifero), alimentacion(herbivoro),!. animal('COCODRILO'):-clase(reptil), alimentacion(carnivoro),!. animal('CAMALEN'):-clase(reptil), alimentacion(insectivoro),!. animal('NO EXISTE EN LA BASE DE CONOCIMIENTO'):-clase(reptil), alimentacion(herbivoro),!. animal('AGUILA'):-clase(ave), alimentacion(carnivoro),!. animal('GOLONDRINA'):-clase(ave), alimentacion(insectivoro),!. animal('PERDIZ'):-clase(ave), alimentacion(herbivoro),!. inicio:-retractall(clase(_)), retractall(alimentacion(_)), Pervys Rengifo Rengifo: http://pervys-cienciaytecnologia.blogspot.com/

bienvenida, empezar. empezar:-pregunta1, pregunta2 pregunta2, consultar,!. % empezar ejecuta las funciones de pregunta1, % y hacer la consulta.

pregunta1:-combo_select(`El grupo al que pertenece el animal es:`, [`Mamfero`,`Reptil`,`Ave`], S ),grupo(S),!. % y se llama una funcion pregunta con parametro N, y segun el numero ingresado, se ejecuta alguna de las siguientes grupo(`Mamfero`):-assert(clase(mamifero)),!. % si N es 1, se ingresa a la base del conocimiento, el predicado clase(mamifero) grupo(`Reptil`):-assert(clase(reptil)),!. % igual para el 2, que ingresa clase(reptil), grupo(`Ave`):-assert(clase(ave)),!. % y para 3. grupo(_):-pregunta1,!. pregunta2:-combo_select(`Segun tipo de alimentacion puede ser:`, [`Carnvoro`,`Insectvoro`,`Herbivoro`], T ),tipo(T),!. tipo(`Carnvoro`):-assert(alimentacion(carnivoro)),!. % si la opcion fue la 1, se ingresa a la base de conocimiento alimentacion(carnivoro) tipo(`Insectvoro`):-assert(alimentacion(insectivoro)),!. % con el 2, alimentacion(carnivoro) tipo(`Herbivoro`):-assert(alimentacion(herbivoro)),!. % y con el 3 se ingresa alimentacion(herbivoro) tipo(_):-pregunta2,!. limpiar_base:-retract(clase(_)), ingresado por las opciones del usuario, retract(alimentacion(_)),!. continue('yes'):-empezar,!. otra consulta o se sale. continue('no'):-despedida. consultar:- animal(M), atom_string( M,Animal), despliega_repuesta(Animal), continuar. despliega_repuesta(Animal) :_S1 = [dlg_ownedbydesktop,ws_sysmenu,ws_caption], _S2 = [ws_child,ws_visible,ss_center], _S3 = [ws_child,ws_visible,ws_tabstop,bs_pushbutton], wdcreate( respuesta, `user_dialog`, 235, 43, 402, 160, _S1 ), % limpiar_base limpia la base de lo % para ejecutar una nueva consulta % dependiendo del parametro, se sigue con

Pervys Rengifo Rengifo: http://pervys-cienciaytecnologia.blogspot.com/

wccreate( (respuesta,10000), static, `EL ANIMAL PODRA SER`, 20, 10, 370, 20, _S2 ), wccreate( (respuesta,10001), static, Animal, 120, 40, 170, 30, _S2 ), wccreate( (respuesta,1000), button, `ACEPTAR`, 130, 80, 150, 30, _S3 ), wfcreate( foo1, arial, 18, 2 ), wfont( (respuesta,10000), foo1 ), wfont( (respuesta,10001), foo1 ), window_handler( respuesta, bienvenida_handler ), call_dialog( respuesta, R ), wfclose(foo1),wclose(respuesta). continuar:-message_box( yesno, 'Desea Continuar', A ), continue(A). despedida:- _S1 = [ws_sysmenu,ws_popup,ws_caption,dlg_ownedbyprolog], _S2 = [ws_child,ws_visible,ss_center], _S3 = [ws_child,ws_visible,ws_tabstop,bs_pushbutton], wdcreate( despedida, `user_dialog`, 235, 43, 533, 358, _S1 ), wccreate( (despedida,10000), static, `Hasta pronto`, 146, 40, 240, 20, _S2 ), wccreate( (despedida,10001), static, `Fue un placer Ayudarte`, 146, 60, 240, 20, _S2 ), wccreate( (despedida,10002), static, `Sistemas Basados en el Conocimiento I`, 117, 90, 300, 20, _S2 ), wccreate( (despedida,10003), static, `Facultad de Matemticas e Ingenieras`, 117, 110, 300, 20, _S2 ), wccreate( (despedida,10004), static, `FUNDACIN UNIVERSITARIA KONRAD LORENZ-FUKL (http://www.fukl.edu)`, 16, 130, 500, 60, _S2 ), wccreate( (despedida,1000), button, `OK`, 226, 190, 80, 20, _S3 ), wcreate((despedida,2),grafix,``,0, 210, 533, 96,16'50000000), wfcreate( foo, arial, 18, 0 ), wfont( (despedida,10000), foo ), wfont( (despedida,10001), foo ), wfont( (despedida,10002), foo ), wfont( (despedida,10003), foo ), wfont( (despedida,10004), foo ), wfont( (despedida,1000), foo ), window_handler( despedida, bienvenida_handler ), call_dialog( despedida, R ), wfclose(foo),gfx_bitmap_close(fukl),gfx_bitmap_close(fukl1),wclose(despedida ). bienvenida :- _S1 = [ws_sysmenu,ws_popup,ws_caption,dlg_ownedbyprolog], _S2 = [ws_child,ws_visible,ss_center], _S3 = [ws_child,ws_visible,ss_left], _S4 = [ws_child,ws_visible,ws_tabstop,bs_pushbutton],

Pervys Rengifo Rengifo: http://pervys-cienciaytecnologia.blogspot.com/

wdcreate( bienvenida, `user_dialog`, 235, 43, 532, 325, _S1 ), wccreate( (bienvenida,10000), static, `FUNDACIN UNIVERSITARIA KONRAD LORENZ-FUKL (http://www.fukl.edu)`, 70, 10, 390, 20, _S2 ), wccreate( (bienvenida,10001), static, `FACULTAD DE MATEMTICAS E INGENIERAS`, 110, 30, 320, 20, _S2 ), wccreate( (bienvenida,10002), static, `SISTEMAS BASADOS EN EL CONOCIMIENTO I`, 110, 50, 320, 20, _S2 ), wccreate( (bienvenida,10003), static, `BIENVENIDOS AL PROGRAMA "ANIMALES"`, 110, 70, 320, 20, _S2 ), wccreate( (bienvenida,10004), static, `EL CUAL, CON UN EJEMPLO SENCILLO, ILUSTRA EL PROCESO`, 60, 90, 420, 20, _S2 ), wccreate( (bienvenida,10005), static, `DE CONSTRUCCIN DE UN SISTEMA BASADO EN EL CONOCIMIENTO`, 60, 110, 420, 20, _S2 ), wccreate( (bienvenida,10006), static, `SE TRATA DE DETERMINAR DE QUE ANIMAL SE TRATA, A PARTIR DE`, 60, 130, 420, 20, _S3 ), wccreate( (bienvenida,10007), static, `CIERTAS CARACTERSTICAS DEL MISMO`, 60, 150, 420, 20, _S2 ), wccreate( (bienvenida,1000), button, `CONTINUAR`, 210, 180, 130, 30, _S4 ), wcreate((bienvenida,2),grafix,``,0, 210, 533, 96,16'50000000), window_handler( bienvenida, bienvenida_handler ), gfx_bitmap_load(fukl,'fukl.bmp'), gfx_bitmap_load(fukl1,'fukl1.bmp'), call_dialog( bienvenida, R ), wclose(bienvenida). bienvenida_handler( (Window,2), msg_paint, _, _ ) :- gfx_paint( (Window,2) ), gfx(bitmap(0,0, 533, 96,0,0,fukl1)), gfx_end( (Window,2)). bienvenida_handler( (Window,1000), msg_button, _, cancel ). combo_select( Pregunta,Items, Selected ) :-_S1 = [ws_sysmenu,ws_popup,ws_caption,dlg_ownedbyprolog], _S2 = [ws_child,ws_visible,ws_tabstop,cbs_dropdown], _S3 = [ws_child,ws_visible,ss_left], _S4 = [ws_child,ws_visible,ws_tabstop,bs_pushbutton], _S5 = [ws_child,ws_visible,ws_border], wdcreate( combo, `user_dialog`, 272, 150, 390, 350, _S1 ), wccreate( (combo,500), combobox, `Combo1`, 100, 60, 170, 150, _S2 ), wccreate( (combo,3), static, Pregunta, 50, 20, 280, 20, _S3 ), wccreate( (combo,1), button, `OK`, 140, 140, 100, 30, _S4 ), wcreate((combo,4),static,`iconbds`,10,10,70,54,16'50000003 ),

Pervys Rengifo Rengifo: http://pervys-cienciaytecnologia.blogspot.com/

wcreate((combo,2),grafix,``,25, 200, 343, 90,16'50000000), fcreate( combo, [], -2, 0, 0 ), wfcreate( foo, arial, 18, 0 ), wfont( (combo,3), foo ), wfont( (combo,500), foo ), fill_combo( (combo,500), Items ), window_handler( combo, combo_handler ), call_dialog( combo, R ), (R=cancel->Selected=R; (P is R+1,enesimo(Selected,P,Items))), fclose( combo ),wclose(combo),!. combo_handler( (Window,2), msg_paint, _, _ ) :gfx_paint( (Window,2) ), gfx(bitmap(0,0, 343, 90,0,0,fukl)), %tamao de la imagen 343x90, iniciada en 0,0 gfx_end( (Window,2)). % cuando ocurra un mensaje de cierre retorna "cancel" combo_handler( _, msg_close, _, cancel ). % cuando se presiona el boton "OK" retorna la seleccion combo_handler( (Window,1), msg_button, _, Result ) :get_selected_item( (Window,500), Result ). % llena el combobox con la lista de items, preseleccionando el primer item fill_combo( Window, Items ) :-sndmsg( Window, cb_resetcontent, 0, 0, _ ), forall( member( Item, Items ),sndmsg( Window, cb_addstring, 0, Item, _ )), sndmsg( Window, cb_setcursel, 0, 0, _ ). % Se obtiene la posicin-1 del tem seleccionado get_selected_item( Window, R ) :- sndmsg( Window, cb_getcursel, 0, 0, R ). %obtiene el elemento ensimo de una lista enesimo(X,1,[X|_]). enesimo(X,N,[_|L]):-R is N-1, enesimo(X,R,L). *****************************************************************

Para correr este programa debe descargar el archivo comprimido en la siguiente direccin: http://in.solit.us/archives/download/152660

Pervys Rengifo Rengifo: http://pervys-cienciaytecnologia.blogspot.com/

Lo descomprime en una carpeta y luego lo abre con winprolog(se utiliz la versin 4.2). Estos cuidados se requieren debido a los archivos de imgenes que se cargan al programa: fukl.bmp y fukl1.bmp, los cuales deben estar en la carpeta local( aunque si se quiere se puede cambiar esta ruta y colocar la ruta en donde se encuentren estos archivos o eliminar el cdigo que hace el llamado a estas imgenes), es decir en la carpeta en donde se cargue el archivo SistemaExpertoFUKL.pl.

Despus de abrir este abrir este archivo, proceda a complarlo:

Corra el programa escribiendo en consola: |?:- inicio. Con lo que aparecer la pantalla de bienvenida. Pervys Rengifo Rengifo: http://pervys-cienciaytecnologia.blogspot.com/

Al darle continuar, aparecer la siguiente ventana:

Se escoge la eleccin que se desee, para este caso se escoger reptil:

Pervys Rengifo Rengifo: http://pervys-cienciaytecnologia.blogspot.com/

Luego al hacer clic en OK, aparecer la ventana de la siguiente pregunta, en la cual se escogi la opcin herbvoro:

Con estas respuestas, el programa produce el siguiente resultado:

Pervys Rengifo Rengifo: http://pervys-cienciaytecnologia.blogspot.com/

Al hacer clic en aceptar, el programa preguntar si se desea continuar:

Si se hace clic en s, el programa volver a presentar las dos preguntas, si le da clic en no, el programa se despedir y saldr al darle ok.

Pervys Rengifo Rengifo: http://pervys-cienciaytecnologia.blogspot.com/

2. EJEMPLO: RECOMENDACIN DE LENTES DE CONTACTO Suponga que se conocen datos sobre el tipo de lentes de contacto recomendadas en funcin de ciertos variables: edad (3 valores), prescripcin (2 valores), existencia de astigmatismo (2 valores) y tasa de produccin de lgrimas (2 valores). La tabla que recoge la informacin disponible es la siguiente:
EDAD_DEL_PACIE NTE JOVEN JOVEN JOVEN JOVEN JOVEN JOVEN JOVEN JOVEN PRE_PRESBIOPIC O1 PRE_PRESBIOPICO PRE_PRESBIOPICO PRE_PRESBIOPICO PRE_PRESBIOPICO PRE_PRESBIOPICO PRESCRIPCION MIOPIA MIOPIA MIOPIA MIOPIA HIPERMETROPI A HIPERMETROPI A HIPERMETROPI A HIPERMETROPI A MIOPIA MIOPIA MIOPIA MIOPIA HIPERMETROPI A HIPERMETROPI A ASTIGMATISM TASA_DE_PRODUCCION_LAG O RIMAS SI REDUCIDA SI NO NO SI SI NO NO SI SI NO NO SI SI NORMAL REDUCIDA NORMAL REDUCIDA NORMAL REDUCIDA NORMAL REDUCIDA NORMAL REDUCIDA NORMAL REDUCIDA NORMAL LENTE_RECOMENDADO NO_LENTE_CONTACTO LENTE_CONTACTO_SUA VE NO_LENTE_CONTACTO LENTE_CONTACTO_DU RO NO_LENTE_CONTACTO LENTE_CONTACTO_SUA VE NO_LENTE_CONTACTO LENTE_CONTACTO_DU RO NO_LENTE_CONTACTO LENTE_CONTACTO_SUA VE NO_LENTE_CONTACTO LENTE_CONTACTO_DU RO NO_LENTE_CONTACTO LENTE_CONTACTO_SUA VE

PRESBIOPIA que significa dificultad para enfocar objetos que estn cerca y es comn en los ancianos.Alteracin de la visin asociada a la vejez. En este trastorno existe una mayor rigidez del cristalino que produce dificultad para ver los objetos cercanos.

Pervys Rengifo Rengifo: http://pervys-cienciaytecnologia.blogspot.com/

PRE_PRESBIOPICO PRE_PRESBIOPICO PRESBIOPICO PRESBIOPICO PRESBIOPICO PRESBIOPICO PRESBIOPICO PRESBIOPICO PRESBIOPICO PRESBIOPICO

HIPERMETROPI A HIPERMETROPI A MIOPIA MIOPIA MIOPIA MIOPIA HIPERMETROPI A HIPERMETROPI A HIPERMETROPI A HIPERMETROPI A

NO NO SI SI NO NO SI SI NO NO

REDUCIDA NORMAL REDUCIDA NORMAL REDUCIDA NORMAL REDUCIDA NORMAL REDUCIDA NORMAL

NO_LENTE_CONTACTO NO_LENTE_CONTACTO NO_LENTE_CONTACTO NO_LENTE_CONTACTO NO_LENTE_CONTACTO LENTE_CONTACTO_DU RO NO_LENTE_CONTACTO LENTE_CONTACTO_SUA VE NO_LENTE_CONTACTO NO_LENTE_CONTACTO

El objetivo es generar un modelo que se ajuste a los ejemplos de entrenamiento y posteriormente usar el modelo para clasificar un ejemplo nuevo. Si se programa directamente la tabla anterior en Win-Prolog, se obtiene el siguiente cdigo:

lente_recomendado('No formular Lente de Contacto'):tasa_de_produccion_de_lagrimas(reducida). lente_recomendado('Lente de Contacto Suave'):-edad_del_paciemte(joven), astigmatismo(si), tasa_de_produccion_de_lagrimas(normal). lente_recomendado('Lente de Contacto Suave'):edad_del_paciemte(pre_presbyopic), astigmatismo(si), tasa_de_produccion_de_lagrimas(normal). lente_recomendado('No formular Lente de Contacto'):edad_del_paciemte(presbyopic), prescripcion(miopia), astigmatismo(si), tasa_de_produccion_de_lagrimas(normal). lente_recomendado('Lente de Contacto Suave'):edad_del_paciemte(presbyopic), prescripcion(hipermetropia), astigmatismo(si), tasa_de_produccion_de_lagrimas(normal). lente_recomendado('Lente de Contacto Suave'):-prescripcion(miopia), astigmatismo(no), tasa_de_produccion_de_lagrimas(normal). lente_recomendado('Lente de Contacto Duro'):-edad_del_paciemte(joven), prescripcion(hipermetropia), astigmatismo(no), tasa_de_produccion_de_lagrimas(normal). lente_recomendado('No formular Lente de Contacto'):edad_del_paciemte(pre_presbyopic), prescripcion(hipermetropia), astigmatismo(no), tasa_de_produccion_de_lagrimas(normal). lente_recomendado('No formular Lente de Contacto'):edad_del_paciemte(presbyopic), prescripcion(hipermetropia), astigmatismo(no), tasa_de_produccion_de_lagrimas(normal). inicio:-write('Formulacion de lentes de contacto'),nl,nl, pregunta0, pregunta1, pregunta2, pregunta3, conclusion, !. pregunta0:-write('Seleccione las caracteristicas del paciente'),nl,write('Tasa de produccion de Lagrimas'),nl,write(' 1. Normal.'),nl,write(' 2. Reducida.'),nl, read(N), respuesta0(N). respuesta0(1):- assert(tasa_de_produccion_de_lagrimas(normal)),!. respuesta0(2):- assert(tasa_de_produccion_de_lagrimas(reducida)),!. respuesta0(_):- write('Intente de nuevo'), nl, pregunta0. Pervys Rengifo Rengifo: http://pervys-cienciaytecnologia.blogspot.com/

pregunta1:-write('Tiene astigmatismo?'),nl,write(' 1. Si.'),nl,write(' 2. No.'),nl, read(N), respuesta1(N). respuesta1(1):-assert(astigmatismo(si)), !. respuesta1(2):-assert(astigmatismo(no)), !. respuesta1(_):-write('Intente de nuevo'), nl, pregunta1,!. pregunta2:-write('Seleccione la prescripcion del paciente'), nl, write(' 1. Miopia.'), nl, write(' 2. Hipermetropia.'), nl, read(N), respuesta2(N). respuesta2(1):-assert(prescripcion(miopia)),!. respuesta2(2):-assert(prescripcion(hipermetropia)),!. respuesta2(_):-write('Intente de nuevo'), nl, pregunta2,!. pregunta3:-write('Edad del paciente'), nl, write(' 1. Joven.'), nl,write(' 2. Presbipico.'), nl, write(' 3. Pre - Presbipico.'), nl, read(N), respuesta3(N). respuesta3(1):-assert(edad_del_paciente(joven)),!. respuesta3(2):-assert(edad_del_paciente(presbiopico)),!. respuesta3(3):-assert(edad_del_paciente(pre_presbiopico)),!. respuesta3(_):-write('Intente de nuevo'), nl, pregunta3,!. conclusion:-lente_recomendado(Lente), write('Lo recomendado es: '), write(Lente),nl, retract(edad_del_paciente(_)), retract(prescripcion(_)), retract(tasa_de_produccion_de_lagrimas(_)), retract(astigmatismo(_)), pregunta4. pregunta4:-nl,nl, write('Desea continuar s/n : '), read(X), continuar(X). continuar('s'):-inicio,!. continuar('S'):-inicio,!. continuar('n'):-write('Hasta Pronto'),nl,nl,!. continuar('N'):-write('Hasta Pronto'),nl,nl,!.

Pervys Rengifo Rengifo: http://pervys-cienciaytecnologia.blogspot.com/

Sin embargo, este programa no explota las regularidades presentes en los datos. Con este propsito se utilizan tcnicas de minera de datos que buscan extraer patrones o asociaciones relevantes que permitan hacer representaciones simplificadas o muy sintticas del conocimiento embebido en la informacin. Para este caso se utilizar el aprendizaje de rboles de decision para inducir una representacin ms simplificada del problema. Como apoyo computacional para esta tarea se utiliz el applet Desicin Tree Learning 2 Este applet, tiene la siguiente apariencia:

Al hacer clic en start applet, aparece la siguiente pantalla:

http://www.c2i.ntu.edu.sg/Courses/AI/CIspace/Version4/dTree/index-2.html

Pervys Rengifo Rengifo: http://pervys-cienciaytecnologia.blogspot.com/

Luego se va a edit-View Edit Text Representation como se muestra en la siguiente figura

Pervys Rengifo Rengifo: http://pervys-cienciaytecnologia.blogspot.com/

Resultando la siguiente ventana

Los datos de la tabla se preparan siguiendo el siguiente formato:


T:;EDAD_DEL_PACIENTE;PRESCRIPCION;ASTIGMATISMO;TASA_DE_PRODUCCION_LAGRIMAS;LENTE_RECOMEN DADO A:;JOVEN;MIOPIA;SI;REDUCIDA;NO_LENTE_COTACTO A:;JOVEN;MIOPIA;SI;NORMAL;LENTE_CONTACTO_SUAVE A:;JOVEN;MIOPIA;NO;REDUCIDA;NO_LENTE_COTACTO A:;JOVEN;MIOPIA;NO;NORMAL;LENTE_CONTACTO_DURO A:;JOVEN;HIPERMETROPIA;SI;REDUCIDA;NO_LENTE_COTACTO A:;JOVEN;HIPERMETROPIA;SI;NORMAL;LENTE_CONTACTO_SUAVE A:;JOVEN;HIPERMETROPIA;NO;REDUCIDA;NO_LENTE_COTACTO A:;JOVEN;HIPERMETROPIA;NO;NORMAL;LENTE_CONTACTO_DURO A:;PRE_PRESBYOPIC;MIOPIA;SI;REDUCIDA;NO_LENTE_COTACTO A:;PRE_PRESBYOPIC;MIOPIA;SI;NORMAL;LENTE_CONTACTO_SUAVE A:;PRE_PRESBYOPIC;MIOPIA;NO;REDUCIDA;NO_LENTE_COTACTO A:;PRE_PRESBYOPIC;MIOPIA;NO;NORMAL;LENTE_CONTACTO_DURO A:;PRE_PRESBYOPIC;HIPERMETROPIA;SI;REDUCIDA;NO_LENTE_COTACTO A:;PRE_PRESBYOPIC;HIPERMETROPIA;SI;NORMAL;LENTE_CONTACTO_SUAVE A:;PRE_PRESBYOPIC;HIPERMETROPIA;NO;REDUCIDA;NO_LENTE_COTACTO A:;PRE_PRESBYOPIC;HIPERMETROPIA;NO;NORMAL;NO_LENTE_COTACTO A:;PRESBYOPIC;MIOPIA;SI;REDUCIDA;NO_LENTE_COTACTO A:;PRESBYOPIC;MIOPIA;SI;NORMAL;NO_LENTE_COTACTO A:;PRESBYOPIC;MIOPIA;NO;REDUCIDA;NO_LENTE_COTACTO A:;PRESBYOPIC;MIOPIA;NO;NORMAL;LENTE_CONTACTO_DURO A:;PRESBYOPIC;HIPERMETROPIA;SI;REDUCIDA;NO_LENTE_COTACTO A:;PRESBYOPIC;HIPERMETROPIA;SI;NORMAL;LENTE_CONTACTO_SUAVE A:;PRESBYOPIC;HIPERMETROPIA;NO;REDUCIDA;NO_LENTE_COTACTO A:;PRESBYOPIC;HIPERMETROPIA;NO;NORMAL;NO_LENTE_COTACTO Donde T indica los nombres de las variables, A indica los patrones de entrenamiento y B(aunque no aparece en este ejemplo) indica los patrones de validacin.

Pervys Rengifo Rengifo: http://pervys-cienciaytecnologia.blogspot.com/

Los datos en el formato anterior se pegan en la ventana anterior, con lo cual se obtiene la siguiente apariencia:

Al presionar Update, se obtiene una pantalla como la siguiente:

Pervys Rengifo Rengifo: http://pervys-cienciaytecnologia.blogspot.com/

A continuacin se hace clic en la pestaa solve, como se muestra en la siguiente figura

Pervys Rengifo Rengifo: http://pervys-cienciaytecnologia.blogspot.com/

Luego se elige el criterio para determinar el mejor atributo. En este caso se eligi Ganancia de Informacin(Information Gain)

Pervys Rengifo Rengifo: http://pervys-cienciaytecnologia.blogspot.com/

A continuacin se hace clic en el icono Auto Create, para que genere el rbol automticamente con el criterio de Ganancia de Informacin

'

Con lo anterior se genera un rbol que tendra la siguiente apariencia:

Pervys Rengifo Rengifo: http://pervys-cienciaytecnologia.blogspot.com/

Si se accede a la ruta View + Autoscale, la grfica del rbol se autoescala para que quepa en la ventana de visualizacin.

Pervys Rengifo Rengifo: http://pervys-cienciaytecnologia.blogspot.com/

En View-Font Size se selecciona un tamao de letra menor para un mayor ajuste de la grfica del rbol, la cual se reorganiza mediante el tradicional arrastre y suelte con el ratn. Finalmente se obtiene el siguiente rbol de decisin.

Cada hoja del rbol(las que se presentan con recuadro verde) representa una regla de decisin sintetizada a partir de los datos. Como se puede observar que los 24 patrones originales, se pueden expresar mediante 9 reglas, lo cual revela una compresin de 24:9= 2.7. Las reglas aprendidas fueron: 1. Si la TASA DE PRODUCCIN DE LGRIMAS es REDUCIDA, entonces la recomendacin es NO USAR LENTES DE CONTACTO. 2. Si la TASA DE PRODUCCIN DE LGRIMAS es NORMAL y SI presenta astigmatismo y la edad del paciente es JOVEN, entonces la recomendacin es USAR LENTES DE CONTACTO SUAVES. 3. Si la TASA DE PRODUCCIN DE LGRIMAS es NORMAL y SI presenta astigmatismo y la edad del paciente es PRE_PRESBYOPIC, entonces la recomendacin es USAR LENTES DE CONTACTO SUAVES. 4. Si la TASA DE PRODUCCIN DE LGRIMAS es NORMAL y SI presenta astigmatismo y la edad del paciente es PRESBYOPIC, y la

Pervys Rengifo Rengifo: http://pervys-cienciaytecnologia.blogspot.com/

prescripcin es MIOPIA, entonces la recomendacin es NO USAR LENTES DE CONTACTO. 5. Si la TASA DE PRODUCCIN DE LGRIMAS es NORMAL y SI presenta astigmatismo y la edad del paciente es PRESBYOPIC, y la prescripcin es HIPERMETROPA, entonces la recomendacin es USAR LENTES DE CONTACTO SUAVES. 6. Si la TASA DE PRODUCCIN DE LGRIMAS es NORMAL y NO presenta astigmatismo y la prescripcin es MIOPIA, entonces la recomendacin es USAR LENTES DE CONTACTO DUROS. 7. Si la TASA DE PRODUCCIN DE LGRIMAS es NORMAL y NO presenta astigmatismo y la prescripcin es HIPERMETROPA, y la edad del paciente es JOVEN, entonces la recomendacin es USAR LENTES DE CONTACTO DUROS. 8. Si la TASA DE PRODUCCIN DE LGRIMAS es NORMAL y NO presenta astigmatismo y la prescripcin es HIPERMETROPA, y la edad del paciente es PRE_PRESBYOPIC, entonces la recomendacin es NO USAR LENTES DE CONTACTO. 9. Si la TASA DE PRODUCCIN DE LGRIMAS es NORMAL y NO presenta astigmatismo y la prescripcin es HIPERMETROPA, y la edad del paciente es PRESBYOPIC, entonces la recomendacin es NO USAR LENTES DE CONTACTO. Una vez obtenido el rbol, se definen funciones para cada nodo del rbol. Para este ejemplo se decidi la convencin ilustrada en la siguiente grfica, en la cual se observa que el proceso 0, indaga por la tasa de produccin de lgrimas; el proceso 1b, por el astigmatismo; el proceso 2ba, por la edad del paciente; el proceso 2bb, por la prescripcin; el proceso 3bac, por prescripcin, el cual es diferente al proceso 2bb, a pesar de que ambos hacen la misma pregunta, las decisiones que se toman con la respuesta son diferentes; el proceso 3bbb, por la edad del paciente, el cual es diferente que el proceso 2ba, por las mismas razones esgrimidas antes.

Pervys Rengifo Rengifo: http://pervys-cienciaytecnologia.blogspot.com/

pregunta(1, Respuesta):-combo_select(`TASA DE PRODUCCIN DE LGRIMAS?`, [`REDUCIDA`,`NORMAL`], Respuesta ).

pregunta(2, Respuesta):-combo_select(`TIENE ASTIGMATISMO?`, [`SI`,`NO`], Respuesta ). pregunta(3, Respuesta):-combo_select(`QUE PRESCRIPCIN TIENE?`, [`MIOPIA`,`HIPERMETROPIA`], Respuesta ). pregunta(4, Respuesta):-combo_select(`CUAL ES LA EDAD DEL PACIENTE?`, [`JOVEN`,`PRE-PRESBIOPICO`,`PRESBIOPICO`], Respuesta ). recomendacion_lentes(Clase, Recomendacion):-(Clase=1->Recomendacion='Usar lente de Contacto Suave'; Clase=2-> Recomendacion='Usar lente de Contacto Duro'; Clase=3->Recomendacion='No usar Lente de Contacto'),nl. empezar:-bienvenida,proceso0. proceso0:- pregunta(1, Respuesta ), (Respuesta=`REDUCIDA`-> proceso_final(3); Respuesta=`NORMAL` -> proceso('1b');inicio). proceso('1b'):-pregunta(2, Respuesta ), (Respuesta= `SI` ->proceso('2ba'); Respuesta= `NO` -> proceso('2bb'); proceso('1b')). proceso('2ba'):-pregunta(4, Respuesta), (Respuesta=`JOVEN`-> proceso_final(1); Respuesta=`PRE-PRESBIOPICO`-> proceso_final(1); Respuesta=`PRESBIOPICO`->proceso('3bac');proceso('2ba')). proceso('2bb'):-pregunta(3, Respuesta ), (Respuesta=`MIOPIA`->proceso_final(2); Respuesta=`HIPERMETROPIA`->proceso('3bbb');proceso('2bb')). proceso('3bac'):-pregunta(3, Respuesta ), (Respuesta=`MIOPIA`->proceso_final(3); Respuesta=`HIPERMETROPIA`->proceso_final(1);proceso('3bac')). proceso('3bbb'):- pregunta(4, Respuesta), (Respuesta=`JOVEN`-> proceso_final(2); Respuesta=`PRE-PRESBIOPICO`-> proceso_final(3); Respuesta=`PRESBIOPICO`-> proceso_final(3);proceso('3bbb')). proceso_final(Clase):- recomendacion_lentes(Clase, M),atom_string( M,Recomendacion), despliega_repuesta(Recomendacion) , continuar. despliega_repuesta(Lente) :_S1 = [dlg_ownedbydesktop,ws_sysmenu,ws_caption], _S2 = [ws_child,ws_visible,ss_center], _S3 = [ws_child,ws_visible,ws_tabstop,bs_pushbutton], wdcreate( respuesta, `user_dialog`, 235, 43, 402, 180, _S1 ), wccreate( (respuesta,10000), static, `LA RECOMENDACIN ES`, 20, 10, 370, 20, _S2 ), wccreate( (respuesta,10001), static, Lente, 120, 40, 170, 50, _S2 ), wccreate( (respuesta,1000), button, `ACEPTAR`, 130, 100, 150, 30, _S3 ), wfcreate( foo1, arial, 18, 2 ), wfont( (respuesta,10000), foo1 ), wfont( (respuesta,10001), foo1 ),

Pervys Rengifo Rengifo: http://pervys-cienciaytecnologia.blogspot.com/

window_handler( respuesta, bienvenida_handler ), call_dialog( respuesta, R ), wfclose(foo1),wclose(respuesta). continue('yes'):-proceso0,!. % dependiendo del parametro, se sigue con otra consulta o se sale. continue('no'):-despedida. continuar:-message_box( yesno, 'Desea Continuar', A ), continue(A). despedida:- _S1 = [ws_sysmenu,ws_popup,ws_caption,dlg_ownedbyprolog], _S2 = [ws_child,ws_visible,ss_center], _S3 = [ws_child,ws_visible,ws_tabstop,bs_pushbutton], wdcreate( despedida, `user_dialog`, 235, 43, 533, 358, _S1 ), wccreate( (despedida,10000), static, `Hasta pronto`, 146, 40, 240, 20, _S2 ), wccreate( (despedida,10001), static, `Fue un placer Ayudarte`, 146, 60, 240, 20, _S2 ), wccreate( (despedida,10002), static, `Sistemas Basados en el Conocimiento I`, 117, 90, 300, 20, _S2 ), wccreate( (despedida,10003), static, `Facultad de Matemticas e Ingenieras`, 117, 110, 300, 20, _S2 ), wccreate( (despedida,10004), static, `FUNDACIN UNIVERSITARIA KONRAD LORENZ-FUKL (http://www.fukl.edu)`, 16, 130, 500, 60, _S2 ), wccreate( (despedida,1000), button, `OK`, 226, 190, 80, 20, _S3 ), wcreate((despedida,2),grafix,``,0, 210, 533, 96,16'50000000), wfcreate( foo, arial, 18, 0 ), wfont( (despedida,10000), foo ), wfont( (despedida,10001), foo ), wfont( (despedida,10002), foo ), wfont( (despedida,10003), foo ), wfont( (despedida,10004), foo ), wfont( (despedida,1000), foo ), window_handler( despedida, bienvenida_handler ), call_dialog( despedida, R ), wfclose(foo),gfx_bitmap_close(fukl),gfx_bitmap_close(fukl1),wclose(despedida). bienvenida :- _S1 = [ws_sysmenu,ws_popup,ws_caption,dlg_ownedbyprolog], _S2 = [ws_child,ws_visible,ss_center], _S3 = [ws_child,ws_visible,ss_left], _S4 = [ws_child,ws_visible,ws_tabstop,bs_pushbutton], wdcreate( bienvenida, `user_dialog`, 235, 43, 532, 325, _S1 ), wccreate( (bienvenida,10000), static, `FUNDACIN UNIVERSITARIA KONRAD LORENZ-FUKL (http://www.fukl.edu)`, 70, 10, 390, 20, _S2 ), wccreate( (bienvenida,10001), static, `FACULTAD DE MATEMTICAS E INGENIERAS`, 110, 30, 320, 20, _S2 ), wccreate( (bienvenida,10002), static, `SISTEMAS BASADOS EN EL CONOCIMIENTO I`, 110, 50, 320, 20, _S2 ), wccreate( (bienvenida,10003), static, `BIENVENIDOS AL PROGRAMA " LENTES"`, 110, 70, 320, 20, _S2 ), wccreate( (bienvenida,10004), static, `EL CUAL, CON UN EJEMPLO SENCILLO, ILUSTRA EL PROCESO`, 60, 90, 420, 20, _S2 ), wccreate( (bienvenida,10005), static, `DE CONSTRUCCIN DE UN SISTEMA BASADO EN EL CONOCIMIENTO`, 60, 110, 420, 20, _S2 ), wccreate( (bienvenida,10006), static, `SE TRATA DE RECOMENDAR UN TIPO DE LENTE, A PARTIR DE`, 60, 130, 420, 20, _S3 ),

Pervys Rengifo Rengifo: http://pervys-cienciaytecnologia.blogspot.com/

wccreate( (bienvenida,10007), static, `CIERTAS CARACTERSTICAS DEL PACIENTE`, 60, 150, 420, 20, _S2 ), wccreate( (bienvenida,1000), button, `CONTINUAR`, 210, 180, 130, 30, _S4 ), wcreate((bienvenida,2),grafix,``,0, 210, 533, 96,16'50000000), window_handler( bienvenida, bienvenida_handler ), gfx_bitmap_load(fukl,'fukl.bmp'), %carga el archivo fukl.bmp del directorio local gfx_bitmap_load(fukl1,'fukl1.bmp'), %carga el archivo fukl1.bmp del directorio local call_dialog( bienvenida, R ), wclose(bienvenida). bienvenida_handler( (Window,2), msg_paint, _, _ ) :- gfx_paint( (Window,2) ), gfx(bitmap(0,0, 533, 96,0,0,fukl1)), gfx_end( (Window,2)). bienvenida_handler( (Window,1000), msg_button, _, cancel ). combo_select( Pregunta,Items, Selected ) :-_S1 = [ws_sysmenu,ws_popup,ws_caption,dlg_ownedbyprolog], _S2 = [ws_child,ws_visible,ws_tabstop,cbs_dropdown], _S3 = [ws_child,ws_visible,ss_left], _S4 = [ws_child,ws_visible,ws_tabstop,bs_pushbutton], _S5 = [ws_child,ws_visible,ws_border], wdcreate( combo, `user_dialog`, 272, 150, 400, 350, _S1 ), wccreate( (combo,500), combobox, `Combo1`, 100, 60, 170, 150, _S2 ), wccreate( (combo,3), static, Pregunta, 50, 20, 350, 20, _S3 ), wccreate( (combo,1), button, `OK`, 140, 140, 100, 30, _S4 ), wcreate((combo,4),static,`iconbds`,10,10,70,54,16'50000003), wcreate((combo,2),grafix,``,25, 200, 343, 90,16'50000000), fcreate( combo, [], -2, 0, 0 ), wfcreate( foo, arial, 18, 0 ), wfont( (combo,3), foo ), wfont( (combo,500), foo ), fill_combo( (combo,500), Items ), window_handler( combo, combo_handler ), call_dialog( combo, R ), (R=cancel->Selected=R; (P is R+1,enesimo(Selected,P,Items))), fclose( combo ),wclose(combo),!. combo_handler( (Window,2), msg_paint, _, _ ) :gfx_paint( (Window,2) ), gfx(bitmap(0,0, 343, 90,0,0,fukl)), %tamao de la imagen 343x90, iniciada en 0,0 gfx_end( (Window,2)). % cuando ocurra un mensaje de cierre retorna "cancel" combo_handler( _, msg_close, _, cancel ). % cuando se presiona el boton "OK" retorna la seleccion combo_handler( (Window,1), msg_button, _, Result ) :- get_selected_item( (Window,500), Result ). % llena el combobox con la lista de items, preseleccionando el primer item fill_combo( Window, Items ) :-sndmsg( Window, cb_resetcontent, 0, 0, _ ), forall( member( Item, Items ),sndmsg( Window, cb_addstring, 0, Item, _ )), sndmsg( Window, cb_setcursel, 0, 0, _ ).

Pervys Rengifo Rengifo: http://pervys-cienciaytecnologia.blogspot.com/

% Se obtiene la posicin-1 del tem seleccionado get_selected_item( Window, R ) :- sndmsg( Window, cb_getcursel, 0, 0, R ). %obtiene el elemento ensimo de una lista enesimo(X,1,[X|_]). enesimo(X,N,[_|L]):-R is N-1, enesimo(X,R,L).

Para correr este programa se debe descargar el archivo comprimido de la siguiente direccin: http://in.solit.us/archives/download/153909, descomprimirlo en una carpeta y luego abrirlo con winprolog(se utiliz la versin 4.2), igual que se hizo para el ejemplo 1. Aqu se muestra una secuencia de corrida del programa: Al entrar el comando empezar se obtiene:

Al hacer clic en continuar

Luego de seleccionar la opcin NORMAL

Pervys Rengifo Rengifo: http://pervys-cienciaytecnologia.blogspot.com/

Luego de seleccionar la opcin SI

Luego de elegir la opcin JOVEN

Pervys Rengifo Rengifo: http://pervys-cienciaytecnologia.blogspot.com/

Al elegir la opcin Aceptar

A elegir la opcin NO

Pervys Rengifo Rengifo: http://pervys-cienciaytecnologia.blogspot.com/

APNDICE 1 Este apndice fue elaborado a partir del documento WIN-PROLOG 4.2 Technical Reference de Brian D. Steel3 PREDICADOS UTILIZADOS EN ESTE TUTORIAL PARA EL DESARROLLO DE LA INTERFACE DE USUARIO A continuacin se hace una breve descripcin de los predicados usados para la construccin de las interfaces grficas de usuario gfx_paint/1 obtiene el dispositivo de contexto recortado para comenzar grficos gfx_paint( Ventana ) +Ventana <window_handle> Ejemplos El siguiente programa crea una ventana "grafix", y le asocia un manejador (handler), antes de mostrar la ventana mostrar_ventana:wcreate( ventana, grafix, ``, 10, 10, 100, 100, 16'80800000 ), window_handler( ventana, manejador ), wshow(ventana, 1 ).

El manejador de ventana slo tiene una clusula, la cual reacciona a mensajes "msg_paint", mediante la obtencin del dispositivo de recortado, dibujando un crculo gris, y luego liberando el dispositivo de contexto: manejador( ventana, msg_paint, _, _ ) :gfx_paint( ventana ), % obtencin del contexto recortado del dispositivo gfx( (brush = stock(gray_brush) -> ellipse(10,10,90,90)) ), % dibujando un crculo gris gfx_end( ventana ). % liberando el dispositivo de contexto

Copyright (c) 1989-2001 Logic Programming Associates Ltda

Pervys Rengifo Rengifo: http://pervys-cienciaytecnologia.blogspot.com/

gfx_end/1 Libera el dispositivo de contexto para finalizar la graficacin gfx_end( Ventana ) +Window <window_handle> o <empty_list> Commentarios Esto libera el dispositivo de contexto de graficacin actual, para la Ventana con el fin de finalizar una secuencia de graficacin, antes de restaurar cualquier dispositivo de contexto guardado previamente previamente. Si Ventana se especifica como una lista vaca, se libera el dispositivo de contexto correspondiente a la impresora actual. Ver ejemplo de gfx_paint/1 Notas: Los dispositivos de contexto, tienen escasos recursos y siempre deberan retornarse una vez se terminen de usar. Cada una de las llamadas a gfx_begin/1 o a gfx_paint/1 debera estar acompaada de una llamada a gfx_end/1, idealmente con una o ms llamadas a gfx/1entre ellos: ideal_grafix( W ):gfx_begin( W ), ... realice una o ms llamadas a gfx/1 aqu ... gfx_end( W ) ideal_repaint( W) :gfx_paint( W ), ... realice una o ms llamadas a gfx/1 aqu ... gfx_end( W ). El subsistema GraFiX de WIN-PROLOG comprende un completo conjunto de predicados, referidos genricamente como "gfx*/n" debido a que virtualmente todos sus nombres comienzan con las letras "gfx". Muchos de ellos, incluyendo el predicado gfx_end/1, estn relacionados con el manejo de dispositivos de contexto: Ellos constituyen el ambiente virtual en el cual se dibujan todas las grficas en las ventanas.

Pervys Rengifo Rengifo: http://pervys-cienciaytecnologia.blogspot.com/

sndmsg/5 Enva un mensaje a una ventana sndmsg( Ventana, Mensaje, Wparam, Lparam, Resultado ) +Ventana <window_handle> +Mensaje <atom> +Wparam <term> +Lparam <term> -Resultado <variable> Comentarios Esto enva el mensaje denominado Mensaje a la Ventana dada, pasndole los parmetros Wparam y Lparam: El Resultado de la llamada se retorna como un entero. Cada uno de los dos parmetros puede ser de los siguientes tipos: Tipo Significado <integer> El entero se pasa directamente como un dato <string> El texto de cadena se almacena en un buffer temporal, y su direccin se pasa como un apuntador <atom> Este es un archivo de memoria creado con fcreate/5: su direccin es pasada como un apuntador Ejemplo: La siguiente llamada establece un archivo de memoria denominado buffer, con un tamao de 1024 bytes, con el fin de usarlo para con sndmsg/5: ?- fcreate( buffer, [], -1, 1024, 0 ). <enter> yes Una vez se crea este buffer, se puede usar como un parmetro en la llamada a sndmsg/5. La siguiente llamada enva un mensaje a la ventana principal de WIN-PROLOG(0), la cual copia el ttulo de la ventana en el buffer, retornando el nmero de caracteres en el nombre: ?- sndmsg( 0, wm_gettext, 1024, buffer, R ). <enter> R = 10 Se puede hacer una llamada a wintxt/4 para recuperar el texto contenido en buffer, antes de cerrarlo con fclose/1: ?- wintxt( buffer, 0, 0, T ), fclose( buffer ). <enter> T = `W ` Notas: Muchas operaciones en el ambiente Windows (Win32 API) son manejados mediante el paso de mensajes a windows. Los cuales pueden ser enviados por el mismo sistema operativo o por aplicaciones. En tiempo de corrida, los mensajes y sus parmetros son simplemente nmeros, aunque la mayora de compiladores de Windows los proveen con nombres significativos y tipos de datos de parmetros en tiempo de compilacin. Debido a que Prolog es un lenguaje dinmico, podra ser restrictivo limitar la denominacin de los mensajes al tiempo de compilacin.

Pervys Rengifo Rengifo: http://pervys-cienciaytecnologia.blogspot.com/

sndmsg/5 se ha provedo para facilitar especficamente la programacin del acceso a mensajes de windows. El predicado sndmsg/5 , en efecto, no es nada ms que un front end para el predicado winapi/4, el cual permite que se pueda llamar virtualmente a cualquier funcin el API win32( como tambin la mayora de aquellas en cualquier Librera de enlace dinmico(DLL) de 32 bits) Este predicado soporta la mayora de los mensajes de Windows, incluyendo todos los documentados en la versin 2.0 del SDK de Win32 de Microsoft.

call_dialog/2 Llama a un dilogo modal y obtiene o verifica el resultado call_dialog( Ventana, Resultado ) +Ventana <window_handle> ?Resultado <term> Comentarios Esto muestra la Ventana de dilogo dada, deshabilitando toas las dems ventanas de nivel superior de WIN-PROLOG y espera a que el usuario complete el dilogo: Resultado es unificado con cualquier valor que haya sido retornado por el manejador de la ventana del dilogo. Ejemplo El siguiente predicado crea un dilogo muy simple con dos botones,etiquetados con Hola y Mundo, respectivamente: crear_dialogo :Dstyle = [ws_popup,ws_caption], Bstyle = [ws_child,ws_visible,bs_pushbutton], wdcreate( dialogo, `dilogo`, 100, 100, 170, 75, Dstyle ), wccreate( (dialogo,1), button, `Hola`, 10, 10, 70, 30, Bstyle ), wccreate( (dialogo,2), button, `Mundo`, 90, 10, 70, 30, Bstyle ). Cuando se compila, y se entra el siguiente comando, se crea el dilogo dialogo, pero no se depliega todava ?- crear_dialogo. <enter> Yes

Pervys Rengifo Rengifo: http://pervys-cienciaytecnologia.blogspot.com/

Para mostrar el dilogo, y retornar el texto del botn que fue presionado, entre el siguiente comando: ?- call_dialog( dialogo, X ). <enter> El dilogo aparecer, deshabilitando todas las dems ventanas de WIN-PROLOG, y si se presiona el botn "Hola", su texto en minsculas ser retornado como sigue: X = hola

Pervys Rengifo Rengifo: http://pervys-cienciaytecnologia.blogspot.com/

Notes El ejemplo anterior usa el manejador de ventana por defecto,window_handler/4, which simply unifica el texto en minsculas de cualquier botn cliqueado con Resultado. Esta accin

de unificar esta variable es lo que realmente completa el dilogo. Los manejadores de ventanas (window handler) son

simplemente programas de aridad 4 que interceptan mensajes destinados a una ventana(incluyendo dilogos y sus controles), permitiendo que se puedan procesar acciones arbitrarias. Considere el siguiente ejemplo: manejador_boton( (dialogo,1), msg_button, _, Resultado ) :time( _, _, _, H, M, S, _ ), Resultado= finished_at(H,M,S). manejador_boton( Ventana, Mensaje, Datos, Resultado ) :window_handler(Ventana, Mensaje, Datos, Resultado ). La primera clusula detecta que un botn denominado (boton,1)" haya sido cliqueado y completa el dilogo retornando la estructura finished_at(H,M,S)" en lugar el tomo "hello". Los dems mensajes son pasados al manejador de ventana por defecto. El cdigo completo sera: crear_dialogo :Dstyle = [ws_popup,ws_caption], Bstyle = [ws_child,ws_visible,bs_pushbutton], wdcreate( dialogo, `dilogo`, 100, 100, 170, 75, Dstyle ), wccreate( (dialogo,1), button, `Hola`, 10, 10, 70, 30, Bstyle ), wccreate( (dialogo,2), button, `Mundo`, 90, 10, 70, 30, Bstyle ). manejador_boton( (dialogo,1), msg_button, _, Resultado ) :time( _, _, _, H, M, S, _ ), Resultado= finished_at(H,M,S). manejador_boton( Ventana, Mensaje, Datos, Resultado ) :window_handler(Ventana, Mensaje, Datos, Resultado ).

Pervys Rengifo Rengifo: http://pervys-cienciaytecnologia.blogspot.com/

Una vez compilado el nuevo manejador de ventana es asociado a la ventana de dilogo con una llamada a window_handler/2, como se muestra a continuacin: ?- window_handler( dialogo, manejador_boton). <enter> yes Si el dilogo es invocado una vez ms, y se presiona el botn "(boton,1)" (etiquetado con "Hola"), se retorna el tiempo en lugar del tomo "hola": ?- call_dialog( dialogo, X ). <enter>

X = finished_at(16,25,6) Que indica la hora en que fue presionado el botn Hola. Si presiona el botn Mundo, solo retornar R=mundo, ya que el nuevo manejador(manejador_boton), no se defini para la ventana de ese botn((dialogo,2)).

Si se deseara que los dos botones reaccionaran igual, se deba incluir un predicado similar para el botn Mundo ((dialogo, 2)). crear_dialogo :- Dstyle = [ws_popup,ws_caption], Bstyle = [ws_child,ws_visible,bs_pushbutton], Pervys Rengifo Rengifo: http://pervys-cienciaytecnologia.blogspot.com/

wdcreate( dialogo, `dilogo`, 100, 100, 170, 75, Dstyle ), wccreate( (dialogo,1), button, `Hola`, 10, 10, 70, 30, Bstyle ), wccreate( (dialogo,2), button, `Mundo`, 90, 10, 70, 30, Bstyle ). manejador_boton( (dialogo,1), msg_button, _, Resultado ) :time( _, _, _, H, M, S, _ ), Resultado= finished_at(H,M,S). manejador_boton( (dialogo,2), msg_button, _, Resultado ) :time( _, _, _, H, M, S, _ ), Resultado= finished_at(H,M,S). manejador_boton( Ventana, Mensaje, Datos, Resultado ) :window_handler(Ventana, Mensaje, Datos, Resultado ). Note que los dilogos modales y no modales tiene exactamente los mismos manejadores de ventana: en efecto en WIN-PROLOG, estos dos tipos de dilogos son lo mismo. Todo lo que determina si un dilogo se comporta de forma modal o no modal en tiempo de corrida, es si el dilogo es invocado por call_dialog/2 (modal) o show_dialog/1 ( no modal).

window_handler/2 Obtiene o establece el manejador para una ventana dada window_handler( Ventana, Manejador ) +Ventana<atom> o <integer> en el dominio {0,1} ?Manejador <atom> o <variable> Comentarios Obtiene o establece el nombre de un predicado de aridad 4 que sera usado como el Manejador para la Ventana de nivel superior(de dilogo, de texto o de usuario). Si Manejador es una variable no acotada, retorna el nombre del manejador existente, de otra forma, establece que el manajador Manejador asocindolo a la Ventana. Ejemplo El siguiente programa usa wdcreate/7 y wccreate/8 para crear un pequeo dilogo que contiene un pequeo botn de presionar por defecto: dialogo_ejemplo:Dstyle = [ws_visible,ws_popup,ws_caption], Bstyle = [ws_visible,ws_child,bs_defpushbutton], wdcreate( dialogo, `dilogo`, 10, 10, 100, 60, Dstyle ), wccreate( (dialogo,1), button, `clic`, 10, 10, 80, 20, Bstyle ). Una vez compilado, la siguiente llamada despliega el dilogo cerca a la esquina superior izquierda de la pantalla(haciendo posteriormente clic en el botn ocultar(aunque no cerrar) el dilogo) ?- dialogo_ejemplo. <enter>

Pervys Rengifo Rengifo: http://pervys-cienciaytecnologia.blogspot.com/

Yes

Este comportamiento es debido al manejador de ventana por defecto para el dilogo, window_handler/4, como se puede apreciar mediante la siguiente llamada, cuando se pregunta por el nombre del manejador actual de la ventana dialogo: ?- window_handler( dialogo, H ). <enter> H = window_handler Ahora considere el siguiente manejador de ventana: dialogo_manejador( (dialogo,1), msg_button, _, _ ) :time( _, _, _, H, M, S, _ ), write( H-M-S ) ~> String, wtext( (dialogo,1), String ). dialogo_manejador( Ventana, Mensaje, Datos, Resultado ) :window_handler( Ventana, Mensaje, Datos, Resultado ). La primera clusula simplemente intercepta el mensaje "msg_button" destinado al control del botn, "(dialogo,1)", y en vez de permitir al botn, ocultar el dilogo, escribe el tiempo actual en una cadena, usando esto para renombrar al botn. Todos los dems mensajes son recogidos por la segunda clusula, la cual simplemente se los pasa a window_handler/4 para el procesamiento por defecto. El cdigo del programa completo sera: dialogo_ejemplo:Dstyle = [ws_visible,ws_popup,ws_caption], Bstyle = [ws_visible,ws_child,bs_defpushbutton], wdcreate( dialogo, `dilogo`, 10, 10, 100, 60, Dstyle ), wccreate( (dialogo,1), button, `clic`, 10, 10, 80, 20, Bstyle ). dialogo_manejador( (dialogo,1), msg_button, _, _ ) :time( _, _, _, H, M, S, _ ), write( H-M-S ) ~> String, wtext( (dialogo,1), String ). dialogo_manejador( Ventana, Mensaje, Datos, Resultado ) :window_handler( Ventana, Mensaje, Datos, Resultado ). Una vez compilado este programa puede ser asociado al dilogo dialogo con la siguiente llamada: ?- window_handler( dialogo, dialogo_manejador ). <enter> yes Pervys Rengifo Rengifo: http://pervys-cienciaytecnologia.blogspot.com/

Ahora, cuando se despliega el dilogo con una llamada a dialogo_ejemplo /0, al hacer clic sobre el botn simplemente cambiar su etiqueta desplegando el tiempo actual sin cerrar el dilogo. ?- dialogo_ejemplo. <enter> Yes

Notas El window_handler/2 simplemente mantiene una base de datos local de los nombre de las ventana de nivel superior y los nombres de sus respectivos predicados manejadores de ventana: cuando un mensaje llega a una ventana dada, se verifica esta base de datos para buscar una coincidencia. Si se halla la ventana de nivel superior, entonces se llama el correspondiente manejador con cuatro argumentos: <handler>( Ventana, Mensaje, Datos, Resultado ) Los primeros tres argumentos son acotados como sigue: Ventana contiene el manejador de la ventana que recibe el mensaje (<window_handle>), Mensaje contiene el nombre del mensaje(<atom> if known, otherwise <integer>), y Data contiene informacin suplementaria (dependiendo del mensaje). El ltimo argumento, Resultado, es una variable no acotada. Si el manejador de ventana une esto a algn valor, causar la terminacin de la ventana de nivel superior(generalmente un dilogo): si la ventana fue invocada por call_dialog/2, este valor es pasado hacia atrs como el segundo argumento del ltimo predicado. Considere la siguiente variante del manejador de ventana mostrado anteriormente: Pervys Rengifo Rengifo: http://pervys-cienciaytecnologia.blogspot.com/

dialogo_manejador ( (dialogo,1), msg_button, _, (H,M,S) ) :time( _, _, _, H, M, S, _ ). dialogo_manejador ( Ventana, Mensaje, Datos, Resultado ) :window_handler(Ventana, Mensaje, Datos, Resultado). El dialogo completo sera: dialogo_ejemplo:Dstyle = [ws_visible,ws_popup,ws_caption], Bstyle = [ws_visible,ws_child,bs_defpushbutton], wdcreate( dialogo, `dilogo`, 10, 10, 100, 60, Dstyle ), wccreate( (dialogo,1), button, `clic`, 10, 10, 80, 20, Bstyle ). dialogo_manejador( (dialogo,1), msg_button, _, (H,M,S) ) :time( _, _, _, H, M, S, _ ). dialogo_manejador( Ventana, Mensaje, Datos, Resultado ) :window_handler(Ventana, Mensaje, Datos, Resultado). Esta vez la primera clusula retorna simplemente el tiempo. Una vez compilado, el dilogo puede ser llamado modalmente como se muestra a continuacin: ?-dialogo_ejemplo.<enter>

?- call_dialog( dialogo, R ).<enter>

Al hacer clic sobre el botn, se obtiene R=(0,7,8) Pervys Rengifo Rengifo: http://pervys-cienciaytecnologia.blogspot.com/

Que indica el tiempo: 0 horas, 7 minutos y 8 segundos (12:07:08 am, hora a la que se corri el programa.

Para remover la asociacin entre una ventana y su manejador definido por el usuario, window_handler/2 se llama para "re-asociar" la ventana con el manejador por defecto, window_handler/4: ?- window_handler( dialogo, window_handler ). <enter> Ahora cuando se llame el dilogo modalmente, simplemente retorna el nombre del botn, cuando ste sea cliqueado. ?- dialogo_ejemplo.

?- call_dialog( dialogo, R ). <enter>

Al hacer clic sobre el botn, se obtiene R=clic

Pervys Rengifo Rengifo: http://pervys-cienciaytecnologia.blogspot.com/

Que indica el nombre del botn.

Note que window_handler/2 asocia solamente ventanas de nivel superior"(ventanas de Dilogo, de Texto y de usuario, junto con la ventana principal (0) y la ventana de consola (1): no es posible asociar manejadores de ventanas a controles individuales dentro de estas ventanas. Cuando se llama a un manejador de ventana, su primer argumento especifica la ventana precisa (de nivel superior o de control, segn sea el caso) que ha recibido el mensaje, y corresponde al programador decidir cmo usar esta informacin. En el ejemplo anterior la primer clusula especifica la ventana exacta ((dilogo, 1)) y el mensaje ("msg_button") que est siendo procesado, pero uno de estos parmetros o los dos se pueden especificar total o parcialmente no instanciados. Por ejemplo, la siguiente clusula recogera los mensajes msg_button para cualquier botn de cualquier dilogo para el cual se estableci dialogo_handler/4 como su manejador, retornando el entero ID en vez de su nombre dialogo_handler ( (Dialogo,ID), msg_button, _, ID ). Cualquier predicado puede servir a un nmero arbitrario de ventanas de nivel superior (en particular, window_handler/4 sirve a todas las ventanas hasta que es reemplazado por un manejador definido por el usuario). Adicionalmente, es posible asociar ventanas y nombre de manejadores, llamando a window_handler/2 incluso antes de que la ventana y/o el manejador existan. Todo lo que se requiere es que el predicado del manejador de aridad 4 est compilado y listo para usarse en el momento en que se cree una ventana para la cual ese predicado sea elegido como manejador

gfx_bitmap_load/2

Carga un objeto bitmap de un archivo de disco dado. wdcreate/7 Crea una ventana de dilogo wdcreate( Ventana, Texto, Izquierda, Superior, Ancho, Profundidad, Estilo ) +Ventana <window_handle> +Texto <string> Pervys Rengifo Rengifo: http://pervys-cienciaytecnologia.blogspot.com/

+Izquierda <integer> +Superior <integer> +Ancho <integer> +Profundidad <integer> +Estilo <list> Comentarios Esto crea una ventana de dilogo con el manejador Ventana, el ttulo Texto, en la posicin (Izquierda, Superior), con el tamao (Ancho, Profundidad) y el estilo tipo lista Estilo. Ejemplo El siguiente programa usa wdcreate/7 wccreate/8 para crear un pequeo dilogo que contiene un solo botn "pulsacin por defecto: ejemplo_wdcreate :Dstyle = [ws_visible,ws_popup,ws_caption], Bstyle = [ws_visible,ws_child,bs_defpushbutton], wdcreate( prueba, `foo`, 10, 10, 100, 60, Dstyle ), wccreate( (prueba,1), button, `fukl`, 10, 10, 80, 20, Bstyle ). Una vez compilado, la siguiente llamada desplegar el dilogo cerca de la esquina superior izquierda de la pantalla(al hacer clic sobre el botn, la ventana se ocultar, pero no se cerrar): ?- ejemplo_wdcreate. <enter> yes

wclose/1 cierra una ventana wclose( Ventana ) +Ventana <window_handle> Commentarios: Esto cierra la ventana denominada Ventana, liberando sus recursos. Ejemplo: La siguiente llamada crea una pequea ventana de usuario(MDI child): ?- wcreate( ventana, user, ``, 100, 100, 300, 200, 0 ). <enter> Yes

Pervys Rengifo Rengifo: http://pervys-cienciaytecnologia.blogspot.com/

Despus de hacer clic al mouse se retorna a la ventana de consola, la ventana recientemente creada se puede cerrar con el siguiente comando: ?- wclose( foo ). <enter> yes Notas Cuando se cierra una ventana de nivel superior(tal como un dilogo o una ventana de usuario), se cierran tambin todos los controles constituyentes de esa ventana: de esta manera pueden hacerse varias llamadas a wcreate/8 por cada subsecuente llamada a close/1. El nmero de ventanas que se pueden abrir a la vez es una funcin de los recursos spare en el ambiente Windows. Sin embargo, existe un techo lmite en WIN-PROLOG que limita el nmero de dilogos abiertos a 64, pero, debido a que los diologos pueden ser creados y cerrados a voluntad cualquier nmero de veces, este lmite, en general, nunca es un problema. wcreate/8 crea una ventana wcreate( Ventana, Clase, Texto, Izquierda, Superior, Ancho, Profundidad, Estilo ) +Ventana <window_handle> +Clase <atom> +Texto <string> +Izquierda <integer> +Superior <integer> +Ancho <integer> +Profundidad <integer> +Estilo <integer> Comentarios: Esto crea una ventana con un Manejador, Clase y Texto dados, en la posicin (Izquierda, Superior), con el tamao (Ancho, Profundidad) y el Estilo entero. Las siguientes clases de ventanas estndar que se pueden crear por medio de este predicado: Clase Significado de la clase Button control de botn Pervys Rengifo Rengifo: http://pervys-cienciaytecnologia.blogspot.com/

ComboBox Edit ListBox ScrollBar Static

Control combobox control edit control listbox control scrollbar Control static

Adems de las clases anteriores , Win Prolog define las siguientes clases: Clase Text: User: Grafix: Significado de la clase Ventana de Texto de WIN-PROLOG Ventana de usuario de WIN-PROLOG Control grafix de WIN-PROLOG

Una pseudo clase denominado, Dialog, se usa para crear ventana de dilogo. La siguiente instruccin crea una pequea ventana de usuario(MDI Child): ?- wcreate( ventana, user, ``, 100, 100, 300, 200, 0 ). <enter> yes

Despus de hacer clic al mouse se retorna a la ventana de consola, la ventana recientemente creada se puede cerrar con el siguiente comando; ?- wclose( ventana ). <enter> yes Notas: El predicado wcreate/8 proporciona soporte de bajo nivel para los otros cuatro creadores de ventana: Los predicados wccreate/8 y wdcreate/7 tratan a Estilo como una lista de nombres de estilo, convirtindolos en un entero, mientras que wtcreate/6 y wucreate/6 no tienen parmetro de estilo, y usan un entero por defecto. Este es uno de la pequea familia de predicados de WIN-PROLOG para manipular ventanas implementadas directamente en kernel codificado en ensamblador, permitiendo funciones especiales de bajo nivel que pueden ser manipuladas eficientemente. La mayor parte de los dems predicados para manipular ventanas se implementan como una capa delgada sobre la todo-poderosa winapi/4 para simplificar Pervys Rengifo Rengifo: http://pervys-cienciaytecnologia.blogspot.com/

las tareas comunes de programacin en Windows. A pesar de que la mayora de aplicaciones pueden ser satisfechas con estos predicados simples, siempre es probable que se presenten combinaciones de funciones que no pueden ser realizadas fcilmente con ellas. En estas ocasiones, se puede usar winapi/4 y su predicado ayudante wintxt/4, para acceder virtualmente a cualquier funcin del API de Windows al igual que las implementadas en DLL.

wccreate/8 Crea una ventana de control

wccreate( Ventana, Clase, Texto, Izquierda, Superior, Ancho, Profundidad, Estilo ) +Window <window_handle> +Clase <atom> +Texto <string> +Izquierda <integer> +Superior <integer> +Ancho<integer> +Profundidad <integer> +Estilo <list> Comentarios Esto crea una ventana con un Manejador, Clase y Texto dados, en la posicin(Izquierda, Superior), con el tamao (Ancho, Profundidad) y la lista de Estilo. La lista de tipos de clases de estilo se describen en wcreate/8. Ejemplo El siguiente programa usa wdcreate/7 y wccreate/8 para crear un pequeo dilogo que contiene un pequeo dilogo con un botn. ejemplo_dialogo :Dstyle = [ws_visible,ws_popup,ws_caption], Bstyle = [ws_visible,ws_child,bs_defpushbutton], wdcreate( ejemplo, `hola esta es una prueba`, 10, 10, 200,160, Dstyle ), wccreate( (ejemplo,1), button, `es es un ejemplo`, 30, 10, 120, 20, Bstyle ). Una vez compilado, la siguiente llamada desplegar el dilogo cerca de la esquina superior izquierda de la pantalla(Si se ha clic en el botn, el dilogo se ocultar, pero no se cerrar) ?- ejemplo_dialogo. <enter> yes

Pervys Rengifo Rengifo: http://pervys-cienciaytecnologia.blogspot.com/

Notas: Este es uno de una familia de predicados para la creacin de ventanas de WIN-PROLOG, implementada en trminos de un predicado de ms bajo nivel, wcreate/8, el cual espera un valor de estilo entero como su argumento final. Los predicados wccreate/8 and wdcreate/7 esperan que el estilo sea especificado como una lista de tomos, cada uno de los cuales denota el nombre de un estilo, los cuales son convertidos en un estilo entero; wtcreate/6 y wucreate/6 no tienen parmetro Estilo, sino que simplemente usan un estilo entero por defecto: Entonces, todos los cuatro predicados anteriores llaman a wcreate/8 con su estilo por defecto o calculado. wfcreate/4 crea una fuente wfcreate( Fuente, Apariencia, Tamao, Estilo ) +Font <atom> +Face <atom> +Size <integer> +Style <integer> in the range [0..3] Comentarios Esto crea la fuente llamada Fuente, usando la Apariencia dada, los puntos Tamao y estilo Estilo; cualquier fuente que existe con el mismo nombre se cierra antes de que la nueva fuente sea creada. Los Estilos son listados en la siguiente tabla: Estilo Significado 0 normal 1 italic 2 bold 3 bolditalic Ejemplo La siguiente llamada crear una fuente llamada fuente, especificando su apariencia como Arial, tamao como 16 puntos y estilo como normal ("0"), y asigna esta fuente a la ventana de consola("(1,1)"):

Pervys Rengifo Rengifo: http://pervys-cienciaytecnologia.blogspot.com/

?- wfcreate( fuente, arial, 16, 0 ), wfont( (1,1), fuente ). <enter> yes La siguiente llamada restaura la fuente de consola por defecto("OEM fixed font") ("0"), antes de cerrar la fuente creada anteriormente: ?- wfont( (1,1), 0 ), wfclose( foo ). <enter> yes Notas Cuando se crean y usan Fuentes, es importante recordar que ellas son recursos de bajo nivel de windows, que su uso inadecuado puede resultar en comportamientos impredecibles. En particular una fuente nunca puede ser cerrada o redefinida mientras est seleccionada en una ventana(ver ejemplo de arriba) o contexto de dispositivo grfico. Note que las fuentes creadas con wfcreate/4 son idnticas a las creadas por gfx_font_create/4: los predicados orientados a ventanas wf*/n son completamente intercambiables con los predicados "Grafix" ms recientes, gfx_font*/n wfont/2 obtiene o establece la fuente usada por un control de ventana wfont( Ventana, Fuente ) +Ventana <window_handle> ?Fuente <variable>, <atom>, <integer> o <tuple> Comentarios Esto obtiene o establece la Fuente usada actualmente para desplegar el texto de una Ventana de control determinada: Si Fuente es una variable no acotada, retorna la fuente de ventana existente; de otra forma, se usa para establecer la nueva fuente de ventana. Ejemplo Ver wfcreate/4 Notas Este predicado puede ser usado nicamente para establecer la fuente a ser usada por la ventana de control: no tiene efecto sobre la barra de ttulos de la ventana de nivel superior. Igualmente para manipular fuentes preestablecidas, se puede usar wfont/2 para obtener o fijar un stock de seis fuentes numricas especiales, predefinidas, as como tambin cualquier handle de fuente entera, donde handle est contenida en una tupla de la forma font(integer). El stock de fuentes se lista a continuacin: Nmero 0 1 2 3 4 5 Significado OEM fixed font system font system fixed font ANSI var font ANSI fixed font device default font

Pervys Rengifo Rengifo: http://pervys-cienciaytecnologia.blogspot.com/

wfclose/1 cierra una fuente wfclose( Fuente ) +Fuente <atom> Commentarios Esto cierra la denominada Fuente, liberando sus recursos. Ejemplos Ver wfcreate/4

Nombre de estilos de ventanas


Cuando se crea una ventana, es a menudo necesario especificar su estilo: esto determina la apariencia de la ventana y sus caractersticas de comportamiento. Algunos estilos corresponden a la mayora de las ventanas: visibilidad , por ejemplo, o si la ventana es una ventana hija o emergente. Otros estilos estn relacionados con clases especficas de ventanas: un control button puede aparecer y comportarse como un checkbox, radio button o simple pushbutton. Cada uno de los estilos est asociado con uno o ms bits en un entero de 32 bits: el conjunto requeridos de estilos debe ser combinado usando la funcin o inclusiva, pasndolo antes a wcreate/8 para crear una ventana. Por ejemplo, el siguiente programa crea una ventan de dilogo con estilos combinados, "ws_visible", "ws_popup" y "ws_caption", conteniendo un control "button" con los estilos combinados, "ws_visible", "ws_child" and "bs_defpushbutton". ejemplo :wcreate( prueba, dialog, `prueba`, 10, 10, 100, 60, 16'90C00000 ), wcreate( (prueba,1), button, `bar`, 10, 10, 80, 20, 16'50000001 ). Para hacer ms fcil la especificacin de la ventana, WIN-PROLOG incluye dos predicados adicionales para la creacin de ventanas, wdcreate/7 y wccreate/8, en los cuales el argumento final Estilo puede ser presentada como una lista de nombres de estilo, en vez de un entero; el siguiente programa produce exactamente el mismo dilogo que antes, pero usa lista de estilos en lugar de estilos enteros precomputados: ejemplo :Dstyle = [ws_visible,ws_popup,ws_caption], Bstyle = [ws_visible,ws_child,bs_defpushbutton], wdcreate( prueba, `prueba`, 10, 10, 100, 60, Dstyle ), wccreate( (prueba,1), button, `bar`, 10, 10, 80, 20, Bstyle ). Los dos predicados adicionales, wtcreate/6 y wucreate/6, crean ventana de texto y de usuario(MDI Child) respectivamente: estas dos tipos de ventanas tienen estilos predefinidos, por lo tanto estos predicados omiten el parmetro estilo

Pervys Rengifo Rengifo: http://pervys-cienciaytecnologia.blogspot.com/

Notese que no todos los tipos de estilo pueden ser combinados: un botn, por ejemplom no puede se simultneamente un checkbox ("bs_checkbox"), radio button ("bs_radiobutton") y el pushbutton por defecto("bs_defpushbutton"). El conjunto completo de nombres de estilo que pueden ser usadas en wdcreate/7 y wccreate/8, junto con los tipos de ventana a las cuales ellos pueden corresponder, son listados a continuacin. Estos son los estilos que pueden ser aplicados a ms de una clase de ventana. Estilo Valor ws_overlapped 16'00000000 ws_popup 16'80000000 ws_child 16'40000000 ws_minimize 16'20000000 ws_visible 16'10000000 ws_disabled 16'08000000 ws_clipsiblings 16'04000000 ws_clipchildren 16'02000000 ws_maximize 16'01000000 ws_caption 16'00C00000 ws_border 16'00800000 ws_dlgframe 16'00400000 ws_vscroll 16'00200000 ws_hscroll 16'00100000 ws_sysmenu 16'00080000 ws_thickframe 16'00040000 ws_minimizebox 16'00020000 ws_maximizebox 16'00010000 ws_group 16'00020000 ws_tabstop 16'00010000

Estilos Genricos

Estos son los estilos que pueden ser aplicados a los controles edit Estilo Valor es_left 16'00000000 es_center 16'00000001 es_right 16'00000002 es_multiline 16'00000004 es_uppercase 16'00000008 es_lowercase 16'00000010 es_password 16'00000020 es_autovscroll 16'00000040 es_autohscroll 16'00000080 es_nohidesel 16'00000100 es_oemconvert 16'00000400 es_readonly 16'00000800 es_wantreturn 16'00001000 Pervys Rengifo Rengifo: http://pervys-cienciaytecnologia.blogspot.com/

Estilos de Edit

Estos son los estilos que pueden aplicarse a los controles listbox Estilo Valor lbs_notify 16'00000001 lbs_sort 16'00000002 lbs_noredraw 16'00000004 lbs_multiplesel 16'00000008 lbs_ownerdrawfixed 16'00000010 lbs_ownerdrawvariable 16'00000020 lbs_hasstrings 16'00000040 lbs_usetabstops 16'00000080 lbs_nointegralheight 16'00000100 lbs_multicolumn 16'00000200 lbs_wantkeyboardinput 16'00000400 lbs_extendedsel 16'00000800 lbs_disablenoscroll 16'00001000

Estilos de Listbox

Estos son los estilos que pueden aplicarse a los controles combobox: Estilo Valor cbs_simple 16'00000001 cbs_dropdown 16'00000002 cbs_dropdownlist 16'00000003 cbs_ownerdrawfixed 16'00000010 cbs_ownerdrawvariable 16'00000020 cbs_autohscroll 16'00000040 cbs_oemconvert 16'00000080 cbs_sort 16'00000100 cbs_hasstrings 16'00000200 cbs_nointegralheight 16'00000400 cbs_disablenoscroll 16'00000800

Estilos de Combobox

Estos son los estilos que pueden aplicarse a los controles estticos Estilo Valor ss_left 16'00000000 ss_center 16'00000001 ss_right 16'00000002 ss_icon 16'00000003 ss_blackrect 16'00000004 ss_grayrect 16'00000005 ss_whiterect 16'00000006 ss_blackframe 16'00000007 ss_grayframe 16'00000008 ss_whiteframe 16'00000009 ss_simple 16'0000000B

Estilos Estaticos

Pervys Rengifo Rengifo: http://pervys-cienciaytecnologia.blogspot.com/

ss_leftnowordwrap ss_noprefix

16'0000000C 16'00000080

Estilos de Scrollbar
Estilo sbs_horz sbs_vert sbs_topalign sbs_leftalign sbs_bottomalign sbs_rightalign sbs_sizebox

Estos son los estilos que pueden aplicarse a los controles scrollbar: Valor 16'00000000 16'00000001 16'00000002 16'00000002 16'00000004 16'00000004 16'00000008

Pervys Rengifo Rengifo: http://pervys-cienciaytecnologia.blogspot.com/

Potrebbero piacerti anche