2010-10-11 5 views
15

У меня в настоящее время есть необходимость выполнить пролог кода в приложении, которое я делаю. Я знаю, что Apple, вероятно, никогда не допустит что-то подобное в App Store, но это тоже не намерение. Это более частный проект, который никогда не достигнет App Store.Выполнение прологового кода на iPhone

Назначение

В этом случае прологе используется для описания объекта (например, например, телефон) и его свойства. Объект будет нарисован с помощью OpenGL с использованием координат, указанных в прологовом скрипте. Причиной использования пролога является то, что мне нужна возможность запросить программу о некоторых функциях, которые этот объект имеет, и пролог облегчает это. Итог: мне «нужно» запросить пролог-скрипт из моего приложения.

Возможные решения

  • Вставить уже существующей реализации написан на C. Я не уверен, если это будет даже работать.
  • Выполнение прологового кода на другом компьютере и использование сети для запроса пролога.
  • Кажется, что можно запустить какой-то Ruby VM внутри приложения (shinycocos использует это, насколько я понимаю), может ли это быть использовано для запуска одной из реализаций Ruby Prolog?
  • Найдите альтернативу Prolog. Это должно дать мне некоторые из тех же возможностей, которые я получаю с прологом.

К сожалению, google дает мне близко к каким-либо результатам, поэтому у меня возникает ощущение, что я могу быть совсем одиноким в этом проекте. Если у кого-нибудь есть какой-либо опыт или ключ, я был бы очень благодарен.

+0

Не могли бы вы поделиться ссылкой на одну из этих рабочих реализаций Prolog, написанных на Ruby? –

+0

Я сам не пробовал никого из них, но быстрый поиск в google дал мне этот результат: http://eigenclass.org/hiki.rb?tiny+prolog+in+ruby – Bendik

+0

Ах, да, спасибо. Я видел некоторые «крошечные прологи», очень похожие на то, что давно, но я не думаю, что их можно сравнить с полномасштабной системой, такой как SWI-Prolog, YAP, SICStus Prolog и т. Д. –

ответ

4

Полгода спустя, я хотел бы просто дать вам некоторое представление об этом. Я закончил тем, что написал сервер с интерфейсом для пролога в Java, приняв пролог-вызовы через TCP. Он работает почти так же, как и интерпретатор пролог-пролога SWI-пролог (среди прочих), и в основном работает достаточно хорошо. Однако это далеко не оптимальное решение, так как вы не можете вызывать функции из внутреннего пролога. Вы теряете возможность иметь двустороннюю связь.

Если бы я начал все сначала, я бы, конечно, попытался скомпилировать одну из чистых реализаций C для iOS. Я быстро перешел, но мой недостаток опыта помешал мне даже удалить все ошибки, которые я получил. Судя по тому, что вы не можете пролог работать как фоновый процесс в немодифицированной версии iOS, необходимо выполнить некоторую серьезную переписку. Из-за этого нужно просто написать новую реализацию (возможно, вдохновленную некоторыми из более легких из них) с нуля, чтобы получить идеальное решение.

+0

Я не понимаю, почему Java входит в картину? С несколькими строками кода вы также можете иметь HTTP-сервер на основе SWI (см. Http://www.swi-prolog.org/pldoc/package/http.html) – Kaarel

+0

Поскольку не весь текст, отправленный через TCP, анализируется по прологам. Мне нужна была возможность контролировать определенное поведение через «команды уровня приложения». Кроме того, мне гораздо удобнее писать на Java, поэтому интерфейс Java предоставил мне удобный способ придерживаться известных без лишних накладных расходов. – Bendik

+0

FYI, вы можете довольно легко двусторонне совершать вызовы между Java и SWI-Prolog, если вы используете JPL: http://www.swi-prolog.org/packages/jpl/ –

3

Вы можете скачать исходный код SWI-Prolog's и скомпилировать его с помощью XCODE для платформы iOS. Я никогда этого не делал, но это, безусловно, технически возможно.

Как только вы это сделаете, есть много примеров того, как запускать пролог-код с C/C++, следовательно, вы сможете запустить пролог из Objective-C.

+0

Я дал ему честную попытку, но, к сожалению, мои знания о C, C++ и компиляции без IDE ограничены, если они не существуют. В итоге я решил реализовать сетевое решение с сокетами и сервером, действующим как база знаний. – Bendik

+0

Awesome Bendik. Рад, что вы решили свою проблему. –

6

Столкнувшись с подобными проблемами, вызывающими пролог-код, хотя и в другой ситуации, я бы рекомендовал проверить библиотеку ccor C++. Это позволяет вам написать код логической парадигмы в языке C++, не требуя расширения языка вообще. Поскольку castor представляет собой только библиотеку заголовков, ее легко компилировать везде, где доступен C++.
Сайт Castor: http://www.mpprogramming.com/cpp/default.aspx

+0

Хотя это звучит как хорошее решение, мой руководитель, к сожалению, не согласился бы с этим. У нас уже есть большая база знаний в прологе, и портирование займет слишком много времени. – Bendik

+0

@Bendik Насколько трудно пролог разбираться? Если это не так уж сложно, вы можете пойти с подходом к генерации кода, чтобы автоматически генерировать соответствующий код corsor C++. – shuttle87

1

FYI, вы можете довольно легко двунаправленным совершать звонки между Java и SWI-Prolog, если вы используете ЛРД:

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

Он также полностью Реентрантная, так что вы можете создать экземпляр кода пролога из java, который, в свою очередь, создает код Java и т. д.

Я сделал это для ряда коммерческих проектов несколько лет назад, когда мне потребовалось подключить Prolog Based Reasoning Engine ко многим Java-кодам.

Он использует JNI (основной интерфейс Java), поэтому вам нужно быть осторожным в том, как вы компилируете и ссылаетесь на собственный api. Хотя, если вы скомпилируете его для каждой платформы, вы можете заставить ее работать на кросс-платформе. Я работал над OS-X, Windows, Linux & Solaris.