2010-10-11 32 views
15

Tôi hiện đang có nhu cầu thực thi mã prolog trong một ứng dụng tôi đang thực hiện. Tôi biết rằng Apple có lẽ sẽ không bao giờ cho phép một cái gì đó như thế này trong App Store, nhưng đó cũng không phải là ý định. Đây là một dự án riêng tư sẽ không bao giờ tiếp cận với App Store.Thực thi mã prolog trên iPhone

Mục đích

Trong trường hợp này prolog được sử dụng để mô tả một đối tượng (ví dụ như một điện thoại) và thuộc tính của nó. Đối tượng sẽ được vẽ bằng OpenGL sử dụng tọa độ được chỉ định trong tập lệnh prolog. Lý do để sử dụng prolog là tôi cần khả năng truy vấn chương trình về một số tính năng mà đối tượng này có, và prolog giảm bớt điều này rất nhiều. Tóm lại: Tôi "cần" để truy vấn một tập lệnh prolog từ ứng dụng của tôi.

giải pháp có thể

  • Nhúng một thực hiện đã tồn tại được viết bằng C. Tôi không chắc chắn nếu điều này thậm chí sẽ làm việc.
  • Thực thi mã prolog trên máy khác và sử dụng mạng để truy vấn prolog.
  • Dường như có thể chạy một số loại Ruby VM bên trong ứng dụng (shinycocos sử dụng điều này theo như tôi hiểu), điều này có thể được sử dụng để chạy một trong các triển khai Ruby Prolog không?
  • Tìm một số thay thế cho Prolog. Điều này cần phải cho tôi một số khả năng tương tự tôi nhận được với prolog.

Đáng buồn thay, google cho tôi gần như không có kết quả nào cả, vì vậy tôi có cảm giác rằng tôi có thể hoàn toàn đơn độc trong dự án này. Nếu bất cứ ai có bất kỳ kinh nghiệm hoặc đầu mối nào cả, tôi sẽ rất biết ơn.

+0

Bạn có muốn chia sẻ liên kết tới một trong những triển khai Prolog đang hoạt động được viết bằng Ruby không? –

+0

Tôi đã không thử bất kỳ một trong số họ bản thân mình, nhưng một tìm kiếm nhanh trên google đã cho tôi kết quả này: http://eigenclass.org/hiki.rb?tiny+prolog+in+ruby – Bendik

+0

Ah, yeah, cảm ơn. Tôi thấy một số triển khai "prolog nhỏ" rất giống với một thời gian dài trước đây, nhưng tôi không nghĩ rằng chúng có thể được so sánh với một hệ thống toàn diện như SWI-Prolog, YAP, SICStus Prolog, & c. –

Trả lời

4

Nửa năm sau, tôi chỉ muốn cung cấp một số thông tin chi tiết về điều này. Tôi đã kết thúc bằng cách viết một máy chủ với một giao diện để prolog trong Java, chấp nhận các cuộc gọi prolog thông qua TCP. Nó hoạt động gần như chính xác như trình thông dịch prolog sống SWI-prolog (trong số những người khác) cung cấp, và hầu hết hoạt động khá tốt. Tuy nhiên, nó là xa một giải pháp tối ưu, vì bạn không thể gọi các chức năng từ bên trong prolog. Bạn mất khả năng giao tiếp hai chiều.

Nếu tôi bắt đầu lại từ đầu, tôi chắc chắn sẽ cố gắng để biên dịch một trong những triển khai C thuần túy cho iOS. Tôi đã cho nó một cách nhanh chóng, nhưng sự thiếu kinh nghiệm của tôi đã ngăn cản tôi thậm chí loại bỏ tất cả các lỗi mà tôi nhận được. Đánh giá bởi thực tế là bạn không thể có prolog chạy như một quá trình nền trên một phiên bản chưa sửa đổi của iOS là tốt, một số viết lại lớn sẽ phải được thực hiện. Bởi vì điều này, người ta chỉ có thể phải viết một thực hiện mới (có lẽ lấy cảm hứng từ một số những cái nhẹ hơn ra khỏi đó) từ đầu để có được giải pháp hoàn hảo.

+0

Tôi không hiểu, tại sao Java nhập hình ảnh? Với một vài dòng mã, bạn cũng có thể có một máy chủ HTTP dựa trên SWI (xem http://www.swi-prolog.org/pldoc/package/http.html) – Kaarel

+0

Bởi vì không phải tất cả văn bản được gửi qua TCP được phân tích cú pháp bởi prolog. Tôi cần khả năng kiểm soát hành vi nhất định thông qua "lệnh cấp ứng dụng". Ngoài ra, tôi viết nhiều hơn trong Java, vì vậy giao diện Java đã cung cấp cho tôi một cách thoải mái để gắn bó với cái đã biết mà không tốn quá nhiều chi phí. – Bendik

+0

FYI, bạn có thể dễ dàng thực hiện hai cuộc gọi giữa Java và SWI-Prolog nếu bạn sử dụng JPL: http://www.swi-prolog.org/packages/jpl/ –

3

Bạn có thể tải xuống SWI-Prolog's mã nguồn và biên dịch mã nguồn bằng XCODE cho nền tảng iOS. Tôi chưa bao giờ làm điều đó, nhưng nó chắc chắn về mặt kỹ thuật có thể.

Khi bạn làm điều đó, có rất nhiều ví dụ về cách chạy mã prolog từ C/C++, do đó, bạn sẽ có thể chạy prolog từ Objective-C.

+0

Tôi đã cho nó một thử trung thực, nhưng thật đáng buồn kiến ​​thức của tôi về C, C + + và biên dịch mà không có một IDE là hạn chế, nếu không phải là không tồn tại. Tôi đã kết thúc việc thực hiện một giải pháp mạng với các ổ cắm và một máy chủ hoạt động như một cơ sở tri thức để thay thế. – Bendik

+0

Tuyệt vời Bendik. Rất vui vì bạn đã giải quyết được vấn đề của mình. –

6

Gặp phải những khó khăn tương tự khi gọi mã prolog, mặc dù trong một tình huống khác, tôi khuyên bạn nên kiểm tra thư viện castor C++. Điều này cho phép bạn viết mã mô hình logic trong native C++ mà không cần mở rộng ngôn ngữ. Là castor là một thư viện chỉ tiêu đề nó rất dễ dàng để biên dịch bất cứ nơi nào C++ có sẵn.
Trang web của Castor: http://www.mpprogramming.com/cpp/default.aspx

+0

Mặc dù nó có vẻ giống như một giải pháp tốt, người giám sát của tôi buồn bã sẽ không chấp nhận nó. Chúng tôi đã có một cơ sở tri thức lớn trong prolog, và chuyển nó sẽ mất quá nhiều thời gian. – Bendik

+0

@Bendik Làm cách nào để phân tích cú pháp? Nếu nó không quá khó, bạn có thể đi với một cách tiếp cận tạo mã để tự động tạo mã castor C++ có liên quan. – shuttle87

1

FYI, bạn có thể khá dễ dàng bi-directionally thực hiện cuộc gọi giữa Java và SWI-Prolog nếu bạn sử dụng JPL:

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

Nó cũng được hoàn toàn tái ký dự thi, vì vậy bạn có thể nhanh chóng đang prolog từ java, lần lượt tạo mã java, v.v ...

Tôi đã thực hiện điều này cho một số dự án thương mại vài năm trước khi tôi được yêu cầu kết nối Công cụ lập luận dựa trên Prolog với rất nhiều mã Java.

Nó sử dụng JNI (Giao diện bản địa Java), vì vậy bạn cần phải cẩn thận về cách bạn biên dịch và liên kết đến api gốc. Mặc dù nếu bạn biên dịch nó một cách thích hợp cho mỗi nền tảng, bạn có thể làm cho nó hoạt động trên nền tảng. Tôi đã làm việc trên OS-X, Windows, Linux & Solaris.