Ver Mensaje Individual
  #1 (permalink)  
Antiguo 05/06/2014, 11:27
Avatar de NSD
NSD
Colaborador
 
Fecha de Ingreso: mayo-2012
Ubicación: Somewhere
Mensajes: 1.332
Antigüedad: 11 años, 11 meses
Puntos: 320
APORTE: Llamar a Prolog desde Php y tener un sistema experto en la web

Hola gente, actualmente me encuentro en la facultad desarrollando un proyecto para una materia en lenguaje Prolog el cual quiero utilizar desde php para permitir que los usuarios lo usen desde la web, encontre temas en este foro viejos y sin respuesta o con respuestas que ya no funcionan, asi que hago este post para compartir una breve demo de como se puede hacer esto. El proyecto en si es un juego de damas online en el cual el visitante de la web juega contra una IA Prolog que a su vez, esta jugando en simultaneo contra todos los visitantes.
Como el proyecto es basicamente de Prolog, aqui solo pondre lo relativo a PHP para no hacer off-topic.

Lo que viene a continuación es una explicación de mi escenario de trabajo, se podría hacer en otras plataformas supongo, pero asi es como lo tengo andando yo:

1) Requerimientos
1.a) Swi-Prolog instalado en una pc con Windows 7.
1.b) Wamp server con php 5.4 o superior.
1.c) PHP debe tener el safe_mode apagado, esto permitira llamar a programas que no se encuentran en la misma carpeta que el php que los llama. En el php.ini hay una directiva para esto que debe estar en Off pero aun asi puede que no funcione, para asegurarte debes agregar esto al final del httpd.conf y reiniciar el servidor:
Código Apache:
Ver original
  1. php_admin_flag safe_mode off
1.d) Debes tener agregada la carpeta de binarios de la instalacion de Prolog incorporada en el Path de Windows, por ejemplo en mi caso es: C:\Program Files\swipl\bin, si no sabes como hacer esto, aquí hay un tutorial paso a paso para Windows 7.
1.e) Dentro de la carpeta www del servidor, creare un directorio llamado "prolog" el cual por supuesto puede tener cualquier otro nombre, dentro de este directorio es donde trabajaremos.

2) El Prolog
Dentro de la carpeta del servidor creada anteriormente, vamos a tener un archvo llamado ejemplo.pl con un functor de prueba:
Código prolog:
Ver original
  1. test :- write( 'Prolog \nwas called \nfrom PHP \nsuccessfully.' ).

3) La prueba previa de la consola
3.a) Antes de meterte con el PHP por primera vez, debes realizar una prueba de la consola para asegurarte que todos los pasos previos los hisiste bien, sobre todo porque en caso de error, php no explota ni lanza errores/warning/notices ni nada, sigue como si nada pasara con lo cual puede ser muy desconcertante.
3.b) Abres la consola de Windows (Simbolo de sistema o cmd.exe) y alli te diriges a la carpeta de tu servidor escribiendo:
Código BAT:
Ver original
  1. cd C:\servidor\www\prolog
reemplazando por la ubicacion de donde esta instalado tu wampserver y el nombre de la carpeta que creaste anteriormente.
3.c) Ahora escribes en la consola el siguiente comando:
Código BAT:
Ver original
  1. swipl -s ejemplo.pl -g "test." -t halt.
3.d) Si todo esta bien, estaras viendo este mensaje:
Cita:
% C:/servidor/www/prolog/ejemplo.pl compiled 0.00 sec, 2 clauses
Prolog
was called
from PHP
successfully.
caso contrario, deberás revisar que los pasos previos esten correctos.

4) El PHP
4.a) Como punto de partida destacar que a mi no me funcionaron ninguna de las funciones de ejecucion de programas y cuando digo ninguna, me refiero a ninguna de las del manual, todas fallaban, o mejor dicho, "no hacian nada" porque fallar implica un error y PHP no arrojo ni un notice, en lugar de estas funciones, tube que recurrir a el operador de comillas invertidas razon por la cual previamente tuvimos que desactivar el safe_mode con tanto énfasis.
4.b) En la misma carpeta prolog del servidor, donde pusimos a ejemplo.pl vamos a crear un index.php con el siguiente contenido:
Código PHP:
Ver original
  1. <?php  
  2.   $output = `swipl -s ejemplo.pl -g "test." -t halt.`;
  3.   var_dump($output);
con lo cual deberiamos tener esta salida al ingresar por el navegador:
Cita:
string 'Prolog
was called
from PHP
successfully.' (length=43)
4.c) El envio de parametros a Prolog es muy simple, si se fijan en el comando que ejecutamos, tenemos esto "test." entre comillas, ahi dentro podemos escribir lo que queramos ya que esa una sentencia que se ejecuta en Prolog de forma directa, podemos pasar listas, variables, otros functores, lo que se quiera.
4.d) La recepcion de respuestas es en forma de texto, asi que debemos asegurarnos de que nuestro prolog retorne su respuesta en un formato que luego podamos desglosar con las funciones de string o expresiones regulares.

El proyecto se encuentra en desarrollo en el repositorio: PHP-Prolog-HTML5-Checkers-Game de GitHub.

Una demo del repositorio funcionando puede encontrarse en este lugar, localizado en un VPS gratuito cortesía de vps.me.

Se resolverán dudas y aceptaran criticas tanto en GitHub como en este tema.

Si te interesa estar al día con los nuevos desarrollos del proyecto o quieres participar en ellos, puedes seguir el proyecto en GitHub y comunicarte directamente con migo para obtener acceso al ftp del vps y hacer experimentos en linea.

Saludos.
__________________
Maratón de desafíos PHP Junio - Agosto 2015 en FDW | Reglamento - Desafios

Última edición por NSD; 12/11/2014 a las 17:02