Integrar Java con CLIPS.docx

John Carlos Arrieta Arrieta – Universidad de Cartagena Instructivo para integrar CLIPS con Java usando CLIPSJNI INTEGRA

Views 133 Downloads 0 File size 759KB

Report DMCA / Copyright

DOWNLOAD FILE

Recommend stories

Citation preview

John Carlos Arrieta Arrieta – Universidad de Cartagena Instructivo para integrar CLIPS con Java usando CLIPSJNI

INTEGRAR JAVA CON CLIPS (POR JOHN CARLOS ARRIETA ARRIETA) INTRODUCCIÓN: Este breve instructivo tiene como propósito enseñar los pasos necesarios para poder integrar el dos lenguajes de programación Java, de uso multifuncional y CLIPS especializado para desarrollar y ejecutar Sistemas Expertos. Este instructivo no pretende ser un manual de programación en Java o CLIPS, puesto que solo se limita explicar los pasos para poder integrar estos dos lenguajes de programación ejemplificando el proceso mediante el desarrollo de una aplicación muy simple, de tal manera que podamos tener el conocimiento que nos permita dar mayores prestaciones de usabilidad y portabilidad a cualquier aplicación tipo Sistema Experto que en el futuro deseemos construir.

HERRAMIENTAS: PC con Sistema Operativo Windows XP o superior, preferiblemente en 64bits JDK (Herramientas de Desarrollo Java) versión 1.5 o superior. Descargar: http://www.oracle.com/technetwork/es/java/javase/downloads/index.html CLIPS: Sistema de Producción Integrado en Lenguaje C) Descargar: http://clipsrules.sourceforge.net/ IDE Netbeans Versión 6 o superior. Descarga: https://netbeans.org/ Descarga Alternativa: http://www.oracle.com/technetwork/es/java/javase/downloads/index.html IDE Eclipse Versión 3.5 Elios o superior Descarga: https://www.eclipse.org/

PROCEDIMIENTO: Nota: Las imágenes de recortes sobre Páginas Web y Ventanas de las Aplicaciones mencionadas en este instructivo corresponden a las que estaban disponibles en la fecha de creación de este documento, 19/09/2014. Descargar e instalar el CLIPS: Descargar la vieron para Windows, para ellos sugiero seguir los siguientes pasos:

John Carlos Arrieta Arrieta – Universidad de Cartagena Instructivo para integrar CLIPS con Java usando CLIPSJNI

Recorte tomado de: http://clipsrules.sourceforge.net/

Recorte tomado de http://clipsrules.sourceforge.net/Version63Beta.html

Recorte tomado de http://sourceforge.net/projects/clipsrules/files/CLIPS/6.30/

John Carlos Arrieta Arrieta – Universidad de Cartagena Instructivo para integrar CLIPS con Java usando CLIPSJNI

Ejecutar e iniciar la instalación siguiendo los pasos del asistente presentados por el programa de instalación, los cuales se resumen en aceptar la licencia y pulsar el botón siguiente hasta que termine el proceso.

Recorte tomado del Menú Inicio de Windows 7 Si la instalación fue correcta, en el menú inicio de Windows podremos encontrar los accesos directos a la herramienta CLIPS, sugiero seleccionar la opción CLIPSWin para que nos muestre un entorno simple de trabajo basado en ventanas y no en consola de D.O.S.

Recorte tomado de CLIPSWin en ejecución. CLIPS Win es un entorno básico que provee un editor de texto sobre el cual podemos escribir nuestra Base de Conocimientos basada en Hechos, Clases y Reglas. En este entorno podemos editar, cargar, ejecutar y probar las bases de conocimiento de los sistemas Expertos que pensemos construir [1]. Una vez diseñada y probada nuestra base de conocimientos, procedemos a recuperar el

John Carlos Arrieta Arrieta – Universidad de Cartagena Instructivo para integrar CLIPS con Java usando CLIPSJNI

archivo con extensión .clp donde esta almacenada dicha Base de conocimientos, hasta este punto ya no es necesario tener instalado o ejecutado el entorno de desarrollo CLIPS. El siguiente paso es proceder a descargar los siguientes archivos: CLIPSJNI_0.3.zip

Recorte tomado de: http://sourceforge.net/projects/clipsrules/files/CLIPS/6.30/ El cual debemos descomprimir y recuperar en otra carpeta cualquiera los archivos CLIPSJNI.jar y CLIPSJNI.dll, para el case de los PC con MacOS, se debe recuperar también el archivo libCLIPSJNI.jnilib, el caso de los PC con GNU/Linux es necesario CLIPSJNI.jar y la carpeta library-src, esta última carpeta se debe recompilar con algún compilador de C para obtener el archivo libCLIPSJNI.so, el cual es el equivalente a que es el CLIPSJNI.dll para Windows o libCLIPSJNI.jnilib para MacOS.

El próximo paso es descargar el JDK y un IDE (Entorno de Desarrollo Integrado) para Java, por ejemplo NetBeans o Eclipse:

John Carlos Arrieta Arrieta – Universidad de Cartagena Instructivo para integrar CLIPS con Java usando CLIPSJNI

O

Recorte tomado de: http://www.oracle.com/technetwork/es/java/javase/downloads/index.html Para el caso de NetBeans en el mismo sitio de descarga del JDK está disponible un instalador de JDK que trae incluido el IDE Netbeans en su última versión estable, pero si ya tienen el JDK o desean otra versión disponible del IDE por ejemplo en español, esta se puede descargar desde su sitio web oficial.

Según nuestras necesidades de desarrollo podemos escoger una distribución especifica. Recorte tomado de https://netbeans.org/downloads/

John Carlos Arrieta Arrieta – Universidad de Cartagena Instructivo para integrar CLIPS con Java usando CLIPSJNI

Para el caso de eclipse, en su sitio web oficial existen igualmente varias opciones descarga según nuestras necesidades:

Recorte tomado de https://www.eclipse.org/downloads/

El proceso de instalación requeriré tener instalado el JDK [2] luego ambos solo hay que descargar una distribución con asistente de instalación para cada IDE, aceptar las términos de licencia (ambos Software Libre), seguir los pasos del asistente y listo de Netbeans [3] o los de Eclipse [4]. A continuación procedemos a crear un proyecto nuevo tipo aplicación Java en cualquiera Netbeans[5] o Eclipse[6]. Una vez creado el proyecto, debemos incluir copiar en la carpeta principal (raiz) del proyecto los archivos CLIPSJNI.jar y CLIPSJNI.dll. Para ello usando Netbeans nos colocamos en el panel de archivos, damos clic derecho sobre la carpeta raíz del proyecto y pegamos los archivos previamente copiados desde la carpeta donde descomprimimos el archivo CLIPSJNI.zip, igual se hace con Eclipse.

John Carlos Arrieta Arrieta – Universidad de Cartagena Instructivo para integrar CLIPS con Java usando CLIPSJNI

El mismo proceso debemos hacerlo sobre el archivo que contiene nuestra base de conocimientos, en nuestro ejemplo este archivo se llama diagnosticoautomovil.clp, recuerden que para garantizar que la Base de Conocimientos esta bien construida debemos editarla, depurarla, ejecutarla y probarla con el entorno CLIPSDOS.exe o CLIPSWin.exe instalado y presentado anteriormente

Por último, debemos agregar la biblioteca del proyecto el archivo CLIPSJNI.jar, el cual contiene las clases Java/CLIPS, quienes son las que verdaderamente nos permiten interactuar con CLIPS, dialogando con la base de conocimiento, el motor de inferencia, generando entradas y salidas desde Java. Para logar esta operación usando Nebeans debemos colocarnos en el panel de Proyectos, hacer clic derecho sobre el ítem Bibliotecas y escoger la opción Agregar archivo JAR/Carpeta

Seguidamente debemos entrar buscar el archivo CLIPSJNI.jar ubicado en el proyecto y pulsar Abrir.

John Carlos Arrieta Arrieta – Universidad de Cartagena Instructivo para integrar CLIPS con Java usando CLIPSJNI

Completado estos pasos la estructura del proyecto en Netbeans debe quedar parecida a la siguiente imagen:

Posibles problemas: 1. Si durante la ejecución de la aplicación presenta algún probar las siguientes posibles soluciones:  Si su S.O es de 32bit copiar el archivo CLIPSJNI.dll en C:\windows\system32  Si su S.O es de 64bit copiar el archivo CLIPSJNI.dll en C:\Windows\SysWOW64  Para S.O GNU/Linux: copiar libCLIPSJNI.so en /usr/lib/  Para S.O MacOSX: copiar libCLIPSJNI.jnilib en /usr/lib/java/ 2. Una vez creado el paquete de distribución de la aplicación, es decir la carpeta dist con su subcarpeta lib y su archivo.jar, se deben colocar los archivos CLIPSJNI.dll y la base de conocimientos.clp junto al archivo

John Carlos Arrieta Arrieta – Universidad de Cartagena Instructivo para integrar CLIPS con Java usando CLIPSJNI

ejecutable.jar de la aplicación y dentro de la subcarpeta lib debe estar el archivo CLIPSJNI.jar:

Esto se hace, ya que aunque el CLIPSJNI.jar contiene clases Java compiladas para multiplataformidad, por ende JDNI (arquitectura java que le permite combinarse con código nativo compilado de forma nativa en otros lenguajes con C, CLIPS, etc) necesita los binarios nativos para poder ejecutarse. Dichos binario Java los busca primero en el directorio actual de ejecución de la aplicación, si no los encuentra entonces pasa a buscarlo en directorio de bibliotecas binarias nativas del sistema, información que se puede consultar mediante System.out.println(System.getProperty("java.library.path")); en código Java.

Utilización de las clases que se encuentran dentro de la biblioteca CLIPSJNI,jar: Para interactuar con la base de conocimientos y la máquina de inferencia de clips, CLIPSJNI proporciona un conjunto de clases entre las que se encuentran envueltas en un único paquete llamado CLIPSJNI, las más importantes son;

John Carlos Arrieta Arrieta – Universidad de Cartagena Instructivo para integrar CLIPS con Java usando CLIPSJNI

Environment (Crea una especie de entorno de trabajo entre CLIPS y Java), el uso más común de esta clase puede ser por ejemplo: import CLIPSJNI.*; // …

Environment clips = new Environment(); clips.load("ejemplo.clp"); clips.build("(defrule prueba (ejemplo ?x)=>(assert (auch ?x))) "); clips.eval("(+ 3 4)"); clips.reset(); clips.assertString("(ejemplo acertado)"); clips.run(); clips.clear(); clips.destroy();

//… Como verán existen métodos con los mismos nombres de comandos CLIPS como son load, assert, eval, build, reset, run, clear, entro otros, los cuales realizan una operación equivalente a su respectivo omologo en CLIPS, por ejemplo. clips.load("ejemplo.clp"); Carga la Base de Conocimientos en la Memoria de trabajo CLIPS, esta BC se encuentra en un archivo llamado ejemplo.clp, que como lo vimos anteriormente debe estar ubicado en el mismo sitio donde se encuentra la CLIPSJNI.dll. clips.build("(defrule prueba (ejemplo ?x)=>(assert (auch ?x)))"); Ingresa estructuras de construcción en la BC, en este ejemplo se ingresa una regla llamada prueba cuyo antecedente es un Patron que espera el valor de una variable, si el Patron concuerda con algún hecho afirmado en la BD entonces se ejecuta el consecuente, que en este caso afirma otro hecho que toma como valor el contenido de la variable. clips.eval("(+ 3 4)");

John Carlos Arrieta Arrieta – Universidad de Cartagena Instructivo para integrar CLIPS con Java usando CLIPSJNI

Evalúa la ejecución de alguna consulta o comando sobre la BD o la Maquina de inferencia, en este caso evaluamos la suma de dos constantes literales enteras, este método retorna una instancia de la clase PrimitiveValue, la cual tiene métodos para obtener el resultado devuelto por la máquina de inferencia. clips.reset(); Reinicia la Memoria de Trabajo a los valores por defecto (hechos iníciales) clips.run(); Ejecuta las primeras reglas disponibles en la Memoria de Trabajo Métodos de la clase Environment

John Carlos Arrieta Arrieta – Universidad de Cartagena Instructivo para integrar CLIPS con Java usando CLIPSJNI

La clase PrimitiveValue Permite consultar el estado de los hechos y el valor de sus slots (campos o casillas), cada slot es tratado e si mismo como una instancia de PrimitiveValue. Para recuperar los hechos o sus slots se puede hacer de dos formas: Invocando el método assert(String hecho) mediante una instancia de Environment, recordemos que este comando agrega o afirma un hecho en la BC, este método retorna una referencia ( o puntero en C) hacia el hecho agregado a la BD, referencia representado por una clase java llamada FactAddressValue, hija de la clase abstracta PrimitiveValue Invocando el método eval(String instrucción), igualmente usando una instancia de Environment. Este método evalúa la ejecución de una instrucción en lenguaje CLIPS sobre la BC o la Maquina de inferencia, generalmente se invoca mediante el uso de comandos para consultar hechos como por ejemplo find-fact o find-all-facts.

Métodos de la clase PrimitiveValue

John Carlos Arrieta Arrieta – Universidad de Cartagena Instructivo para integrar CLIPS con Java usando CLIPSJNI

Otra forma de hacerlo es: String comandoCLIPS = "(find-all-facts ((?f state-list)) TRUE)"; PrimitiveValue slot = clips.eval(comandoCLIPS); slot = slot.get(0); slot = slot.getFactSlot("current"); Sting valorSlot = slot.toString(); Y en una sola línea siria: PrimitiveValue slot = clips.eval(comandoCLIPS).slot.get(0). getFactSlot("current").slot.toString();

Una vez se tenga la instancia del hecho ya sea mediante una llamada al método assert o al método eval, se puede conocer el valor de sus slot igualmente de dos maneras: Forma A: FactAddressValue punteroSlot = clips.assert(“(auto(placa kkc))”); PrimitiveValue slot = clips.getFactSlot(punteroSlot, “placa”) ; Forma B: PrimitiveValue slot = punteroSlot.getFactSlot(“placa”) ;

Para poder obtener el valor de una forma más simple desde java, se puede utilizar un método por cada tipo de dato Java:

FactAddressValue punteroSlot = clips.assert(“(llantas 4)”); PrimitiveValue slot = clips.getFactSlot(punteroSlot, “llantas”) ; int cantidadLlantas = slot.intValue(“llantas”);

Los métodos son:  

intValue stringValue

John Carlos Arrieta Arrieta – Universidad de Cartagena Instructivo para integrar CLIPS con Java usando CLIPSJNI

  

    



floatValu integerValue instanceValue, instanceAddressValue multifieldValue primitiveValue stringValue symbolValue voidValue

El uso de cada método se debe hacer si el tipo de dato del slot es compatible con el tipo de datos java, si este dato se desconoce, entonces todos los valores sin importar su tipo se pueden recuperar con stringValue. En caso de que la consulta retorne más de un hecho o el hecho tenga más de un slot, se puede utilizar el método size() de la instancia de PrimitiveValue, quien retorna el numero de slot que tiene el hecho devuelto por la consulta. Para obtener uno de los slot se utiliza el método get(int pos), quien retorna una instancia de PrimitiveValue que hace referencia al slot en la posición indicada por el parámetro pos.

BIBLIOGRAFIA [1] SISTEMAS DE GESTION INTELIGENTES - MANUAL DE CLIPS http://elvex.ugr.es/decsai/intelligent/workbook/ai/CLIPS.pdf [2] INSTALACION DEL JDK http://www.luiskano.net/blog/2010/04/28/tutorial-instalar-java-jdk-en-windows-7/ [3] Instalación del IDE Netbeans https://netbeans.org/community/releases/80/install.html [4] Instalación del IDE Eclipse http://jarroba.com/instalar-bien-eclipse-un-ide-de-muchos/ [5] Tutorial de Netbenas (Inicio) http://panamahitek.com/como-crear-nuestro-primer-programa-en-java-connetbeans/ [6] Tutorial de Eclipse http://www.tutorialspoint.com/eclipse/eclipse_create_java_project.htm