gpt4 book ai didi

c - 有没有什么合理的方法可以在 C 程序中嵌入 Prolog 解释器?

转载 作者:行者123 更新时间:2023-12-03 16:54:45 26 4
gpt4 key购买 nike

关闭。这个问题不满足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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com