Extendiendo NetLogo con Prolog

A first version of NetPrologo is available to download. Also this blog won’t be updated anymore. The new website for NetPrologo were you will find all informations and resources about the extension is: http://www.cs.us.es/~fsancho/NetProLogo/

Current version is working, but not totally functional, thus is not public yet. Also there is no user manual yet.I found in the last weeks that many people are reading this blog, so if you are interested in using this netlogo extension, i won’t have any problem in sending it to anyone, just contact me. Just recall that it has been done using a GNU-Prolog library, therefore netprologo won’t support most of SWI-Prolog code.

So if you have any question just write me: jgalanpae  at   gmail   dot    com

La idea de netprologo, es combinar los aspectos fuertes de NetLogo (Gráficos) y Prolog (Computación). Ya que realizar ambas tareas usando solo uno de los dos, es costoso, y los resultados peores. A continuación se presenta un ejemplo de esto: Colorear los nodos de un grafo, de forma que dos nodos adyacentes no tengan el mismo color. En este caso usamos por un lado la potencia para crear y representar el grafo de NetLogo y la potencia y sencillez de Prolog para calcular la combinación de colores adecuada. El algoritmo Prolog tiene 5 líneas y menos de 200 caracteres (cabe en un SMS!!!!).

Algo que podría ser costoso de implementar en NetLogo, lo podemos obtener de Prolog mediante una simple llamada:

  •  netprologo:run-first-text interpreter “findall(N, vertex(N), LN),findall(C, color(C), LC),vertexColoring(LN,LC,[],R)

 

Yo pensaba que no, pero parece ser que hay ligeras diferencias de sintaxis entre GNU-Prolog y SWI-Prolog. En general las cosas básicas son comunes en ambos Prolog, pero por ejemplo me he encontrado con que la negación not/1 no existe en GNU-Prolog, donde se hace la negación con \+/1. Por otro lado, los predefinidos que incluyen uno y otro son distintos. Otra diferencia es que en GNU-Prolog hay que indicar con la directiva discontiguous cuando los elementos de una definición no son continuos. Estas diferencias hacen que muchas de las librerías de SWI-Prolog no sean compatibles con GNU-Prolog, pero este último tiene disponibles algunas librerías propias.

Por todo esto, si se quiere usar la extensión netprologo con algún fichero Prolog generado en SWI-Prolog, recomiendo primero verificar que compila y ejecuta correctamente  en GNU-Prolog, ya que la depuración de errores desde netprologo puede ser bastante pesada. OJO pequeños fallos que en GNU-Prolog son solo Warnings, en netprologo pueden ser Errores, no todos pero si me ha pasado en algún caso.

Como tarea pendiente, queda la de buscar librerías compatibles con GNU-Prolog, y probarlas en netprologo.

Al parecer hice bien en elegir la librería GPJ para este proyecto, a pesar de que esté en desarrollo y no esté bien acabada. GPJ es funcionalmente completa, aunque ciertas cosas como el manejo de errores podrían estar mejor. El principal problema es la documentación, es realmente complicado meterse en profundidad en la librería, y ha llevado mucho tiempo manejarla.

Por el contrario, JLP ofrece un acabado muy fino, y un manejo más sencillo de la librería, además de una documentación para la API y un manual muy completos. En poco tiempo he sido capaz de echarla a andar. Tiene muy buena pinta, aunque al estar tirando de SWI-Prolog, no creo que funcione bien cuando múltiples agentes empiecen a abrir muchas conexiones simultáneas en paralelo, que es la idea de esta extensión.

Dentro de la extensión desarrollada, están implementadas las primitivas para interactuar con SWI-Prolog desde NetLogo, aunque están deshabilitadas, ya que no ha sido posible hacerlo funcionar. Pero ahí están para cuando se resuelvan los problemas de conexión:

  • <Boolean> netprologo:run-query-jpl <llamada Prolog>
  • <Boolean> netprologo:run-next-jpl <>
  • <List/String/Number> netprologo:dereference-var-jpl <nombreVar>

Pruebas realizadas en máquina con Windows de 64-bits:

  • Usando la instalación de SWI-Prolog de 64-bits, jre y jdk de 64-bits: EXITO desde Java. Falla al usarlo en NetLogo ya que no hay versión de 64-bits, y NetLogo usa el jre de 32-bits.
  • Usando la instalación de SWI-Prolog de 32-bits, jre y jdk de 32-bits: FRACASO desde Java y por tanto desde NetLogo. El problema está en la configuración del entorno de ejecución de SWI-Prolog. Creo que el problema está en el PATH-HOME, aunque supuestamente las variables de entorno del sistema las he configurado correctamente. Con el entorno de 64-bits funcionaba.

Pruebas realizadas en máquina con Windows de 32-bits:

  • Usando la instalación de SWI-Prolog de 32-bits, jre y jdk de 32-bits: FRACASO desde Java y por tanto desde NetLogo. Pensaba que al usar una maquina de 32-bits y el entorno de 32-bits funcionaría, igual que lo hizo el entorno de 64-bits en la máquina de 64-bits, pero NO. Ocurre lo mismo que en la prueba anterior, con el entorno de 32-bits.

Parece que el problema, es que aunque las variables de entorno estén correctamente introducidas, no es capaz de localizar los componentes necesarios. Buscando en foros he leído cosas sobre como configurar “programáticamente” el entorno, dentro de la api JPL, pero esto no era trivial, y no he tenido tiempo de realizar más pruebas.

Pero bueno como GPJ funciona correctamente, de momento no corre prisa. Los únicos problemas que he tenido con GPJ es que la pila se desborda antes que en SWI-Prolog.

Nube de etiquetas

Seguir

Recibe cada nueva publicación en tu buzón de correo electrónico.