Prolog is a declarative programming language which means instead of giving step by step instructions on how to solve a problem as done in imperative languages, the problem is described and the program is allowed to come up with the best way of doing it.
Prolog like other declarative languages generally run in an interpreter which allows for backtracking, tail-recursion and stuff. Most of the prolog implementations have a C interface, but the prolog code runs as a separate process inside an interpreter, and interface functions are provided to call C externally, and for C to call into the prolog interpreter. A second alternative is to compile the interpreter and the prolog code (or Warner Abstract Machine) into a single native executable which can then interface with C.
This has several advantages in that the C/C++ and prolog code can be developed almost completely separately, without each needing to know anything more than the interface calls to the other. Each code therefore has its own development environment and because they each execute in their own process space with their own variable memory, it can greatly decrease the complexity of the code removing the need for careful control over the passing of data structures. Also, each section of code gains the benefits of the paradigm within which it is developed: Prolog can use the advantages of pure logic programming, whilst C/C++ can be written as efficient imperative code.
Disadvantages to this approach include the fact that the program needs two processes to be running in order to function. If one process dies, or ends unexpectedly, then the other may be continue for quite sometime without terminating, which an end user of the program may be unaware of. Although it could be argued that having all code running under a single process would be less reliable than two separate processes, it does not apply in this situation since one cannot function without the other, they are integrated as parts of a whole.