sitelogo
複合項の扱い
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 ?-


Darueber read on...
scroll to top managed with ubiCMS