2010-10-11 17 views
15

Obecnie potrzebuję wykonać kod prologu w aplikacji, którą robię. Jestem świadomy, że Apple prawdopodobnie nigdy nie pozwoliłoby na coś takiego w App Store, ale to też nie jest intencja. To jest bardziej prywatny projekt, który nigdy nie dotrze do sklepu App Store.Wykonywanie kodu prologu na iPhonie

Cel

W tym przypadku prologu jest stosowany do opisania obiektu (jak na przykład telefonu) a jego właściwości. Obiekt zostanie narysowany za pomocą OpenGL przy użyciu współrzędnych określonych w skrypcie prolog. Powodem używania prologa jest to, że potrzebuję możliwości zapytania programu o niektóre funkcje tego obiektu, a prolog bardzo to ułatwia. Podsumowując: "potrzebuję" zapytać o skrypt prologu z mojej aplikacji.

Możliwe rozwiązania

  • osadzić już istniejących implementacji napisany w C. jestem pewien, czy to będzie jeszcze pracować.
  • Wykonaj kod prologu na innym komputerze i użyj sieci do wysłania zapytania prolog.
  • Wygląda na to, że możliwe jest uruchomienie pewnego rodzaju Ruby VM wewnątrz aplikacji (shinycocos używa tego, o ile rozumiem), czy można go użyć do uruchomienia jednej z implementacji Ruby Prolog?
  • Znajdź alternatywę dla Prolog. To musi dać mi te same możliwości, jakie dostaję z prologiem.

Niestety, google prawie nie daje żadnych rezultatów, więc mam wrażenie, że mogę być zupełnie sam w tym projekcie. Jeśli ktokolwiek ma jakiekolwiek doświadczenie lub wskazówkę, byłbym bardzo wdzięczny.

+0

Czy mógłbyś udostępnić łącze do jednej z tych działających implementacji Prolog napisanych w Ruby? –

+0

Ja sam nie próbowałem żadnego z nich, ale szybkie wyszukiwanie w Google dało mi ten wynik: http://eigenclass.org/hiki.rb?tiny+prolog+in+ruby – Bendik

+0

Ach, tak, dzięki. Widziałem implementacje "malutkich prologów" bardzo podobne do tego dawno temu, ale nie sądzę, żeby można je było porównać z pełnym systemem, takim jak SWI-Prolog, YAP, SICStus Prolog, i c. –

Odpowiedz

4

Pół roku później chciałabym przedstawić kilka informacji na ten temat. Skończyłem na pisaniu serwera z interfejsem do prologu w Javie, akceptując połączenia prolog poprzez TCP. Działa niemal dokładnie tak, jak na przykład tłumacz na żywo prolog SWI-prolog (między innymi), a przede wszystkim działa całkiem nieźle. Jednak nie jest to optymalne rozwiązanie, ponieważ nie można wywoływać funkcji z wnętrza prologu. Tracisz możliwość posiadania dwukierunkowej komunikacji.

Gdybym miał zacząć wszystko od początku, z pewnością próbowałbym bardziej skompilować jedną z czystych implementacji C dla iOS. Szybko odszedłem, ale mój brak doświadczenia powstrzymał mnie przed usunięciem wszystkich błędów, które dostałem. Sądząc z faktu, że prolog nie może działać jako proces działający w tle na niezmodyfikowanej wersji iOS, konieczne będzie dokonanie poważnego przepisania. Z tego powodu wystarczy napisać nową implementację (być może zainspirowaną przez niektóre z tych bardziej lekkich) od podstaw, aby uzyskać idealne rozwiązanie.

+0

Nie rozumiem, dlaczego Java wchodzi w obraz? Z kilkoma liniami kodu możesz również mieć serwer HTTP oparty na SWI (zobacz http://www.swi-prolog.org/pldoc/package/http.html) – Kaarel

+0

Ponieważ nie cały tekst wysyłany przez TCP jest analizowany przez prolog. Potrzebowałem możliwości kontrolowania określonego zachowania za pomocą "poleceń na poziomie aplikacji". Ponadto znacznie wygodniej jest pisać w Javie, więc interfejs Java zapewnił mi wygodny sposób trzymania się znanego, bez zbytniego narzutu. – Bendik

+0

FYI, możesz dość łatwo dwukierunkowo wykonywać połączenia między Javą i SWI-Prolog, jeśli używasz JPL: http://www.swi-prolog.org/packages/jpl/ –

3

Możesz pobrać kod źródłowy SWI-Prolog's i skompilować go z XCODE dla platformy iOS. Nigdy tego nie robiłem, ale jest to technicznie możliwe.

Kiedy to zrobisz, istnieje wiele przykładów, jak uruchomić kod prologu z C/C++, w związku z tym będziesz mógł uruchomić prolog z Objective-C.

+0

Dałem temu uczciwą próbę, ale niestety moja wiedza na temat C, C++ i kompilacji bez IDE jest ograniczona, jeśli nieistniejąca. W efekcie wdrożyłem rozwiązanie sieciowe z gniazdami i serwerem działającym jako baza wiedzy. – Bendik

+0

Awesome Bendik. Cieszę się, że rozwiązałeś swój problem. –

6

Po napotkaniu podobnych trudności wywołaniu kodu prologu, choć w innej sytuacji, polecam sprawdzenie biblioteki castor C++. Pozwala to na pisanie kodu paradygmatu logicznego w natywnym języku C++ bez konieczności rozszerzania języka. Ponieważ castor jest biblioteką tylko dla nagłówków, łatwo ją skompilować, gdy tylko dostępne jest C++.
Strona internetowa Castora: http://www.mpprogramming.com/cpp/default.aspx

+0

Chociaż brzmi to jak dobre rozwiązanie, mój przełożony niestety nie zaakceptowałby tego. Mamy już dużą bazę wiedzy w prologu, a przeniesienie jej zajęłoby zbyt dużo czasu. – Bendik

+0

@Bendik Jak ciężko prolog analizować? Jeśli nie jest to zbyt trudne, możesz skorzystać z metody generowania kodu, aby automatycznie wygenerować odpowiedni kod C++ w rolce. – shuttle87

1

FYI, można dość łatwo dwukierunkowo wykonywania połączeń między Java i SWI-Prologu jeśli używasz JPL:

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

Jest również w pełni re-uczestnika, więc można utworzyć wystąpienia kodu prolog z java, który z kolei tworzy kod java itp.

Zrobiłem to dla wielu komercyjnych projektów kilka lat temu, kiedy musiałem podłączyć oparty na Prologu Reasoning Engine na wiele kodu Java.

Używa JNI (Java Native Interface), więc musisz zachować ostrożność podczas kompilowania i łączenia z natywnym interfejsem API. Chociaż jeśli skompilujesz go odpowiednio dla każdej platformy, możesz sprawić, że będzie działać na różnych platformach. Pracowałem nad OS-X, Windows, Linux & Solaris.