2010-10-11 15 views
15

Attualmente ho la necessità di eseguire il codice prolog in un'applicazione che sto creando. Sono consapevole del fatto che Apple probabilmente non consentirebbe mai qualcosa di simile nell'App Store, ma neanche questa è l'intenzione. Questo è più un progetto privato che non arriverà mai all'App Store.Esecuzione del codice prolog su un iPhone

Scopo

In questo caso Prolog è usato per descrivere un oggetto (come ad esempio un telefono) e le sue proprietà. L'oggetto verrà disegnato con OpenGL usando le coordinate specificate nello script prolog. La ragione per usare il prologo è che ho bisogno della possibilità di interrogare il programma su alcune delle caratteristiche di questo oggetto, e il prologo lo facilita molto. In conclusione: ho "bisogno" di interrogare uno script prolog dalla mia app.

Possibili soluzioni

  • Embed un'implementazione già esistente scritto in C. Io sono sicuro se questo sarà anche il lavoro.
  • Eseguire il codice prolog su un'altra macchina e utilizzare la rete per interrogare il prologo.
  • Sembra che sia possibile eseguire una sorta di Ruby VM all'interno dell'app (shinycocos lo utilizza per quanto ne so), potrebbe essere utilizzato per eseguire una delle implementazioni di Ruby Prolog?
  • Trova qualche alternativa a Prolog. Questo ha bisogno di darmi alcune delle stesse possibilità che ottengo con il prologo.

Tristemente, google non mi dà quasi risultati, quindi ho la sensazione che potrei essere abbastanza solo in questo progetto. Se qualcuno avesse qualche esperienza o indizio, sarei molto grato.

+0

Ti dispiacerebbe condividere un link a una di quelle implementazioni di Prolog scritte in Ruby? –

+0

Non ho provato nessuno di loro da solo, ma una rapida ricerca su google mi ha dato questo risultato: http://eigenclass.org/hiki.rb?tiny+prolog+in+ruby – Bendik

+0

Ah, sì, grazie. Ho visto alcune implementazioni "minuscole prologhe" molto simili a quelle di molto tempo fa, ma non penso che possano essere confrontate con un sistema completo come SWI-Prolog, YAP, SICStus Prolog, ecc. –

risposta

4

Sei mesi più tardi, vorrei solo per fornire qualche informazione su questo. Ho finito per scrivere un server con un'interfaccia a prolog in Java, accettando chiamate prolog tramite TCP. Funziona quasi esattamente come l'interprete live prolog SWI-prolog (tra gli altri) fornisce, e per lo più funziona abbastanza bene. Tuttavia, è lontano da una soluzione ottimale, in quanto non è possibile chiamare le funzioni dall'interno del prolog. Si perde la possibilità di avere una comunicazione bidirezionale.

Se dovessi ricominciare tutto da capo, avrei certamente provato più difficile compilare una delle implementazioni C pure per iOS. Ho dato un rapido, ma la mia mancanza di esperienza mi ha impedito di rimuovere anche tutti gli errori che ho avuto. A giudicare dal fatto che non si può avere il prologo in esecuzione come processo in background su una versione non modificata di iOS, si dovrebbe fare una riscrittura importante. Per questo motivo, si potrebbe semplicemente scrivere una nuova implementazione (magari ispirata da alcuni dei più leggeri là fuori) da zero per ottenere la soluzione perfetta.

+0

Non capisco, perché Java entra nell'immagine? Con poche righe di codice potresti anche avere un server HTTP basato su SWI (vedi http://www.swi-prolog.org/pldoc/package/http.html) – Kaarel

+0

Perché non tutto il testo inviato tramite TCP viene analizzato dal prologo Avevo bisogno della capacità di controllare determinati comportamenti attraverso "comandi a livello di applicazione". Inoltre, mi sento molto più a mio agio a scrivere in Java, quindi l'interfaccia Java mi ha fornito un modo comodo di attenermi al noto senza troppi sovraccarichi. – Bendik

+0

FYI, puoi tranquillamente effettuare chiamate bi-direzionali tra Java e SWI-Prolog se usi JPL: http://www.swi-prolog.org/packages/jpl/ –

3

È possibile scaricare il codice sorgente SWI-Prolog's e compilarlo con XCODE per piattaforma iOS. Non l'ho mai fatto, ma è certamente tecnicamente possibile.

Una volta fatto, ci sono molti esempi su come eseguire il codice prolog da C/C++, quindi, sarete in grado di eseguire prolog da Objective-C.

+0

Ho dato un tentativo onesto, ma purtroppo le mie conoscenze su C, C++ e la compilazione senza IDE sono limitate, se non inesistenti. Alla fine ho implementato una soluzione di rete con socket e un server che fungeva da base di conoscenza. – Bendik

+0

Impressionante Bendik. Sono contento che hai risolto il tuo problema. –

6

Avendo affrontato difficoltà simili chiamando il codice di prologo, anche se in una situazione diversa, mi consiglia di controllare la libreria di castor C++. Ciò consente di scrivere codice paradigma logico in C++ nativo senza necessità di estendere il linguaggio a tutti. Poiché castor è una libreria di sola intestazione, è facile da compilare ovunque C++ sia disponibile.
Castor sito: http://www.mpprogramming.com/cpp/default.aspx

+0

Anche se sembra una buona soluzione, il mio supervisore non lo accetta. Abbiamo già una grande base di conoscenze in prolog e il porting impiegherebbe troppo tempo. – Bendik

+0

@Bendik Quanto è difficile analizzare il prologo? Se non è troppo difficile, potresti essere in grado di adottare un approccio di generazione del codice per generare automaticamente il relativo codice cast ++. – shuttle87

1

FYI, si può facilmente bidirezionale effettuare chiamate tra Java e SWI-Prolog se si utilizza JPL:

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

E 'inoltre completamente ri-concorrente, in modo è possibile creare un'istanza codice di prologo da java, che a sua volta istanzia il codice java ecc ...

Ho fatto questo per un certo numero di progetti commerciali alcuni anni fa quando mi fu chiesto di collegare un motore di ragionamento basato su Prolog a un sacco di codice Java.

Utilizza JNI (Java Native Interface), quindi è necessario fare attenzione a come si compila e si collega alla API nativa. Sebbene se lo compili adeguatamente per ogni piattaforma, puoi farlo funzionare su più piattaforme. L'ho fatto funzionare su OS-X, Windows, Linux & Solaris.

Problemi correlati