c++ prolog embed swi-prolog

Linux g++ Incrustar Prolog Logic Engine dentro de C++



embed swi-prolog (2)

Si no le importa volver a escribir el código de prólogo para su uso en una biblioteca nativa de solo encabezado de C ++, buscaría en la biblioteca de castor: http://www.mpprogramming.com/cpp/

Tengo algo de lógica en un programa de C ++ que no solo es increíblemente complejo, sino que requiere múltiples soluciones para las cuales Prolog es ideal. Es como una secuencia de comandos de configuración de firewall, que controla la entrada de acciones, pero a veces se requiere más de una acción.

Lo que quiero es algo como esto:

class PrologEngine { LoadLogic(const char* filename) throw PrologException; // Load a file of prolog rules, predicates facts etc in textual format. Must be callable multiple times to load AND COMPILE (for speed) prolog rule files. std::vector<std::string> Evaluate(const char* predicate_in_string_form = "execute(input, Result)") throw PrologException; Returns a vector of matching predicates in text form. };

No necesita capacidad para volver a llamar a C ++.

AMI Prolog parece obtenerlo, pero no está disponible en Linux. Intento usar SWI-Prolog y solo puedo encontrar 2 ejemplos y una API increíblemente bizantina (mi opinión)

¿Alguien puede señalarme un ejemplo que esté cerca de lo que estoy buscando?


Hay una interfaz C ++ para SWI-Prolog , eso es de alto nivel.

Estoy peleando con esto , aquí un ejemplo de conexión a OpenGL:

PREDICATE(glEvalCoord1d, 1) { double u = A1; glEvalCoord1d( u ); return TRUE; }

Este código limpio esconde muchos ''bizantinismos'', usando conversión de tipo implícito y algo de macro. La interfaz está bien diseñada y es bidireccional: para llamar a Prolog desde C ++ hay PlCall (''ejecutar'' una consulta, similar a Evaluar que expone en la respuesta) o un PlQuery más estructurado, para obtener resultados múltiples ...

Si no necesita vincularse con openGl, o puede esperar a escuchar la respuesta que con suerte obtendré de la lista de correo de SWI-Prolog, debe evaluarla.