From 8785108e66d55a04a8bc520ef9a7ded9f965abc1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?V=C3=ADtor=20Santos=20Costa?= Date: Thu, 27 Oct 2011 12:35:40 +0200 Subject: [PATCH] Yap_unifiable and TagOfTerm --- C/c_interface.c | 59 ++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 58 insertions(+), 1 deletion(-) diff --git a/C/c_interface.c b/C/c_interface.c index c648f78b3..a60bad24b 100644 --- a/C/c_interface.c +++ b/C/c_interface.c @@ -425,6 +425,7 @@ X_API Int STD_PROTO(YAP_ArityOfFunctor,(Functor)); X_API void *STD_PROTO(YAP_ExtraSpace,(void)); X_API void STD_PROTO(YAP_cut_up,(void)); X_API Int STD_PROTO(YAP_Unify,(Term,Term)); +X_API int STD_PROTO(YAP_Unifiable,(Term,Term)); X_API int STD_PROTO(YAP_Reset,(void)); X_API Int STD_PROTO(YAP_Init,(YAP_init_args *)); X_API Int STD_PROTO(YAP_FastInit,(char *)); @@ -545,6 +546,7 @@ X_API int STD_PROTO(YAP_NewOpaqueType,(void *)); X_API Term STD_PROTO(YAP_NewOpaqueObject,(int, size_t)); X_API void *STD_PROTO(YAP_OpaqueObjectFromTerm,(Term)); X_API int STD_PROTO(YAP_Argv,(char *** argvp)); +X_API YAP_tag_t STD_PROTO(YAP_TagOfTerm,(Term)); static int dogc( USES_REGS1 ) @@ -1180,6 +1182,18 @@ YAP_Unify(Term t1, Term t2) return out; } +X_API int +YAP_Unifiable(Term t1, Term t2) +{ + int out; + BACKUP_MACHINE_REGS(); + + out = Yap_unifiable(t1, t2); + + RECOVER_MACHINE_REGS(); + return out; +} + /* == */ X_API int YAP_ExactlyEqual(Term t1, Term t2) @@ -3788,7 +3802,6 @@ YAP_OpInfo(Atom at, Term module, int opkind, int *yap_type, int *prio) return 1; } - int YAP_Argv(char ***argvp) { @@ -3797,3 +3810,47 @@ YAP_Argv(char ***argvp) } return GLOBAL_argc; } + +YAP_tag_t +YAP_TagOfTerm(Term t) +{ + if (IsVarTerm(t)) { + CELL *pt = VarOfTerm(t); + if (IsUnboundVar(pt)) { + if (IsAttVar(pt)) + return YAP_TAG_ATT; + return YAP_TAG_UNBOUND; + } + return YAP_TAG_REF; + } + if (IsPairTerm(t)) + return YAP_TAG_PAIR; + if (IsAtomOrIntTerm(t)) { + if (IsAtomTerm(t)) + return YAP_TAG_ATOM; + return YAP_TAG_INT; + } else { + Functor f = FunctorOfTerm(t); + + if (IsExtensionFunctor(f)) { + if (f == FunctorDBRef) { + return YAP_TAG_DBREF; + } + if (f == FunctorLongInt) { + return YAP_TAG_LONG_INT; + } + if (f == FunctorBigInt) { + big_blob_type bt = RepAppl(t)[1]; + switch (bt) { + case BIG_INT: + return YAP_TAG_BIG_INT; + case BIG_RATIONAL: + return YAP_TAG_RATIONAL; + default: + return YAP_TAG_OPAQUE; + } + } + } + return YAP_TAG_APPL; + } +}