Foros del Web » Programando para Internet » PHP »

[SOLUCIONADO] APORTE: Llamar a Prolog desde Php y tener un sistema experto en la web

Estas en el tema de APORTE: Llamar a Prolog desde Php y tener un sistema experto en la web en el foro de PHP en Foros del 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 ...
  #1 (permalink)  
Antiguo 05/06/2014, 12:27
Avatar de NSD
NSD
Colaborador
 
Fecha de Ingreso: mayo-2012
Ubicación: Somewhere
Mensajes: 1.332
Antigüedad: 5 años, 6 meses
Puntos: 319
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
  #2 (permalink)  
Antiguo 05/06/2014, 14:27
Avatar de Italico76  
Fecha de Ingreso: abril-2007
Mensajes: 3.303
Antigüedad: 10 años, 7 meses
Puntos: 290
Respuesta: APORTE: Llamar a Prolog desde Php y tener un sistema experto en la web

Que bueno....

Te tomo la palabra de que subiras el juego de damas
__________________
Salu2!
  #3 (permalink)  
Antiguo 05/06/2014, 14:57
Avatar de hhs
hhs
 
Fecha de Ingreso: junio-2013
Ubicación: México
Mensajes: 2.844
Antigüedad: 4 años, 4 meses
Puntos: 338
Respuesta: APORTE: Llamar a Prolog desde Php y tener un sistema experto en la web

Es una pena que no exista extensión para swi prolog, se podrían hacer cosas muy interesantes.

Suerte con el proyecto NSD
__________________
Saludos
About me
Laraveles
A class should have only one reason to change.
  #4 (permalink)  
Antiguo 06/06/2014, 16:32
Avatar de haggenx  
Fecha de Ingreso: febrero-2007
Ubicación: México
Mensajes: 783
Antigüedad: 10 años, 9 meses
Puntos: 20
Respuesta: APORTE: Llamar a Prolog desde Php y tener un sistema experto en la web

buen aporte, yo he hecho lo mismo para programas en vb.net y así añadir funciones que no hay en php, pero, esto funcionaría en un servidor externo, por ejemplo www.midominio.com?
  #5 (permalink)  
Antiguo 06/06/2014, 18:32
Avatar de NSD
NSD
Colaborador
 
Fecha de Ingreso: mayo-2012
Ubicación: Somewhere
Mensajes: 1.332
Antigüedad: 5 años, 6 meses
Puntos: 319
Respuesta: APORTE: Llamar a Prolog desde Php y tener un sistema experto en la web

Italico76, hhs gracias por el apoyo

haggenx la respuesta es que si, pero necesitaras un servidor dedicado (VPS) ya que dudo mucho que una empresa de hosting te permita desactivar el safe_mode o acceder a la consola en un servidor compartido, mucho menos el instalar el swi-prolog.

No obstante, podrías usar un servicio gratuito como No-IP o DynDNS para direccionar un dominio a tu PC, es decir, montarte tu propio servidor web casero y permitir que los visitantes accedan a la pagina solo si tu tienes la Pc prendida y conectada a internet con el servidor encendido.

Si es algo que se haga con fines lucrativos y que requiere de estar online de forma permanente, es decir un Sistema Experto real, el VPS sera un requerimiento, pero si solo quieres probar para decir "Lo hice y me salio" hay alternativas.
__________________
Maratón de desafíos PHP Junio - Agosto 2015 en FDW | Reglamento - Desafios
  #6 (permalink)  
Antiguo 07/06/2014, 08:07
Avatar de haggenx  
Fecha de Ingreso: febrero-2007
Ubicación: México
Mensajes: 783
Antigüedad: 10 años, 9 meses
Puntos: 20
Respuesta: APORTE: Llamar a Prolog desde Php y tener un sistema experto en la web

entiendo, pues mis proyectos de este tipo son locales, de hecho con un servidor local con php y mysql me basta, pero tenía curiosidad por si se podía hacer de otra forma y aprovechar esta funcionalidad, gracias por la información
  #7 (permalink)  
Antiguo 12/11/2014, 12:15
 
Fecha de Ingreso: noviembre-2014
Mensajes: 1
Antigüedad: 3 años
Puntos: 0
Respuesta: APORTE: Llamar a Prolog desde Php y tener un sistema experto en la web

Hola, he intentado poner a funcionar el código que pusiste, pero a la hora de probar el php me manda como mensaje NULL, tengo php 5.5.11 y lo estoy probando con xampp. El ejemplo.pl si funciona desde la consola de comandos y arroja lo que debería, pero el php no sé que pueda ser.
Lo probé con el código así como está, y también agregandole ?> al final pero sigue arrojando el NULL.

Espero me puedan auxiliar.
Saludos
  #8 (permalink)  
Antiguo 12/11/2014, 17:08
Avatar de NSD
NSD
Colaborador
 
Fecha de Ingreso: mayo-2012
Ubicación: Somewhere
Mensajes: 1.332
Antigüedad: 5 años, 6 meses
Puntos: 319
Respuesta: APORTE: Llamar a Prolog desde Php y tener un sistema experto en la web

Hola @md0345, he actualizado el tema con el link al repositorio de GitHub del proyecto y una demo para que puedan jugar en linea y probar el código en funcionamiento.

El hecho de que retorne NULL probablemente este ligado a que no realizaste correctamente el paso 1.
Asegúrate de cambiar los valores en php.ini y agregar el flag en el archivo .htaccess.

En el VPS de prueba esta instalado Debian con Nginx, por lo que también es posible hacerlo funcionar en esta plataforma.
__________________
Maratón de desafíos PHP Junio - Agosto 2015 en FDW | Reglamento - Desafios
  #9 (permalink)  
Antiguo 25/05/2015, 01:26
 
Fecha de Ingreso: enero-2015
Mensajes: 4
Antigüedad: 2 años, 9 meses
Puntos: 0
Respuesta: APORTE: Llamar a Prolog desde Php y tener un sistema experto en la web

Hola, buenas noches me podrías decir por qué me sale NULL a la hora de probarlo en el navegador? Desde el cmd me sale tal cual indicas. Espero tu pronta respuesta, realmente me urge. Gracias
  #10 (permalink)  
Antiguo 25/05/2015, 12:47
Avatar de NSD
NSD
Colaborador
 
Fecha de Ingreso: mayo-2012
Ubicación: Somewhere
Mensajes: 1.332
Antigüedad: 5 años, 6 meses
Puntos: 319
Respuesta: APORTE: Llamar a Prolog desde Php y tener un sistema experto en la web

Hola, pueden pasar varias cosas, por ejemplo la primera que no se encuentre el archivo, podrías tener un index.php así:
Código PHP:
Ver original
  1. <?php  
  2.   if(!file_exists("ejemplo.pl")) die("No se puede localizar el archivo ejemplo.pl, el directorio actual es: ".__DIR__);
  3.   $output = `swipl -s ejemplo.pl -g "test." -t halt.`;
  4.   var_dump($output);

Para saber si ese es el caso.

Otra posibilidad es que no tengas los permisos necesarios para ejecutar comandos en la consola, eso lo puedes verificar haciendo:
Código PHP:
Ver original
  1. <?php  
  2.   if(!file_exists("ejemplo.pl")) die("No se puede localizar el archivo ejemplo.pl, el directorio actual es: ".__DIR__);
  3.   $echo  = `echo anda.`;
  4.   echo "La consola ".($echo ? $echo : "NO anda");
  5.   $output = `swipl -s ejemplo.pl -g "test." -t halt.`;
  6.   var_dump($output);

Hay otras variantes posibles, pero prueba esas que son las mas comunes.
__________________
Maratón de desafíos PHP Junio - Agosto 2015 en FDW | Reglamento - Desafios
  #11 (permalink)  
Antiguo 19/07/2017, 15:07
Avatar de NSD
NSD
Colaborador
 
Fecha de Ingreso: mayo-2012
Ubicación: Somewhere
Mensajes: 1.332
Antigüedad: 5 años, 6 meses
Puntos: 319
Respuesta: APORTE: Llamar a Prolog desde Php y tener un sistema experto en la web

Bueno, como me siguen llegando consultas recurrentes por este tema y todas son del estilo "No me anda! No puedo instalarlo!", hice un vídeo donde explico todo el proceso desde cero: https://www.youtube.com/watch?v=3sUj523cfPE
__________________
Maratón de desafíos PHP Junio - Agosto 2015 en FDW | Reglamento - Desafios



La zona horaria es GMT -6. Ahora son las 02:54.