新しい事実を assert/1 する

例として、birthday(8, 21). という事実を Prolog に assert してみる。

functor

まず functor の名前から準備する。Prolog の atom は内部では unsigned long 型の整数で表現され、実行時に互いに変換されている。functor も atom として作成しておく。これは後に事実を組み立てるときに使う。
const char* func = "birthday";
unsigned long func_name = SP_atom_from_string(func);

引数

次に、引数の準備をする。ここでは引数の数は2個なので、SP_term_ref も2個用意する。
SP_term_ref arg[2];
arg[0] = SP_new_term_ref();
arg[1] = SP_new_term_ref();
SP_put_integer(arg[0],  8);
SP_put_integer(arg[1], 21);
配列である必要は無いが、その方が便利かと。それぞれ SP_new_term_ref() で新しい term への参照を作っておいて、SP_put_integer() で int を term に入れることができる。

事実

そしてようやく事実を組み立てる。
SP_term_ref new_fact = SP_new_term_ref();
SP_cons_functor(new_fact, func_name, 2, arg[0], arg[1]);
新しく作る事実に対しても SP_term_ref を作って、SP_new_term_ref() で初期化しておく必要がある。 関数 SP_cons_functor() の宣言は、
int SP_cons_functor(SP_term_ref t,        /*新しく作る節*/
                    unsigned long name,   /*functorの名前を変換したもの*/
                    int arity,            /*arity(引数の数)*/
                    SP_term_ref arg, ...) /*引数(可変長)*/
である。これでやっと事実を作り上げることができた。

assert/1

最後に Prolog の assert/1 に渡してやれば良い。
SP_pred_ref pAssert = SP_predicate("assert", 1, "");
goal = SP_query(pAssert, new_fact);