2010-10-11 10 views
15

Actualmente tengo la necesidad de ejecutar el código de prólogo en una aplicación que estoy haciendo. Soy consciente de que Apple probablemente nunca permitiría algo como esto en la App Store, pero esa tampoco es la intención. Este es más un proyecto privado que nunca llegará a la App Store.Ejecutando el código de prólogo en un iPhone

Propósito

En este caso prólogo se usa para describir un objeto (como por ejemplo un teléfono) y sus propiedades. El objeto se dibujará con OpenGL utilizando las coordenadas especificadas en el script de prólogo. El motivo para usar Prolog es que necesito consultar el programa sobre algunas de las funciones que tiene este objeto, y el prólogo lo facilita mucho. En pocas palabras: "necesito" consultar una secuencia de comandos de prólogo desde mi aplicación.

soluciones posibles

  • Insertar una aplicación ya existente escrito en C. No estoy seguro de si esto va a trabajar incluso.
  • Ejecute el código de prólogo en otra máquina y use la red para consultar Prolog.
  • Parece que es posible ejecutar Ruby VM dentro de la aplicación (shinycocos usa esto por lo que yo entiendo), ¿podría usarse para ejecutar una de las implementaciones de Ruby Prolog?
  • Encuentra alguna alternativa a Prolog. Esto necesita darme algunas de las mismas posibilidades que obtengo con Prolog.

Lamentablemente, google me da casi ningún resultado, así que tengo la sensación de que podría estar completamente solo en este proyecto. Si alguien tiene alguna experiencia o pista, estaría muy agradecido.

+0

¿Te importaría compartir un enlace a una de esas implementaciones de Prolog que funcionan escritas en Ruby? –

+0

No probé ninguno de ellos, pero una búsqueda rápida en google me dio este resultado: http://eigenclass.org/hiki.rb?tiny+prolog+in+ruby – Bendik

+0

Ah, sí, gracias. Vi algunas implementaciones de "pequeños prólogos" muy similares a las de hace mucho tiempo, pero no creo que se puedan comparar con un sistema en toda regla, como SWI-Prolog, YAP, SICStus Prolog, etc. –

Respuesta

4

Medio año más tarde, me gustaría brindar alguna información al respecto. Terminé escribiendo un servidor con una interfaz para prolog en Java, aceptando llamadas de prólogo a través de TCP. Funciona casi exactamente como el intérprete de prólogo en vivo que proporciona SWI-prolog (entre otros), y en su mayoría funciona bastante bien. Sin embargo, está lejos de ser una solución óptima, ya que no puede llamar funciones desde dentro de prolog. Pierdes la posibilidad de tener comunicación bidireccional.

Si comenzara de nuevo, sin duda habría intentado más difícil compilar una de las implementaciones de C puro para iOS. Lo di rápido, pero mi falta de experiencia me impidió incluso eliminar todos los errores que obtuve. A juzgar por el hecho de que no se puede ejecutar un prólogo como proceso en segundo plano en una versión no modificada de iOS, se debería hacer una reescritura importante. Debido a esto, uno puede tener que escribir desde cero una nueva implementación (quizás inspirada en algunas de las más livianas) para obtener la solución perfecta.

+0

No lo entiendo, ¿por qué Java introduce la imagen? Con algunas líneas de código, también podría tener un servidor HTTP basado en SWI (consulte http://www.swi-prolog.org/pldoc/package/http.html) – Kaarel

+0

Porque no se analiza todo el texto enviado a través de TCP. por prólogo Necesitaba la capacidad de controlar cierto comportamiento a través de "comandos de nivel de aplicación". Además, me siento mucho más cómodo escribiendo en Java, por lo que la interfaz de Java me proporcionó una forma cómoda de apegarse a lo conocido sin demasiada sobrecarga. – Bendik

+0

Para su información, puede realizar fácilmente llamadas bidireccionales entre Java y SWI-Prolog si utiliza JPL: http://www.swi-prolog.org/packages/jpl/ –

3

Puede descargar el código fuente SWI-Prolog's y compilarlo con XCODE para la plataforma iOS. Nunca he hecho eso, pero desde luego es técnicamente posible.

Una vez hecho esto, hay muchos ejemplos sobre cómo ejecutar el código de prólogo desde C/C++, por lo tanto, podrá ejecutar el prólogo desde Objective-C.

+0

Lo probé de verdad, pero lamentablemente mi conocimiento sobre C, C++ y compilación sin IDE es limitado, sino inexistente. Terminé implementando una solución de red con sockets y un servidor que actúa como una base de conocimiento en su lugar. – Bendik

+0

Awesome Bendik. Me alegra que hayas resuelto tu problema. –

6

Al haber tenido dificultades similares para llamar al código de prólogo, aunque en una situación diferente, recomiendo consultar la biblioteca de castor C++. Esto le permite escribir código de paradigma lógico en C++ nativo sin necesidad de extender el lenguaje en absoluto. Como Castor es una biblioteca de solo encabezado, es fácil de compilar donde C++ esté disponible.
Sitio web de Castor: http://www.mpprogramming.com/cpp/default.aspx

+0

Aunque suena como una buena solución, mi supervisor lamentablemente no lo aceptó. Ya tenemos una gran base de conocimiento en prolog, y portarlo llevaría demasiado tiempo. – Bendik

+0

@Bendik ¿Qué tan difícil es prolog para analizar? Si no es demasiado difícil, puede utilizar un enfoque de generación de código para generar automáticamente el código de castor C++ relevante. – shuttle87

1

FYI, puede muy fácilmente bidireccionalmente hacer llamadas entre Java y SWI-Prolog si utiliza el JPL:

http://www.swi-prolog.org/packages/jpl/

Es también totalmente re-entrante, por lo que puede crear una instancia de código de prólogo de java, que a su vez ejemplifica el código java, etc ...

Hace algunos años hice esto para una serie de proyectos comerciales cuando tuve que conectar un motor de razonamiento basado en Prolog a una gran cantidad de código Java.

Utiliza JNI (la interfaz nativa de Java), por lo que debe tener cuidado con la compilación y el enlace a la API nativa. Sin embargo, si lo compila adecuadamente para cada plataforma, puede hacer que funcione en varias plataformas. Lo tenía trabajando en OS-X, Windows, Linux & Solaris.

Cuestiones relacionadas