[PPL-devel] Re: [SWIPL] Big integers and the foreign language interface
Roberto Bagnara
bagnara at cs.unipr.it
Sun Dec 4 22:25:28 CET 2005
Jan Wielemaker wrote:
> Roberto
>
> On Friday 02 December 2005 19:55, Roberto Bagnara wrote:
>
>>I am interfacing the Parma Polyhedra Library (http://www.cs.unipr.it/ppl/)
>>to the new version of SWI-Prolog. The library is already interfaced to
>>versions of SWI-Prolog up to 5.4.7. The point is that big integers
>>arise quite frequently in the kind of applications we are interested in.
>>So we were really looking forward for your announcement that SWI-Prolog
>>5.6 is to be released very soon.
>>
>>In order to do the job, all I need are functions of the kind
>>PL_put_mpz_t(), PL_put_mpq_t(), PL_get_mpz_t() and PL_get_mpq_t()
>>with the obvious semantics. A reasonably efficient text-based interface
>>would also be OK: is there something like PL_put_number_chars()
>>and PL_get_number_chars()?
>>
>>By the way: Alan's idea of providing a separate header file for the
>>GMP-dependent stuff would seem to address your concerns, right?
>>An alternative would be to use the same header file but ask the user
>>to activate the GMP-dependent stuff explicitly, e.g., by doing
>
>
> Ok. I've added
>
> int PL_get_mpz(term_t t, mpz_t mpz);
> int PL_get_mpq(term_t t, mpq_t mpq);
> int PL_unify_mpz(term_t t, mpz_t mpz);
> int PL_unify_mpq(term_t t, mpq_t mpq);
>
> With pretty obvious (also documented) semantics. You get these if you
> do (in *this* order):
>
> #include <gmp.h>
> #include <SWI-Prolog.h>
>
> Now this works fine, except when SWI-Prolog is compiled with a
> diffferent version of GMP that uses a different representation. I think
> GMP is pretty stable, but there is an issue here.
>
> Changes are on CVS. I only ran a few obvious tests. Please try it and
> report problems you may find.
>
> Success --- Jan
>
> Here is a complete example:
>
> #include <gmp.h>
> #include <SWI-Prolog.h>
>
> static foreign_t
> next_prime(term_t n, term_t prime)
> { mpz_t mpz;
> int rc;
>
> mpz_init(mpz);
> if ( PL_get_mpz(n, mpz) )
> { mpz_nextprime(mpz, mpz);
>
> rc = PL_unify_mpz(prime, mpz);
> } else
> rc = FALSE;
>
> mpz_clear(mpz);
> return rc;
> }
>
> install_t
> install()
> { PL_register_foreign("next_prime", 2, next_prime, 0);
> }
Dear Jan,
thanks a lot: the functions you have added to SWI-Prolog's foreign language
interface do the job perfectly. I have made several tests with the PPL
and everything seems to work as expected.
Thanks again,
Roberto
--
Prof. Roberto Bagnara
Computer Science Group
Department of Mathematics, University of Parma, Italy
http://www.cs.unipr.it/~bagnara/
mailto:bagnara at cs.unipr.it
More information about the PPL-devel
mailing list