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;
} /*----------------------------------------------------*/
戻る
続く..
冒頭へ