- Documentation
- Reference manual
- Introduction
 - Overview
 - Initialising and Managing a Prolog Project
 - Built-in Predicates
 - SWI-Prolog extensions
 - Modules
 - Constraint Logic Programming
 - CHR: Constraint Handling Rules
 - Multithreaded applications
 - Coroutining using Prolog engines
 - Foreign Language Interface
 - Generating Runtime Applications
 - The SWI-Prolog library
 - Hackers corner
 - Compatibility with other Prolog dialects
 - Glossary of Terms
 - SWI-Prolog License Conditions and Tools
 - Summary
 - Bibliography
 
 - Packages
 
 - Reference manual
 
11 Foreign Language Interface
SWI-Prolog offers a powerful interface to C Kernighan & Ritchie, 1978. The main design objectives of the foreign language interface are flexibility and performance. A foreign predicate is a C function that has the same number of arguments as the predicate represented. C functions are provided to analyse the passed terms, convert them to basic C types as well as to instantiate arguments using unification. Non-deterministic foreign predicates are supported, providing the foreign function with a handle to control backtracking.
C can call Prolog predicates, providing both a query interface and an interface to extract multiple solutions from a non-deterministic Prolog predicate. There is no limit to the nesting of Prolog calling C, calling Prolog, etc. It is also possible to write the `main' in C and use Prolog as an embedded logical engine.