ライブラリ関数を使ったプログラム例
MINERVA superseeded IF/Prolog. Please see http://www.ifcomputer.co.jp/MINERVA for details.

We discontinued to sell IF/Prolog Dec 31. 2003. For current customers, we continue to provide professional support for IF/Prolog until Dec 31, 2008.

C述語のnumbervars(A,B,C)は、最初のTERMの異なった自由変数の数を数えます。

/*------------------------------------------------------*/ /* filename : $PROROOT/demos/c/numbervars.c */ /* numbervars(A,B,C) B must be an integer */ /* if A is atom, integer or double then unify(B,C) */ /* if A is var or struct then count the vars in A */ /* & unify them with B+1, B+2,..., B+n and C becomes*/ /* B+n+1 */ /*------------------------------------------------------*/ #include "cpred.h"

INT varcount;

int Cboot() { CPRIM("numbervars", 3, NVars);} /*------------------------------------------------------*/ int NVars() { return XChk(IsInteger(Arg(2),&varcount), "integer_expected") && NumVars(Arg(1)) && UnifyArg(3, IntCP(varcount)); } /*------------------------------------------------------*/ int NumVars(T) TERM T; { int i; TermInfo ti;

switch( WhichTerm(T, &ti)) { case T_ATOM: case T_INTEGER: case T_DOUBLE: break; case T_VARIABLE: Unify(T, IntCP(varcount)); varcount++; break; case T_STRUCTURE: for( i=0; i

?- numbervars(A,B,C). E X C E P T I O N:integer_expected:numbervars(_1276,_1280,_1284) ?- numbervars(A,0,C).

A = 0 C = 1

yes ?- numbervars( a(b,C,D,f(C,g),H) ,100,I).

C =100 D =101 H =102 I =103 yes ?-

以下のペ−ジでは、ファイル$PROROOT/demos/c/decompose.cを示しています。そのファイルは、2つの述語、decompose1/2とdecompose2/2を含んでいます。どちらの述語も第1引数としてアトムを必要とし、第2引数としてアトムの文字が要素であるリストを返します。これら2つのC述語は、どちらも同じ結果を得るためにMkListを使います。

decompose1/2では、リストは最後の要素から最初の要素へという"逆方向"に作られます。MkListは、連続したリストを作ります。どのリストもTAILとして、すでに作られたリスト(Nilから始まる)を、そして次の文字を先頭として*stringの末尾から持ってきます。Prologでは、リストは通常、逆方向から作られます。

decompose2/2は、リストを”前方向”から作ります。渡されたListPtrは、作られるべきリストの最初のアドレスです。MkListは、NewTailPointerにリストの連続する文字を返します。

?- decompose1(A,L). E X C E P T I O N:atom_expected:decompose1(_1276,_1280) ?- decomposel(123,L), decompose2(treefrog,K).

L = ['1','2','3'] K = [t,r,e,e,f,r,o,g]

yes ?- decompose2(f(x),K). E X C E P T I O N:atom_expected:decompose2(f(x),_1280) ?-

/*------------------------------------------------------*/ /* filename : $PROROOT/demos/c/decompose.c */ /*------------------------------------------------------*/ #include "cpred.h"

int Cboot() { CPRIM("decompose1", 2, Decom1); CPRIM("decompose2", 2, Decom2); } /*----------------------------------------------------*/ int Decom1() { TERM List; char *string;

return XChk(IsString(Arg(1), &string), "atom_expected") && decompose1(string, &List) && UnifyArg(2, List); } /*----------------------------------------------------*/ int decompose1(string, ListPtr) char *string; TERM *ListPtr; { int i; char s[2]; TERM *dummy;

s[1] = 0; for(i = strlen(string) - 1, *ListPtr = Nil(); i>= 0; i--) { s[0] = string[i]; *ListPtr = MkList(StrAt(s), *ListPtr, &dummy); } return 1; } /*----------------------------------------------------*/ int Decom2() { TERM List; char *string;

return XChk(IsString(Arg(1), &string), "atom_expected") && decompose2(string, &List) && UnifyArg(2, List); } /*----------------------------------------------------*/ int decompose2(string, ListPtr) char *string; TERM *ListPtr; { TERM *NewTailPtr; char s[2];

s[1] = 0; for(*ListPtr = Nil(); *string; string++, ListPtr = NewTailPtr ) { s[0] = *string; *ListPtr = MkList(StrAt(s), Nil(), &NewTailPtr); } return 1; } /*----------------------------------------------------*/


Up read on...