37
Programación de un sistema experto con Visual Prolog 7.5 Julio Luis Tenorio Cabrera.

Visual Prolog 7.5 - I Parte

Embed Size (px)

DESCRIPTION

Este texto es una contribución al aprendizaje de Visual Prolog.

Citation preview

Programacin de un sistema experto con Visual Prolog 7.5

Programacin de un sistema experto con Visual Prolog 7.5

INDICEndice general1ndice de figuras 2Desarrollo de la aplicacin experta MEDICO5Ejecucin de la aplicacin experta MEDICO18Sitios Web25

INDICE DE FIGURAS

Figura 01: Pantalla con mensaje explicativo al usuario de la finalidad de la aplicacin experta.18Figura 02: Pantalla general de la aplicacin experta19Figura 03: Pantalla con opcin y subopciones de la aplicacin experta20Figura 04: Pantalla donde se solicita nombre al usuario de la aplicacin experta 21Figura 05: Pantalla de bienvenida al usuario de la aplicacin experta22Figura 06: Pantalla de consultas de la aplicacin experta23Figura 07: Pantalla de resultados de la aplicacin experta 24

PROGRAMACIN DE UN SISTEMA EXPERTO EN MEDICINA

Ingresar al Visual Prolog y seleccionar la opcin Project y luego la opcin New con lo cual aparecer una interfaz en la que se escribir el nombre del proyecto, en este caso: SISTEMA EXPERTO MEDICO EN NEUROLOGA, as mismo se deber ingresar la informacin solicitada para la creacin del Sistema Experto, teniendo en cuenta que en el tipo de proyecto se elegir Project Kind MDI.

Finalmente hacer click en Finish.

Luego Visual Prolog ejecutar automticamente el proceso de compilacin y linkeado con lo que se genera la aplicacin por defecto. Luego para ejecutar la aplicacin se selecciona la opcin Build y luego la opcin Execute lo que como resultado origina la interfaz de la aplicacin que se muestra a continuacin.

En este punto es importante indicar que dentro de la carpeta TaskWindow se encuentran un conjunto de archivos y una carpeta Toolbars, que luego se trabajar, (Toolbars se puede eliminar seleccionando la opcin Project Toolbar dentro de la ventana Assigned Toolbars, para lo que primero se debe hacer click con el botn derecho del mouse sobre el archivo TaskWindow.win, que es uno de los archivos que se encuentra dentro de la carpeta TaskWindow, y luego seleccionando la opcin Attributes, luego la opcin Project Toolbars dentro de la ventana Assigned Toolbars, como se indic ya anteriormente, y finalmente haciendo click en Delete. Es posible, que luego Toolbars se pueda volver a agregar), por ahora es de inters slo el archivo TaskWindow.win mediante el cual, con el botn derecho del mouse y la opcin Attributes, podemos modificar los atributos de la ventana raz, es decir, TaskWindow, por ejemplo el nuevo ttulo de la ventana ser SISTEMA EXPERTO MEDICO EN NEUMOLOGA y se activa la opcin Maximized y luego seleccionar el botn Ok. Si se ejecuta nuevamente la aplicacin se vern los cambios tal como se muestra a continuacin.

Es de inters ahora el archivo TaskMenu.mnu, mediante el cual se puede modificar las opciones que por defecto implementa Visual Prolog. Entonces primero se hace doble click sobre el archivo TaskMenu.mnu y luego se eliminar todas las opciones menos File y dentro de esta opcin se eliminar todas las subopciones menos New y Exit. Luego el archivo TaskMenu.mnu debe quedar as:

Las opciones no eliminadas se renombrarn de la siguiente manera: File = Consulta, New = Nueva, Exit = Salir. La opcin Nueva deben de habilitarse ya que por defecto est deshabilitada (quitar el check en la opcin Disabled), entonces el archivo TaskMenu.mnu debe quedar as:

En este punto se debe ejecutar nuevamente la aplicacin mediante la opcin Build y luego Build con lo que se observa la advertencia que no es usado el predicado onHelpAbout. Esto significa que hay un cdigo asociado a las opciones eliminadas que est dems en el archivo TaskWindow.pro, de donde debemos eliminar a dicho cdigo. Para ir al archivo TaskWindow.pro, se hace doble click en el mensaje de advertencia.

El cdigo a eliminar es el siguiente:

class predicatesonHelpAbout:window::menuItemListener.clausesonHelpAbout(TaskWin,_MenuTag):-_AboutDialog=aboutDialog::display(TaskWin).

Luego en el mismo archivo, se debe modificar en el siguiente cdigo, el valor true por false, para as eliminar la opcin Window la que no se elimina en modo diseo. El cdigo a modificar es:

constantsmdiProperty:boolean=true.

el que debe quedar as:

constantsmdiProperty:boolean=false.

Tambin en el mismo archivo se recomienda modificar la aparicin de la ventana de mensajes cuando se ejecuta la aplicacin experta. Para lograr esto se debe modificar el siguiente cdigo:

predicatesonShow:window::showListener.clausesonShow(_,_CreationData):-_MessageForm=messageForm::display(This).

de la siguiente manera:

predicatesonShow:window::showListener.clausesonShow(_,_CreationData).%_MessageForm=messageForm::display(This).

Luego de grabar y cerrar lo necesario, al ejecutarse la aplicacin debera mostrarse la siguiente interfaz:

En este punto del desarrollo de la aplicacin, se trabajar formateando las opciones de la barra (men) de herramientas (Toolbar), para lo cual se abre haciendo doble click, el archivo ProjectToolbar.pro (se encuentra ubicado en la carpeta Toolbars del proyecto), y el cdigo que deber quedar por el momento, se muestra a continuacin:

implementprojectToolbaropencore,vpiDomains,vpiToolbar,resourceIdentifiersclausescreate(Parent):-StatusBar=statusBar::newApplicationWindow(),StatusCell=statusBarCell::new(StatusBar,0),StatusBar:cells:=[StatusCell],Toolbar=vpiToolbar::create(style,Parent,controlList),setStatusHandler(Toolbar,{(Text):-StatusCell:text:=Text}).%Thiscodeismaintainedautomatically,donotupdateitmanually.16:42:04-24.4.2013constantsstyle:vpiToolbar::style=tb_top().controlList:vpiToolbar::control_list=[tb_ctrl(id_file_new,pushb(),resId(idb_NewFileBitmap),"Nuevaconsulta;",1,1),vpiToolbar::separator,tb_ctrl(id_edit_cut,pushb(),resId(idb_CutBitmap),"Salir;",1,1)].%endofautomaticcodeendimplementprojectToolbar

La intencin del cdigo anterior es que el usuario pueda accesar a una nueva consulta y salir de la aplicacin tambin de los botones mostrados en la barra de herramientas del proyecto, es decir, ProjectToolbar, por lo que luego de grabar los cambios y cerrar las ventanas necesarias, al ejecutar la aplicacin se debe observar la siguiente interfaz:

Ahora, para terminar con el formateo del proyecto en funcin del botn opcin Salir del ProjectToolbar, se va a escribir el cdigo que permitir que cuando se seleccione el botn opcin en mencin, se pueda salir de la aplicacin. Para esto nos hacemos doble click sobre el archivo TaskWindow.win, luego abrimos la carpeta Menu, luego abrimos la carpeta ProjectToolbar y finalmente hacemos doble click sobre id_edit_cut, con lo que aparecer un cdigo del cual solo nos interesa el que se muestra a continuacin, ya que luego se modificar:

predicatesonEditCut:window::menuItemListener.clausesonEditCut(_Source,_MenuTag).

Finalmente el nuevo cdigo quedar as:

predicatesonEditCut:window::menuItemListener.clausesonEditCut(_Source,_MenuTag):-close().

Al ejecutar la aplicacin, sea al seleccionar la opcin Salir tanto del men principal o el botn opcin Salir del ProjectToolbar, se debe terminar la ejecucin de la aplicacin. Ahora para finalizar, como ya se mencion anteriormente, el formateo del proyecto en funcin de las opciones que presentar al usuario, debemos eliminar: la caja de cerrar, la caja de maximizar y la caja de minimizar la interfaz, para lo cual, hacemos click con el botn derecho sobre el archivo TaskWindow.win y luego seleccionamos la opcin Attributes con lo que en la interfaz que aparece desactivamos las casillas: CloseBox, MaximizeBox y MinimizeBox respectivamente.

Al ejecutar la aplicacin, la interfaz mostrada ser la siguiente:

El paso siguiente es enviar al usuario un mensaje que explique la finalidad de la aplicacin, pero este mensaje debe aparecer automticamente luego que se muestra la interfaz del punto anterior. Para esto haciendo click con el botn derecho sobre la carpeta SISTEMA EXPERTO MDICO EN NEUROLOGA, seleccione la opcin New in New Package y luego elija el objeto Dialog para luego escribir como nombre del Dialog: dlgmensaje y luego hacer click en el botn Create. El proceso grficamente se muestra a continuacin:

Debe eliminar todos los botones que aparecen menos Ok, el cual se renombrar con: Continuar y luego elija el objeto Static Text y en la propiedad Text escriba un mensaje explicando al usuario la finalidad del sistema experto. Finalmente cierra el dilogo creado y lo graba.

Como se dijo anteriormente el mensaje creado en el punto anterior debe aparecer automticamente, por lo que para esto hacemos doble click en TaskWindow.win, con lo que en la carpeta Window hacemos doble click en el evento OnShow y modificamos el siguiente cdigo:

predicatesonShow:window::showListener.clausesonShow(_,_CreationData).%_MessageForm=messageForm::display(This).

escribiendo el siguiente cdigo:

predicatesonShow:window::showListener.clausesonShow(_,_CreationData):-%_MessageForm=messageForm::display(This).postAction({:-_=dlgmensaje::display(This)}).

Al ejecutar la aplicacin, de aparecer algn mensaje de agregar las libreras necesarias, se hace click en el botn Add All para que finalmente aparezca automticamente el mensaje creado.

A continuacin se deber crear un dilogo dlgnombre (la propiedad Text de este objeto deber contener Solicitud de nombre al usuario), con el mismo procedimiento para crear dlgmensaje, el cual deber quedar sin ningn botn de ventana que trae por defecto el dilogo dlgnombre. Luego se debe colocar un botn de comando denominado Continuar cuyo nombre ser btncontinuar_ctl. ---

El objetivo de dlgnombre es que el usuario ingrese su nombre en una caja de texto y mientras no lo haga no se podr continuar. Entonces se debe considerar un objeto tipo Static Text para el mensaje de: Ingrese su nombre por favor. Debe haber tambin un Edit Control para ingresar el nombre del usuario, el Edit Control, se llamar ednombre_ctl. Ahora se debe crear un dilogo llamado dlgbienvenida, mediante el mismo procedimiento que para crear los dilogos anteriores (recordar haciendo click con el botn derecho sobre la carpeta MEDICO, seleccione la opcin New in New Package). En este dilogo debe mostrarse un mensaje de bienvenida al uso del sistema al usuario. Se debe tener en cuenta que en este dilogo debe capturarse el nombre del usuario ingresado en el dilogo anterior dlgnombre. Entonces ahora escribir el siguiente cdigo al programar el botn de comando: btncontinuar_ctl, en el dlgnombre.pro:predicatesonBtningresarClick:button::clickResponder.clausesonBtningresarClick(_Source)=button::defaultAction:-Contenido=ednombre_ctl:getText(),Contenido"",close(),_=dlgbienvenida::display(getParent(),ednombre_ctl:getText()),!.onBtningresarClick(_Source)=button::defaultAction:-vpiCommonDialogs::error("MensajedelSistema","Ingresesunombre").

En este punto se deber mediante las opciones Consulta y luego Nueva, llamar al dilogo dlgnombre y para esto, se hace doble click en el archivo TaskWindow.win de la carpeta TaskWindow, para luego de la interfaz que aparece seleccionar la carpeta Menu, TaskMenu, id_file y luego hacer doble click sobre id_file_new con lo que se deber completar el cdigo que aparece por defecto, con el siguiente:

predicatesonFileNew:window::menuItemListener.clausesonFileNew(_Source,_MenuTag):-_=dlgnombre::display(This).

Luego al ejecutar la aplicacin, de aparecer algn mensaje de agregar las libreras necesarias, se hace click en el botn Add All con lo que debera ejecutarse sin ningn problema hasta el punto desarrollado. Al ingresar el nombre de usuario, se debe displayar un dilogo llamado dlgbienvenida, en donde aparezca un mensaje de bienvenida con el nombre de usuario ingresado. En el archivo dlgbienvenida.cl, debe el cdigo quedar as:

/*****************************************************************************

Copyright(c)2014MyCompany

******************************************************************************/classdlgbienvenida:dlgbienvenidaopencore

predicatesdisplay:(windowParent,stringName)->dlgbienvenidaDlgbienvenida.

constructorsnew:(windowParent,stringName).

endclassdlgbienvenida En el dilogo dlgbienvenida, se coloca un StaticText_ctl, el que debe ser del tipo Fact Variable, con lo que ahora se llamar: staticText_ctl, quedando la propiedad Text en blanco. Finalmente debe quedar solo el botn ok_ctl, el cual se renombrar con la propiedad text, con el nombre Continuar.

En el archivo dlgbienvenida.pro, parte del cdigo a modificar debe quedar as:

clausesdisplay(Parent,Name)=Dialog:-Dialog=new(Parent,Name),Dialog:show().

factsname:string.

clausesnew(Parent,Name):-name:=Name,dialog::new(Parent),generatedInitialize(),staticText_ctl:setText(string::format("%,te doy la bienvenida, congustoteayudar.PresionaenContinuarporfavor.",name)).

Ahora se debe crear un dilogo en el que se realizar las consultas al experto artificial. Este dilogo se llama dlgconsulta al cul en la propiedad Text se deber escribir: Consultando al experto. Finalmente a este punto, en el dilogo creado, se cambiar la apariencia del botn Ok por Salir. En este dilogo dlgconsulta, se debern poner los siguientes controles con sus respectivas propiedades: Un Push Button, el que se denominar btndiagnosticar_ctl.

Un StaticText_ctl, para que recepcione el nombre del usuario ingresado anteriormente, el que debe ser del tipo Fact Variable, con lo que ahora se llamar: staticText_ctl, quedando la propiedad Text en blanco.

Un StaticText1_ctl, el que se denominar (en la propiedad Text) Sintomas a seleccionar.

Un StaticText2_ctl, el que se denominar (en la propiedad Text) Sintomas seleccionados.

Un List Box, el que se denominar lbdisponibles_ctl.

Un List Box, el que se denominar lbseleccionados_ctl.

Un StaticText3_ctl, el que se denominar (en la propiedad Text) Enfermedad diagnosticada.

Un Edit Control, denominado edenfermedad_ctl, poniendo en blanco la propiedad Text por el momento.

Un StaticText4_ctl, el que se denominar (en la propiedad Text) Tratamiento recomendado.

Un Edit Control, denominado edtratamiento_ctl, poniendo en blanco la propiedad Text por el momento.

Lo que ahora se debe hacer es que cuando se llame a dlgconsulta, automticamente los sntomas disponibles deben aparecer en lbdisponibles_ctl. Para esto en la pestaa Events de la caja de propiedades de dlgconsulta, se debe hacer doble click sobre el evento ShowListener, con lo que aparecer el siguiente cdigo:

predicatesonShow:window::showListener.clausesonShow(_Source,_Data).

El cdigo anterior se modificar quedando de la siguiente manera:

predicatesonShow:window::showListener.clausesonShow(_Source,_Data):-lbdisponibles_ctl:add("Sntoma_01"),lbdisponibles_ctl:add("Sntoma_02"),lbdisponibles_ctl:add("Sntoma_03"),lbdisponibles_ctl:add("Sntoma_04"),lbdisponibles_ctl:add("Sntoma_05").

Ahora la idea es que cuando el usuario seleccione (con doble click), un sntoma de lbdisponibles_ctl, este sea agregado a lbseleccionados_ctl, eliminndose automticamente del primer List Box y viceversa, es decir si el usuario desea eliminar un sntoma seleccionado de lbseleccionados_ctl, pues lo debe seleccionar con doble click y automticamente pasar nuevamente a formar parte de lbdisponibles_ctl. Para esto en la pestaa Events de la caja de propiedades de lbdisponibles_ctl, se hace doble click sobre el evento DoubleClickListener, con lo que aparecer el siguiente cdigo:

predicatesonLbdisponiblesDoubleClick:listBox::doubleClickListener.clausesonLbdisponiblesDoubleClick(_Source).

El cdigo anterior se modificar de la siguiente manera:

predicatesonLbdisponiblesDoubleClick:listBox::doubleClickListener.clausesonLbdisponiblesDoubleClick(_Source):-lbdisponibles_ctl:getAllSelected(E,I),E=[EE|_],I=[II|_],lbseleccionados_ctl:add(EE),lbdisponibles_ctl:delete(II),!.

onLbdisponiblesDoubleClick(_Source).

Ahora en la pestaa Events de la caja de propiedades de lbseleccionados_ctl, se hace doble click sobre el evento DoubleClickListener, con lo que aparecer el siguiente cdigo:

predicatesonLbseleccionadosDoubleClick:listBox::doubleClickListener.clausesonLbseleccionadosDoubleClick(_Source).

El cdigo anterior se modificar de la siguiente manera:

predicatesonLbseleccionadosDoubleClick:listBox::doubleClickListener.clausesonLbseleccionadosDoubleClick(_Source):-lbseleccionados_ctl:getAllSelected(E,I),E=[EE|_],I=[II|_],lbdisponibles_ctl:add(EE),lbseleccionados_ctl:delete(II),!.onLbseleccionadosDoubleClick(_Source).

Se debe ahora llamar desde el dilogo dlgbienvenida al dilogo dlgconsulta. Para esto, en el botn Continuar (es el botn ok_ctl) de dlgbienvenida, poner el siguiente cdigo:

predicatesonOkClick:button::clickResponder.

clausesonOkClick(_Source)=button::defaultAction:-close(),_=dlgconsulta::display(getParent(),name),!.

Ahora en el archivo dlgconsulta.cl, se debe escribir el siguiente cdigo:

/*****************************************************************************

Copyright(c)2014MyCompany

******************************************************************************/classdlgconsulta:dlgconsultaopencore

predicatesdisplay:(windowParent,stringName)->dlgconsultaDlgconsulta.

constructorsnew:(windowParent,stringName). endclassdlgconsulta

En el archivo dlgconsulta.pro, se debe escribir el siguiente cdigo:

clausesdisplay(Parent,Name)=Dialog:-Dialog=new(Parent,Name),Dialog:show().

factsnam:string.

clausesnew(Parent,Name):-nam:=Name,dialog::new(Parent),generatedInitialize(),staticText_ctl:setText(string::format("%,seleccionalosrequerimientosrequeridos.",nam)).

Finalmente se debe escribir el cdigo para el botn btndiagnosticar_ctl, para esto se hace doble click en el botn mencionado con lo que aparecer el siguiente cdigo:

predicatesonBtndiagnosticarClick:button::clickResponder.clausesonBtndiagnosticarClick(_Source)=button::defaultAction.

el que se modificar de la siguiente manera:

domainssintomas=string*.factsdiagnostico:(sintomas,string,string).clausesdiagnostico(["Sntoma_01","Sntoma_02","Sntoma_03"],"Enfermedad_01_02_03","Tratamiento_01_02_03").diagnostico(["Sntoma_04","Sntoma_05"],"Enfermedad_04_05","Tratamiento_04_05").

predicatesonBtndiagnosticarClick:button::clickResponder.clausesonBtndiagnosticarClick(_Source)=button::defaultAction:-edenfermedad_ctl:setText(""),edtratamiento_ctl:setText(""),S=lbseleccionados_ctl:getAll(),diagnostico(S,E,T),edenfermedad_ctl:setText(E),edtratamiento_ctl:setText(T),!.onBtndiagnosticarClick(_Source)=button::defaultAction:-edenfermedad_ctl:setText(""),edtratamiento_ctl:setText(""),vpiCommonDialogs::error("MensajedelSistema","Noexistenrespuestasparalossntomasseleccionados").

EJECUCIN DE LA APLICACIN EXPERTA EN MEDICINA

Figura 01: Pantalla con mensaje explicativo al usuario de la finalidad de la aplicacin experta.

Fuente: (Elaboracin propia, 2014)

Figura 02: Pantalla general de la aplicacin experta.

Fuente: (Elaboracin propia, 2014)

Figura 03: Pantalla con opcin y subopciones de la aplicacin experta.

Fuente: (Elaboracin propia, 2014)

Figura 04: Pantalla donde se solicita nombre al usuario de la aplicacin experta.

Fuente: (Elaboracin propia, 2014)

Figura 05: Pantalla de bienvenida al usuario de la aplicacin experta.

Fuente: (Elaboracin propia, 2014)

Figura 06: Pantalla de consultas de la aplicacin experta.

Fuente: (Elaboracin propia, 2014)

Figura 07: Pantalla de resultados de la aplicacin experta.

Fuente: (Elaboracin propia, 2014)

SITIOS WEB

Prolog Development Center (PDC). [Fecha de consulta: 15enero 2013]. Disponible en:http://www.visual-prolog.com/

Tenorio Cabrera Julio LuisPgina 13