qfwfq
qfwfq

Reputation: 976

Embedding a Prolog engine in Obj-C projects

I'm looking for a light-weight Prolog engine to be embedded in an Obj-C application under Mac OSX.
In Java there are some excellent implementations with the characteristics I need: deployability, lightness, dynamic configurability, integration with Java and ease of interoperability. Can you recommend something similar in C/C++?


After several searches I found YAProlog and reading here it seems it can be used as library to be called from other programs. But (stupid questions):

  1. I'm inexperienced with UNIX and I don't know exactly how to produce libyap.a file with those commands of the YAP manual...
  2. Can I then copy libyap.a in my Xcode project and use it?

Upvotes: 3

Views: 746

Answers (2)

Erik Kaplun
Erik Kaplun

Reputation: 38217

SWI-Prolog’s Foreign Language Interface section of the manual has an entry for Embedding SWI-Prolog in other applications. As far as calling it from Objective C, it should be possible just as easily as calling any C code.

12.4.23 Embedding SWI-Prolog in other applications

With embedded Prolog we refer to the situation where the‘main' program is not the Prolog application. Prolog is sometimes embedded in C, C++, Java or other languages to provide logic based services in a larger application. Embedding loads the Prolog engine as a library to the external language. Prolog itself only provides for embedding in the C language (compatible with C++). Embedding in Java is achieved using JPL using a C-glue between the Java and Prolog C interfaces.

Upvotes: 0

ShinTakezou
ShinTakezou

Reputation: 9671

GProlog supports Mac OS X (Darwin) and there's an installer for Mac OS X Leopard. And here you can read how to call gprolog from C (read also this). Then instead of using gplc, you can use gcc provided that you add the proper options for linking, which could be a bit "trickie" to be found; so you can produce object files with gplc and then glue everything together...

About YAP:

1) Usually package with autoconf are compiled simply with the following "sequence" of commands

./configure
make

A final make install should install everything and must be executed by a user having the rights to do so. The manual suggest the creation of an ARCH (ARCH.?) dir and doing everything from there (so, ../configure instead of ./configure).

The configure script accepts usually options, take a look at them. Check in particular where are LIBDIR and YAPLIBDIR.

So, once you have the source tarball (the .tar.gz of the source), you should dearchive it, a command like tar -xzf Yap-5.1.3.tar.gz works on GNU/Linux and the same tar should be also on Mac OS X...

Let's look at ./configure --help and look if you see interesting option you want to use before proceeding.

Now, let's follow manual's suggestion (even if it looks odd to me;-))

mkdir ARCH.  # I would put GNUlinux, or maybe
             # the name must be exactly this?
cd ARCH.
../configure

You wait... and the directory gets populated of evrything needed for the next step. Take a look at the created Makefile, you see lines like

#
# where YAP should look for binary libraries
#
LIBDIR=$(EROOTDIR)/lib
YAPLIBDIR=$(EROOTDIR)/lib/Yap

Among the targets of the Makefile, I can read also libYap.a. So, try the make (I won't do that to check what can go wrong, also because I am on GNU/Linux and how I can solve problems could be different), at the end, you should obtain the libYap.a, and so, become "root" (administrator) and do

make install

In the install target (exactly install_unix for me) I read $(INSTALL_DATA) -m 755 libYap.a $(DESTDIR)$(LIBDIR) which means that your .a is installed and should be ready to be used by a compiler, provided you know where the lib is (and you know it, see above and remember the configure's options)

2) Of course you can copy it directly where you need it and use it "directly", but since it is "canonically" installed by the make install, use it the way you'd use any other "system wide" lib archive.

Upvotes: 3

Related Questions