关闭。这个问题不满足Stack Overflow guidelines .它目前不接受答案。
想改善这个问题吗?更新问题,使其成为 on-topic对于堆栈溢出。
8 个月前关闭。
Improve this question
我想在 C 程序中嵌入 Prolog 解释器,以便它可以用于评估业务规则。
SWI-Prolog 和 GNU Prolog 似乎都暗示有这样的功能,但两者似乎也需要使用自己的编译器和链接器才能这样做,并且没有任何明确的例子或这种用法的文档 -而不是提供常规库来使用和清除文档。
我正在寻找的是一个库,它的行为类似于 Python 和 Lua 可以嵌入到 C 程序中的方式,例如:
// Setup
PrologContext context = plNewContext();
plConsult(context, "businessRules.pl");
// Later in the program
if (plEvaluate(context, "can_view_page(%a)", path)) { ...
最佳答案
这是一个使用 between/3
的小例子.
#include <stdio.h>
#include <SWI-Prolog.h>
int main()
{
char *argv[] = {"hello", "-q"};
PL_initialise(2, argv);
term_t a = PL_new_term_refs(3);
PL_put_integer(a, 11); // First argument to between/3
PL_put_integer(a+1, 17); // Second argument to between/3
static predicate_t p;
if(!p)
p = PL_predicate("between", 3, NULL) ; // predicate between/3
qid_t q = PL_open_query(NULL, PL_Q_NORMAL, p, a);
int tmp;
while(PL_next_solution(q)==TRUE){
PL_get_integer(a+2, &tmp); // Third argument to between/3
printf("%d\n", tmp);
}
PL_close_query(q);
return 0;
}
使用 swipl-ld
编译它并执行swipl-ld -o between between.c
./between
11
12
13
14
15
16
17
另一个例子,如果你想加载一个文件然后进行查询。#include <stdio.h>
#include <SWI-Prolog.h>
void consult_file(const char* filename){
/* PL_initialse before calling. */
predicate_t p = PL_predicate("consult", 1, NULL);
term_t a = PL_new_term_ref();
PL_put_atom_chars(a, filename);
PL_call_predicate(NULL, PL_Q_NORMAL, p, a);
}
int main()
{
char* argv[] = {"consult_file", "-q"};
PL_initialise(2, argv);
consult_file("digits.pl"); /* Load prolog file */
static predicate_t p;
/* third argument is module name if the predicate is in one.*/
if(!p) p= PL_predicate("digit", 1, NULL);
int tmp; term_t a = PL_new_term_ref();
qid_t q = PL_open_query(NULL, PL_Q_NORMAL, p, a);
while(PL_next_solution(q)==TRUE){ /* All solutions */
PL_get_integer(a, &tmp);
printf("%d ", tmp);
}
return PL_halt(0);
}
与 digits.pl
文件如下我们得到三个数字1 2 3
作为输出。digit(1).
digit(2).
digit(3).
关于c - 有没有什么合理的方法可以在 C 程序中嵌入 Prolog 解释器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65118493/