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.
関数名
Arg
WhichTerm
概要
#include "cpred.h"
TERM Arg(NUMBER)
int NUMBER;
int WhichTerm(T, INFO)
TERM T;
TermInfo *INFO;
Argは、ゴ−ルの第N番目の引数を返します。第N番目の引数がない場合には、IF/Prologのセッションをアボ−トします。引数は、N=1から数えます(0ではありません)。
WhichTermは、TERMのC表現の型がわからなくても、cpred.hに定義されている複合項TermInfoを使うことによって、そのC表現を検索することができます。
typedef union {
long varno;
long ivalue;
double dvalue;
struct {
INDEX index;
int arity;
TERM *args;
char *name;
} fct;
} TermInfo;
#define T_VARIABLE 0
#define T_ATOM 1
#define T_INTEGER 2
#define T_DOUBLE 3
#define T_STRUCTURE 4
TERMやTermInfoの変数がWhichTermに渡されると、どの名前でTermInfoにアクセスすればよいかを示すTERMの型のインジケ−タ(T_INTEGER,T_VARIABLE,T_ATOM,T_DOUBLE,T_STRUCTUREのいずれか)が返されます。そしてPrologのC表現がTermInfoの変数に与えられます。注意:fct.indexは、内部でのみ使用されます。
(次ペ−ジの例を参照して下さい。)
/*-----------------------------------------------------*/
/* filename : $PROROOT/demos/c/whichterm.c */
/* whatis(A,B) B is instantiated to the atom */
/* describing the type of the TERM A */
/*-----------------------------------------------------*/
#include "cpred.h"
int Cboot()
{ CPRIM("whatis", 2, WhatIs);
} /*---------------------------------------------------*/
int WhatIs()
{ return XChk( IsVar(Arg(2)) || IsAt(Arg(2)) ,
"var_or_atom_expected")
&& UnifyArg( 2, VarType(Arg(1)) );
} /*---------------------------------------------------*/
TERM VarType(T)
TERM T;
{ TermInfo ti;
switch( WhichTerm(T, &ti)) {
case T_ATOM:
if( strlen(ti.fct.name) < 5)
return StrAt( "short_atom" );
else return StrAt( "long_atom" );
case T_INTEGER:
if( ti.ivalue >= 0 )
return StrAt( "positive_integer" );
else return StrAt( "negative_integer" );
case T_DOUBLE:
if( ti.dvalue >= 0 )
return StrAt( "positive_real" );
else return StrAt( "negative_real" );
case T_VARIABLE:
return StrAt( "variable" );
case T_STRUCTURE:
if( strcmp(ti.fct.name, ".") == 0 &&
ti.fct.arity == 2 )
return StrAt( "list" );
else return StrAt( "structure" );
}
}
?-whatis(714,L), whatis('747',K), whatis(-5.61,N),
whatis([1,2,3],I), whatis(f(x,y),J), whatis(_,M).
L =positive_integer
K =short_atom
N =negative_real
I =list
J =structure
M =variable
yes
?-
|