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

标签 c prolog interpreter

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

相关文章:

list - 判断给定元素是否在 double 列表中

javascript - 如何使用 Skulpt 逐行评估 Python

C 嵌套开关 : outer switch's case inside inner switch

c - 格式化字符串漏洞利用——打开 root shell

c - 如何生成 0.1 到 0.01 之间的随机数

c - 更好地理解 C 中的 strstr

haskell - 用 Haskell 编写的简单解释器,将打印输出保存到最后,而不是遇到打印语句时

c - 2DRange 中每个工作组的 OpenCL 工作项

prolog - 如何构建主列表中某个元素的位置列表?

recursion - Turbo Prolog 执行顺序