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

我想在 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("%dn", 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程序中嵌入Prolog解释器?的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>