make the tabling engine independent of the tag scheme

git-svn-id: https://yap.svn.sf.net/svnroot/yap/trunk@1312 b08c6af1-5177-4d33-ba66-4b1c6b8b522a
This commit is contained in:
ricroc 2005-05-31 08:19:31 +00:00
parent 626708cdef
commit 7976da97b8
4 changed files with 357 additions and 390 deletions

View File

@ -10,7 +10,7 @@
* File: Yap.h.m4 * * File: Yap.h.m4 *
* mods: * * mods: *
* comments: main header file for YAP * * comments: main header file for YAP *
* version: $Id: Yap.h,v 1.2 2005-05-31 00:38:20 ricroc Exp $ * * version: $Id: Yap.h,v 1.3 2005-05-31 08:19:31 ricroc Exp $ *
*************************************************************************/ *************************************************************************/
#include "config.h" #include "config.h"
@ -649,7 +649,7 @@ typedef enum
if you place things in the lower addresses (power to the libc people). if you place things in the lower addresses (power to the libc people).
*/ */
#if (defined(_AIX) || defined(_WIN32) || defined(sparc) || defined(__sparc) || defined(mips) || defined(__FreeBSD__) || defined(_POWER) || defined(__linux__) || defined(IN_SECOND_QUADRANT) || defined(__CYGWIN__)) && !defined(TABLING) #if (defined(_AIX) || defined(_WIN32) || defined(sparc) || defined(__sparc) || defined(mips) || defined(__FreeBSD__) || defined(_POWER) || defined(__linux__) || defined(IN_SECOND_QUADRANT) || defined(__CYGWIN__))
#define USE_LOW32_TAGS 1 #define USE_LOW32_TAGS 1
#endif #endif

View File

@ -1,3 +1,18 @@
/**********************************************************************
The OPTYap Prolog system
OPTYap extends the Yap Prolog system to support or-parallel tabling
Copyright: R. Rocha and NCC - University of Porto, Portugal
File: tab.macros.h
version: $Id: tab.macros.h,v 1.12 2005-05-31 08:17:46 ricroc Exp $
**********************************************************************/
/* ------------------ **
** Includes **
** ------------------ */
#include <stdlib.h> #include <stdlib.h>
#include "opt.mavar.h" #include "opt.mavar.h"
@ -44,25 +59,6 @@ STD_PROTO(static inline tg_sol_fr_ptr CUT_prune_tg_solution_frames, (tg_sol_fr_p
** Tabling Macros ** ** Tabling Macros **
** ----------------------- */ ** ----------------------- */
#ifdef TAGS_FAST_OPS /* Tags_32Ops.h */
#define TabTagBits TagBits
#define TabNumberOfLowTagBits LowTagBits
#define TabVarTagBits MKTAG(0x0,0)
#define TabAtomTagBits AtomTag
#define TabNumberTagBits NumberTag
#define TabPairTagBits MKTAG(0x5,3)
#define TabApplTagBits MKTAG(0x5,0)
#else /* Tags_32LowTag.h */
#define TabTagBits MKTAG(0x0,LowTagBits)
#define TabNumberOfLowTagBits LowTagBits
#define TabVarTagBits MKTAG(0x0,0)
#define TabAtomTagBits AtomTag
#define TabNumberTagBits NumberTag
#define TabPairTagBits PairBits
#define TabApplTagBits ApplBit
#endif /* TAGS_FAST_OPS */
#define NORM_CP(CP) ((choiceptr)(CP)) #define NORM_CP(CP) ((choiceptr)(CP))
#define CONS_CP(CP) ((struct consumer_choicept *)(CP)) #define CONS_CP(CP) ((struct consumer_choicept *)(CP))
#define GEN_CP(CP) ((struct generator_choicept *)(CP)) #define GEN_CP(CP) ((struct generator_choicept *)(CP))
@ -124,8 +120,8 @@ STD_PROTO(static inline tg_sol_fr_ptr CUT_prune_tg_solution_frames, (tg_sol_fr_p
#endif /* YAPOR */ #endif /* YAPOR */
#define MakeTableVarTerm(INDEX) (INDEX << TabNumberOfLowTagBits) #define MakeTableVarTerm(INDEX) (INDEX << LowTagBits)
#define VarIndexOfTableTerm(TERM) (TERM >> TabNumberOfLowTagBits) #define VarIndexOfTableTerm(TERM) (TERM >> LowTagBits)
#define VarIndexOfTerm(TERM) \ #define VarIndexOfTerm(TERM) \
((((CELL) TERM) - GLOBAL_table_var_enumerator(0)) / sizeof(CELL)) ((((CELL) TERM) - GLOBAL_table_var_enumerator(0)) / sizeof(CELL))
#define IsTableVarTerm(TERM) \ #define IsTableVarTerm(TERM) \
@ -322,7 +318,7 @@ STD_PROTO(static inline tg_sol_fr_ptr CUT_prune_tg_solution_frames, (tg_sol_fr_p
#define ANSWER_HASH_MARK 0 #define ANSWER_HASH_MARK 0
#define IS_SUBGOAL_HASH(NODE) (TrNode_entry(NODE) == SUBGOAL_HASH_MARK) #define IS_SUBGOAL_HASH(NODE) (TrNode_entry(NODE) == SUBGOAL_HASH_MARK)
#define IS_ANSWER_HASH(NODE) (TrNode_instr(NODE) == ANSWER_HASH_MARK) #define IS_ANSWER_HASH(NODE) (TrNode_instr(NODE) == ANSWER_HASH_MARK)
#define HASH_TERM(TERM, SEED) (((TERM) >> TabNumberOfLowTagBits) & (SEED)) #define HASH_TERM(TERM, SEED) (((TERM) >> LowTagBits) & (SEED))
#define new_subgoal_hash(HASH, NUM_NODES, TAB_ENT) \ #define new_subgoal_hash(HASH, NUM_NODES, TAB_ENT) \

View File

@ -1,3 +1,14 @@
/**********************************************************************
The OPTYap Prolog system
OPTYap extends the Yap Prolog system to support or-parallel tabling
Copyright: R. Rocha and NCC - University of Porto, Portugal
File: tab.tries.C
version: $Id: tab.tries.c,v 1.9 2005-05-31 08:17:46 ricroc Exp $
**********************************************************************/
/* ------------------ ** /* ------------------ **
** Includes ** ** Includes **
** ------------------ */ ** ------------------ */
@ -671,43 +682,35 @@ sg_fr_ptr subgoal_search(tab_ent_ptr tab_ent, OPREG arity, CELL **Yaddr) {
STACK_CHECK_EXPAND1(stack_terms, stack_terms_limit, stack_terms_base); STACK_CHECK_EXPAND1(stack_terms, stack_terms_limit, stack_terms_base);
do { do {
Term t = Deref(STACK_POP_DOWN(stack_terms)); Term t = Deref(STACK_POP_DOWN(stack_terms));
int tag = t & TabTagBits; if (IsVarTerm(t)) {
switch (tag) { if (IsTableVarTerm(t)) {
case TabVarTagBits: t = MakeTableVarTerm(VarIndexOfTerm(t));
if (IsTableVarTerm(t)) { current_sg_node = subgoal_trie_node_check_insert(tab_ent, current_sg_node, t);
t = MakeTableVarTerm(VarIndexOfTerm(t)); } else {
current_sg_node = subgoal_trie_node_check_insert(tab_ent, current_sg_node, t); if (count_vars == MAX_TABLE_VARS)
} else { Yap_Error(INTERNAL_ERROR, TermNil, "MAX_TABLE_VARS exceeded (subgoal_search)");
if (count_vars == MAX_TABLE_VARS) STACK_PUSH_UP(t, stack_vars);
Yap_Error(INTERNAL_ERROR, TermNil, "MAX_TABLE_VARS exceeded (subgoal_search)"); *((CELL *)t) = GLOBAL_table_var_enumerator(count_vars);
STACK_PUSH_UP(t, stack_vars); t = MakeTableVarTerm(count_vars);
*((CELL *)t) = GLOBAL_table_var_enumerator(count_vars); count_vars++;
t = MakeTableVarTerm(count_vars); current_sg_node = subgoal_trie_node_check_insert(tab_ent, current_sg_node, t);
count_vars++; }
current_sg_node = subgoal_trie_node_check_insert(tab_ent, current_sg_node, t); } else if (IsAtomOrIntTerm(t)) {
} current_sg_node = subgoal_trie_node_check_insert(tab_ent, current_sg_node, t);
break; } else if (IsPairTerm(t)) {
case TabAtomTagBits: current_sg_node = subgoal_trie_node_check_insert(tab_ent, current_sg_node, AbsPair(NULL));
case TabNumberTagBits: STACK_PUSH_UP(*(RepPair(t) + 1), stack_terms);
current_sg_node = subgoal_trie_node_check_insert(tab_ent, current_sg_node, t); STACK_CHECK_EXPAND1(stack_terms, stack_terms_limit, stack_terms_base);
break; STACK_PUSH_UP(*(RepPair(t)), stack_terms);
case TabPairTagBits: STACK_CHECK_EXPAND1(stack_terms, stack_terms_limit, stack_terms_base);
current_sg_node = subgoal_trie_node_check_insert(tab_ent, current_sg_node, TabPairTagBits); } else if (IsApplTerm(t)) {
STACK_PUSH_UP(*(RepPair(t) + 1), stack_terms); current_sg_node = subgoal_trie_node_check_insert(tab_ent, current_sg_node, AbsAppl((Term *)FunctorOfTerm(t)));
for (j = ArityOfFunctor(FunctorOfTerm(t)); j >= 1; j--) {
STACK_PUSH_UP(*(RepAppl(t) + j), stack_terms);
STACK_CHECK_EXPAND1(stack_terms, stack_terms_limit, stack_terms_base); STACK_CHECK_EXPAND1(stack_terms, stack_terms_limit, stack_terms_base);
STACK_PUSH_UP(*(RepPair(t)), stack_terms); }
STACK_CHECK_EXPAND1(stack_terms, stack_terms_limit, stack_terms_base); } else {
break; Yap_Error(INTERNAL_ERROR, TermNil, "unknown type tag (subgoal_search)");
case TabApplTagBits:
current_sg_node = subgoal_trie_node_check_insert(tab_ent, current_sg_node,
TAGGEDA(TabApplTagBits, FunctorOfTerm(t)));
for (j = ArityOfFunctor(FunctorOfTerm(t)); j >= 1; j--) {
STACK_PUSH_UP(*(RepAppl(t) + j), stack_terms);
STACK_CHECK_EXPAND1(stack_terms, stack_terms_limit, stack_terms_base);
}
break;
default:
Yap_Error(INTERNAL_ERROR, TermNil, "unknown type tag (subgoal_search)");
} }
} while (STACK_NOT_EMPTY(stack_terms, stack_terms_base)); } while (STACK_NOT_EMPTY(stack_terms, stack_terms_base));
} }
@ -758,49 +761,41 @@ ans_node_ptr answer_search(sg_fr_ptr sg_fr, CELL *subs_ptr) {
STACK_PUSH_UP(*(subs_ptr + i), stack_terms); STACK_PUSH_UP(*(subs_ptr + i), stack_terms);
STACK_CHECK_EXPAND1(stack_terms, stack_vars, stack_terms_base); STACK_CHECK_EXPAND1(stack_terms, stack_vars, stack_terms_base);
#ifdef TABLING_ERRORS #ifdef TABLING_ERRORS
if ((*stack_terms & TabTagBits) != TabVarTagBits) if (IsNonVarTerm(*stack_terms))
TABLING_ERROR_MESSAGE("*stack_terms & TabTagBits != TabVarTagBits (answer_search)"); TABLING_ERROR_MESSAGE("IsNonVarTem(*stack_terms) (answer_search)");
#endif /* TABLING_ERRORS */ #endif /* TABLING_ERRORS */
do { do {
Term t = Deref(STACK_POP_DOWN(stack_terms)); Term t = Deref(STACK_POP_DOWN(stack_terms));
int tag = t & TabTagBits; if (IsVarTerm(t)) {
switch (tag) { if (IsTableVarTerm(t)) {
case TabVarTagBits: t = MakeTableVarTerm(VarIndexOfTerm(t));
if (IsTableVarTerm(t)) { current_ans_node = answer_trie_node_check_insert(sg_fr, current_ans_node, t, _trie_retry_val);
t = MakeTableVarTerm(VarIndexOfTerm(t)); } else {
current_ans_node = answer_trie_node_check_insert(sg_fr, current_ans_node, t, _trie_retry_val); if (count_vars == MAX_TABLE_VARS)
} else { Yap_Error(INTERNAL_ERROR, TermNil, "MAX_TABLE_VARS exceeded (answer_search)");
if (count_vars == MAX_TABLE_VARS) STACK_PUSH_DOWN(t, stack_vars);
Yap_Error(INTERNAL_ERROR, TermNil, "MAX_TABLE_VARS exceeded (answer_search)");
STACK_PUSH_DOWN(t, stack_vars);
STACK_CHECK_EXPAND1(stack_terms, stack_vars, stack_terms_base);
*((CELL *)t) = GLOBAL_table_var_enumerator(count_vars);
t = MakeTableVarTerm(count_vars);
count_vars++;
current_ans_node = answer_trie_node_check_insert(sg_fr, current_ans_node, t, _trie_retry_var);
}
break;
case TabAtomTagBits:
case TabNumberTagBits:
current_ans_node = answer_trie_node_check_insert(sg_fr, current_ans_node, t, _trie_retry_atom);
break;
case TabPairTagBits:
current_ans_node = answer_trie_node_check_insert(sg_fr, current_ans_node, TabPairTagBits, _trie_retry_list);
STACK_PUSH_UP(*(RepPair(t) + 1), stack_terms);
STACK_CHECK_EXPAND1(stack_terms, stack_vars, stack_terms_base); STACK_CHECK_EXPAND1(stack_terms, stack_vars, stack_terms_base);
STACK_PUSH_UP(*(RepPair(t)), stack_terms); *((CELL *)t) = GLOBAL_table_var_enumerator(count_vars);
t = MakeTableVarTerm(count_vars);
count_vars++;
current_ans_node = answer_trie_node_check_insert(sg_fr, current_ans_node, t, _trie_retry_var);
}
} else if (IsAtomOrIntTerm(t)) {
current_ans_node = answer_trie_node_check_insert(sg_fr, current_ans_node, t, _trie_retry_atom);
} else if (IsPairTerm(t)) {
current_ans_node = answer_trie_node_check_insert(sg_fr, current_ans_node, AbsPair(NULL), _trie_retry_list);
STACK_PUSH_UP(*(RepPair(t) + 1), stack_terms);
STACK_CHECK_EXPAND1(stack_terms, stack_vars, stack_terms_base);
STACK_PUSH_UP(*(RepPair(t)), stack_terms);
STACK_CHECK_EXPAND1(stack_terms, stack_vars, stack_terms_base);
} else if (IsApplTerm(t)) {
current_ans_node = answer_trie_node_check_insert(sg_fr, current_ans_node, AbsAppl((Term *)FunctorOfTerm(t)), _trie_retry_struct);
for (j = ArityOfFunctor(FunctorOfTerm(t)); j >= 1; j--) {
STACK_PUSH_UP(*(RepAppl(t) + j), stack_terms);
STACK_CHECK_EXPAND1(stack_terms, stack_vars, stack_terms_base); STACK_CHECK_EXPAND1(stack_terms, stack_vars, stack_terms_base);
break; }
case TabApplTagBits: } else {
current_ans_node = answer_trie_node_check_insert(sg_fr, current_ans_node, TAGGEDA(TabApplTagBits, Yap_Error(INTERNAL_ERROR, TermNil, "unknown type tag (answer_search)");
FunctorOfTerm(t)), _trie_retry_struct);
for (j = ArityOfFunctor(FunctorOfTerm(t)); j >= 1; j--) {
STACK_PUSH_UP(*(RepAppl(t) + j), stack_terms);
STACK_CHECK_EXPAND1(stack_terms, stack_vars, stack_terms_base);
}
break;
default:
Yap_Error(INTERNAL_ERROR, TermNil, "unknown type tag (answer_search)");
} }
} while (STACK_NOT_EMPTY(stack_terms, stack_terms_base)); } while (STACK_NOT_EMPTY(stack_terms, stack_terms_base));
} }
@ -843,107 +838,93 @@ void load_answer_trie(ans_node_ptr ans_node, CELL *subs_ptr) {
/* bind the substitution variables with the answer loaded in stack_terms */ /* bind the substitution variables with the answer loaded in stack_terms */
CELL *subs_var = (CELL *) *(subs_ptr + i); CELL *subs_var = (CELL *) *(subs_ptr + i);
Term t = STACK_POP_DOWN(stack_terms); Term t = STACK_POP_DOWN(stack_terms);
int tag = t & TabTagBits;
#ifdef TABLING_ERRORS #ifdef TABLING_ERRORS
if ((CELL)subs_var != *subs_var) if ((CELL)subs_var != *subs_var)
TABLING_ERROR_MESSAGE("subs_var != *subs_var (load_answer_trie)"); TABLING_ERROR_MESSAGE("subs_var != *subs_var (load_answer_trie)");
#endif /* TABLING_ERRORS */ #endif /* TABLING_ERRORS */
switch (tag) { if (IsVarTerm(t)) {
case TabVarTagBits: int var_index = VarIndexOfTableTerm(t);
{ int var_index = VarIndexOfTableTerm(t); if (var_index == n_vars) {
if (var_index == n_vars) { n_vars++;
n_vars++; STACK_PUSH_DOWN(subs_var, stack_vars);
STACK_PUSH_DOWN(subs_var, stack_vars); STACK_CHECK_EXPAND3(stack_refs, stack_vars, stack_refs_base, stack_terms, stack_terms_base);
STACK_CHECK_EXPAND3(stack_refs, stack_vars, stack_refs_base, stack_terms, stack_terms_base); } else {
} else { Bind(subs_var, stack_vars_base[var_index]);
Bind(subs_var, stack_vars_base[var_index]); }
} } else if (IsAtomOrIntTerm(t)) {
} break; Bind(subs_var, t);
case TabNumberTagBits: } else if (IsPairTerm(t)) {
case TabAtomTagBits: /* build a pair term as in function MkPairTerm */
Bind(subs_var, t); Bind(subs_var, AbsPair(H));
break;
case TabPairTagBits:
/* build a pair term as in function MkPairTerm */
Bind(subs_var, AbsPair(H));
#ifdef TABLING_ERRORS #ifdef TABLING_ERRORS
if ((*subs_var & TabTagBits) != TabPairTagBits) if (!IsPairTerm(*subs_var))
TABLING_ERROR_MESSAGE("*subs_var & TabTagBits != TabPairTagBits (load_answer_trie)"); TABLING_ERROR_MESSAGE("IsNonPairTerm(*subs_var) (load_answer_trie)");
#endif /* TABLING_ERRORS */ #endif /* TABLING_ERRORS */
H += 2; H += 2;
STACK_PUSH_UP(H - 1, stack_refs); STACK_PUSH_UP(H - 1, stack_refs);
STACK_CHECK_EXPAND3(stack_refs, stack_vars, stack_refs_base, stack_terms, stack_terms_base); STACK_CHECK_EXPAND3(stack_refs, stack_vars, stack_refs_base, stack_terms, stack_terms_base);
STACK_PUSH_UP(H - 2, stack_refs); STACK_PUSH_UP(H - 2, stack_refs);
STACK_CHECK_EXPAND3(stack_refs, stack_vars, stack_refs_base, stack_terms, stack_terms_base); STACK_CHECK_EXPAND3(stack_refs, stack_vars, stack_refs_base, stack_terms, stack_terms_base);
break; } else if (IsApplTerm(t)) {
case TabApplTagBits: /* build a pair term as in function MkApplTerm */
{ /* build a pair term as in function MkApplTerm */ Functor f = (Functor) RepAppl(t);
Functor f = (Functor)NonTagPart(t); int j, f_arity = ArityOfFunctor(f);
int j, f_arity = ArityOfFunctor(f); Bind(subs_var, AbsAppl(H));
Bind(subs_var, AbsAppl(H));
#ifdef TABLING_ERRORS #ifdef TABLING_ERRORS
if ((*subs_var & TabTagBits) != TabApplTagBits) if (!IsApplTerm(*subs_var))
TABLING_ERROR_MESSAGE("*subs_var & TabTagBits != TabApplTagBits (load_answer_trie)"); TABLING_ERROR_MESSAGE("IsNonApplTerm(*subs_var) (load_answer_trie)");
#endif /* TABLING_ERRORS */ #endif /* TABLING_ERRORS */
*H++ = (CELL) f; *H++ = (CELL) f;
H += f_arity; H += f_arity;
for (j = 1; j <= f_arity; j++) { for (j = 1; j <= f_arity; j++) {
STACK_PUSH_UP(H - j, stack_refs); STACK_PUSH_UP(H - j, stack_refs);
STACK_CHECK_EXPAND3(stack_refs, stack_vars, stack_refs_base, stack_terms, stack_terms_base); STACK_CHECK_EXPAND3(stack_refs, stack_vars, stack_refs_base, stack_terms, stack_terms_base);
} }
} break; } else {
default: Yap_Error(INTERNAL_ERROR, TermNil, "unknown type tag (load_answer_trie)");
Yap_Error(INTERNAL_ERROR, TermNil, "unknown type tag (load_answer_trie)");
} }
while (STACK_NOT_EMPTY(stack_refs, stack_refs_base)) { while (STACK_NOT_EMPTY(stack_refs, stack_refs_base)) {
CELL *ref = (CELL *) STACK_POP_DOWN(stack_refs); CELL *ref = (CELL *) STACK_POP_DOWN(stack_refs);
Term t = STACK_POP_DOWN(stack_terms); Term t = STACK_POP_DOWN(stack_terms);
int tag = t & TabTagBits; if (IsVarTerm(t)) {
switch (tag) { int var_index = VarIndexOfTableTerm(t);
case TabVarTagBits: if (var_index == n_vars) {
{ int var_index = VarIndexOfTableTerm(t); n_vars++;
if (var_index == n_vars) { STACK_PUSH_DOWN(ref, stack_vars);
n_vars++;
STACK_PUSH_DOWN(ref, stack_vars);
STACK_CHECK_EXPAND3(stack_refs, stack_vars, stack_refs_base, stack_terms, stack_terms_base);
}
*ref = stack_vars_base[var_index];
} break;
case TabNumberTagBits:
case TabAtomTagBits:
*ref = t;
break;
case TabPairTagBits:
/* build a pair term as in function MkPairTerm */
*ref = AbsPair(H);
#ifdef TABLING_ERRORS
if ((*ref & TabTagBits) != TabPairTagBits)
TABLING_ERROR_MESSAGE("*ref & TabTagBits != TabPairTagBits (load_answer_trie)");
#endif /* TABLING_ERRORS */
H += 2;
STACK_PUSH_UP(H - 1, stack_refs);
STACK_CHECK_EXPAND3(stack_refs, stack_vars, stack_refs_base, stack_terms, stack_terms_base); STACK_CHECK_EXPAND3(stack_refs, stack_vars, stack_refs_base, stack_terms, stack_terms_base);
STACK_PUSH_UP(H - 2, stack_refs); }
STACK_CHECK_EXPAND3(stack_refs, stack_vars, stack_refs_base, stack_terms, stack_terms_base); *ref = stack_vars_base[var_index];
break; } else if (IsAtomOrIntTerm(t)) {
case TabApplTagBits: *ref = t;
{ /* build a pair term as in function MkApplTerm */ } else if (IsPairTerm(t)) {
Functor f = (Functor)NonTagPart(t); /* build a pair term as in function MkPairTerm */
int j, f_arity = ArityOfFunctor(f); *ref = AbsPair(H);
*ref = AbsAppl(H);
#ifdef TABLING_ERRORS #ifdef TABLING_ERRORS
if ((*ref & TabTagBits) != TabApplTagBits) if (!IsPairTerm(*ref))
TABLING_ERROR_MESSAGE("*ref & TabTagBits != TabApplTagBits (load_answer_trie)"); TABLING_ERROR_MESSAGE("IsNonPairTerm(*ref) (load_answer_trie)");
#endif /* TABLING_ERRORS */ #endif /* TABLING_ERRORS */
*H++ = (CELL) f; H += 2;
H += f_arity; STACK_PUSH_UP(H - 1, stack_refs);
for (j = 1; j <= f_arity; j++) { STACK_CHECK_EXPAND3(stack_refs, stack_vars, stack_refs_base, stack_terms, stack_terms_base);
STACK_PUSH_UP(H - j, stack_refs); STACK_PUSH_UP(H - 2, stack_refs);
STACK_CHECK_EXPAND3(stack_refs, stack_vars, stack_refs_base, stack_terms, stack_terms_base); STACK_CHECK_EXPAND3(stack_refs, stack_vars, stack_refs_base, stack_terms, stack_terms_base);
} } else if (IsApplTerm(t)) {
} break; /* build a pair term as in function MkApplTerm */
default: Functor f = (Functor) RepAppl(t);
Yap_Error(INTERNAL_ERROR, TermNil, "unknown type tag (load_answer_trie)"); int j, f_arity = ArityOfFunctor(f);
*ref = AbsAppl(H);
#ifdef TABLING_ERRORS
if (!IsApplTerm(*ref))
TABLING_ERROR_MESSAGE("IsNonApplTerm(*ref) (load_answer_trie)");
#endif /* TABLING_ERRORS */
*H++ = (CELL) f;
H += f_arity;
for (j = 1; j <= f_arity; j++) {
STACK_PUSH_UP(H - j, stack_refs);
STACK_CHECK_EXPAND3(stack_refs, stack_vars, stack_refs_base, stack_terms, stack_terms_base);
}
} else {
Yap_Error(INTERNAL_ERROR, TermNil, "unknown type tag (load_answer_trie)");
} }
} }
} }
@ -980,28 +961,20 @@ void private_completion(sg_fr_ptr sg_fr) {
void free_subgoal_trie_branch(sg_node_ptr node, int missing_nodes) { void free_subgoal_trie_branch(sg_node_ptr node, int missing_nodes) {
int tag;
Term t; Term t;
if (TrNode_next(node)) if (TrNode_next(node))
free_subgoal_trie_branch(TrNode_next(node), missing_nodes); free_subgoal_trie_branch(TrNode_next(node), missing_nodes);
missing_nodes -= 1;
t = TrNode_entry(node); t = TrNode_entry(node);
tag = t & TabTagBits; if (IsVarTerm(t) || IsAtomOrIntTerm(t)) {
switch (tag) { missing_nodes -= 1;
case TabVarTagBits: } else if (IsPairTerm(t)) {
case TabNumberTagBits: missing_nodes += 1;
case TabAtomTagBits: } else if (IsApplTerm(t)) {
break; missing_nodes += ArityOfFunctor((Functor)RepAppl(t)) - 1;
case TabPairTagBits: } else {
missing_nodes += 2; Yap_Error(INTERNAL_ERROR, TermNil, "unknown type tag (chain_subgoal_frames)");
break;
case TabApplTagBits:
missing_nodes += ArityOfFunctor((Functor)NonTagPart(t));
break;
default:
Yap_Error(INTERNAL_ERROR, TermNil, "unknown type tag (chain_subgoal_frames)");
} }
if (missing_nodes) { if (missing_nodes) {
free_subgoal_trie_branch(TrNode_child(node), missing_nodes); free_subgoal_trie_branch(TrNode_child(node), missing_nodes);
@ -1155,7 +1128,6 @@ void traverse_trie(FILE *stream, sg_node_ptr sg_node, int pred_arity, Atom pred_
static static
int traverse_subgoal_trie(FILE *stream, sg_node_ptr sg_node, char *str, int str_index, int *arity, int depth) { int traverse_subgoal_trie(FILE *stream, sg_node_ptr sg_node, char *str, int str_index, int *arity, int depth) {
int tag;
Term t; Term t;
int new_arity[100]; int new_arity[100];
@ -1235,107 +1207,101 @@ int traverse_subgoal_trie(FILE *stream, sg_node_ptr sg_node, char *str, int str_
return FALSE; return FALSE;
t = TrNode_entry(sg_node); t = TrNode_entry(sg_node);
tag = t & TabTagBits; if (IsVarTerm(t)) {
switch (tag) { str_index += sprintf(& str[str_index], "VAR%d", VarIndexOfTableTerm(t));
case TabVarTagBits: while (arity[0]) {
str_index += sprintf(& str[str_index], "VAR%d", VarIndexOfTableTerm(t)); if (arity[arity[0]] > 0) {
while (arity[0]) { arity[arity[0]]--;
if (arity[arity[0]] > 0) { if (arity[arity[0]] == 0) {
arity[arity[0]]--; str_index += sprintf(& str[str_index], ")");
if (arity[arity[0]] == 0) { arity[0]--;
str_index += sprintf(& str[str_index], ")");
arity[0]--;
} else {
str_index += sprintf(& str[str_index], ",");
break;
}
} else { } else {
arity[arity[0]]++; str_index += sprintf(& str[str_index], ",");
if (arity[arity[0]] == 0) { break;
str_index += sprintf(& str[str_index], "]");
arity[0]--;
} else {
str_index += sprintf(& str[str_index], "|");
break;
}
} }
}
break;
case TabNumberTagBits:
str_index += sprintf(& str[str_index], "%d", IntOfTerm(t));
while (arity[0]) {
if (arity[arity[0]] > 0) {
arity[arity[0]]--;
if (arity[arity[0]] == 0) {
str_index += sprintf(& str[str_index], ")");
arity[0]--;
} else {
str_index += sprintf(& str[str_index], ",");
break;
}
} else {
arity[arity[0]]++;
if (arity[arity[0]] == 0) {
str[str_index] = 0;
SHOW_INFO("%s --> TRIE ERROR: pair without end atom '[]' !!!\n", str);
return FALSE;
}
str_index += sprintf(& str[str_index], "|");
break;
}
}
break;
case TabAtomTagBits:
if (arity[arity[0]] == -1) {
if (strcmp("[]", AtomName(AtomOfTerm(t)))) {
str[str_index] = 0;
SHOW_INFO("%s --> TRIE ERROR: pair without end atom '[]' !!!\n", str);
return FALSE;
}
str[str_index - 1] = ']';
arity[0]--;
} else { } else {
str_index += sprintf(& str[str_index], "%s", AtomName(AtomOfTerm(t))); arity[arity[0]]++;
} if (arity[arity[0]] == 0) {
while (arity[0]) { str_index += sprintf(& str[str_index], "]");
if (arity[arity[0]] > 0) { arity[0]--;
arity[arity[0]]--;
if (arity[arity[0]] == 0) {
str_index += sprintf(& str[str_index], ")");
arity[0]--;
} else {
str_index += sprintf(& str[str_index], ",");
break;
}
} else { } else {
arity[arity[0]]++; str_index += sprintf(& str[str_index], "|");
if (arity[arity[0]] == 0) { break;
str[str_index] = 0;
SHOW_INFO("%s --> TRIE ERROR: pair without end atom '[]' !!!\n", str);
return FALSE;
}
str_index += sprintf(& str[str_index], "|");
break;
} }
} }
break; }
case TabPairTagBits: } else if (IsIntTerm(t)) {
if (arity[arity[0]] == -1) { str_index += sprintf(& str[str_index], "%d", IntOfTerm(t));
str[str_index - 1] = ','; while (arity[0]) {
arity[arity[0]] = -2; if (arity[arity[0]] > 0) {
arity[arity[0]]--;
if (arity[arity[0]] == 0) {
str_index += sprintf(& str[str_index], ")");
arity[0]--;
} else {
str_index += sprintf(& str[str_index], ",");
break;
}
} else { } else {
str_index += sprintf(& str[str_index], "["); arity[arity[0]]++;
arity[0]++; if (arity[arity[0]] == 0) {
arity[arity[0]] = -2; str[str_index] = 0;
SHOW_INFO("%s --> TRIE ERROR: pair without end atom '[]' !!!\n", str);
return FALSE;
}
str_index += sprintf(& str[str_index], "|");
break;
} }
break; }
case TabApplTagBits: } else if (IsAtomTerm(t)) {
str_index += sprintf(& str[str_index], "%s(", AtomName(NameOfFunctor((Functor)NonTagPart(t)))); if (arity[arity[0]] == -1) {
if (strcmp("[]", AtomName(AtomOfTerm(t)))) {
str[str_index] = 0;
SHOW_INFO("%s --> TRIE ERROR: pair without end atom '[]' !!!\n", str);
return FALSE;
}
str[str_index - 1] = ']';
arity[0]--;
} else {
str_index += sprintf(& str[str_index], "%s", AtomName(AtomOfTerm(t)));
}
while (arity[0]) {
if (arity[arity[0]] > 0) {
arity[arity[0]]--;
if (arity[arity[0]] == 0) {
str_index += sprintf(& str[str_index], ")");
arity[0]--;
} else {
str_index += sprintf(& str[str_index], ",");
break;
}
} else {
arity[arity[0]]++;
if (arity[arity[0]] == 0) {
str[str_index] = 0;
SHOW_INFO("%s --> TRIE ERROR: pair without end atom '[]' !!!\n", str);
return FALSE;
}
str_index += sprintf(& str[str_index], "|");
break;
}
}
} else if (IsPairTerm(t)) {
if (arity[arity[0]] == -1) {
str[str_index - 1] = ',';
arity[arity[0]] = -2;
} else {
str_index += sprintf(& str[str_index], "[");
arity[0]++; arity[0]++;
arity[arity[0]] = ArityOfFunctor((Functor)NonTagPart(t)); arity[arity[0]] = -2;
break; }
default: } else if (IsApplTerm(t)) {
Yap_Error(INTERNAL_ERROR, TermNil, "unknown type tag (traverse_subgoal_trie)"); Functor f = (Functor) RepAppl(t);
str_index += sprintf(& str[str_index], "%s(", AtomName(NameOfFunctor(f)));
arity[0]++;
arity[arity[0]] = ArityOfFunctor(f);
} else {
Yap_Error(INTERNAL_ERROR, TermNil, "unknown type tag (traverse_subgoal_trie)");
} }
if (! traverse_subgoal_trie(stream, TrNode_child(sg_node), str, str_index, arity, depth + 1)) if (! traverse_subgoal_trie(stream, TrNode_child(sg_node), str, str_index, arity, depth + 1))
@ -1346,7 +1312,6 @@ int traverse_subgoal_trie(FILE *stream, sg_node_ptr sg_node, char *str, int str_
static static
int traverse_answer_trie(FILE *stream, ans_node_ptr ans_node, char *str, int str_index, int *arity, int var_index, int depth) { int traverse_answer_trie(FILE *stream, ans_node_ptr ans_node, char *str, int str_index, int *arity, int var_index, int depth) {
int tag;
Term t; Term t;
int new_arity[100]; int new_arity[100];
@ -1363,107 +1328,102 @@ int traverse_answer_trie(FILE *stream, ans_node_ptr ans_node, char *str, int str
} }
t = TrNode_entry(ans_node); t = TrNode_entry(ans_node);
tag = t & TabTagBits;
switch (tag) { if (IsVarTerm(t)) {
case TabVarTagBits: str_index += sprintf(& str[str_index], "ANSVAR%d", VarIndexOfTableTerm(t));
str_index += sprintf(& str[str_index], "ANSVAR%d", VarIndexOfTableTerm(t)); while (arity[0]) {
while (arity[0]) { if (arity[arity[0]] > 0) {
if (arity[arity[0]] > 0) { arity[arity[0]]--;
arity[arity[0]]--; if (arity[arity[0]] == 0) {
if (arity[arity[0]] == 0) { str_index += sprintf(& str[str_index], ")");
str_index += sprintf(& str[str_index], ")"); arity[0]--;
arity[0]--;
} else {
str_index += sprintf(& str[str_index], ",");
break;
}
} else { } else {
arity[arity[0]]++; str_index += sprintf(& str[str_index], ",");
if (arity[arity[0]] == 0) { break;
str_index += sprintf(& str[str_index], "]");
arity[0]--;
} else {
str_index += sprintf(& str[str_index], "|");
break;
}
} }
}
break;
case TabNumberTagBits:
str_index += sprintf(& str[str_index], "%d", IntOfTerm(t));
while (arity[0]) {
if (arity[arity[0]] > 0) {
arity[arity[0]]--;
if (arity[arity[0]] == 0) {
str_index += sprintf(& str[str_index], ")");
arity[0]--;
} else {
str_index += sprintf(& str[str_index], ",");
break;
}
} else {
arity[arity[0]]++;
if (arity[arity[0]] == 0) {
str[str_index] = 0;
SHOW_INFO("%s --> TRIE ERROR: pair without end atom '[]' !!!\n", str);
return FALSE;
}
str_index += sprintf(& str[str_index], "|");
break;
}
}
break;
case TabAtomTagBits:
if (arity[arity[0]] == -1) {
if (strcmp("[]", AtomName(AtomOfTerm(t)))) {
str[str_index] = 0;
SHOW_INFO("%s --> TRIE ERROR: pair without end atom '[]' !!!\n", str);
return FALSE;
}
str[str_index - 1] = ']';
arity[0]--;
} else { } else {
str_index += sprintf(& str[str_index], "%s", AtomName(AtomOfTerm(t))); arity[arity[0]]++;
} if (arity[arity[0]] == 0) {
while (arity[0]) { str_index += sprintf(& str[str_index], "]");
if (arity[arity[0]] > 0) { arity[0]--;
arity[arity[0]]--;
if (arity[arity[0]] == 0) {
str_index += sprintf(& str[str_index], ")");
arity[0]--;
} else {
str_index += sprintf(& str[str_index], ",");
break;
}
} else { } else {
arity[arity[0]]++; str_index += sprintf(& str[str_index], "|");
if (arity[arity[0]] == 0) { break;
str[str_index] = 0;
SHOW_INFO("%s --> TRIE ERROR: pair without end atom '[]' !!!\n", str);
return FALSE;
}
str_index += sprintf(& str[str_index], "|");
break;
} }
} }
break; }
case TabPairTagBits: } else if (IsIntTerm(t)) {
if (arity[arity[0]] == -1) { str_index += sprintf(& str[str_index], "%d", IntOfTerm(t));
str[str_index - 1] = ','; while (arity[0]) {
arity[arity[0]] = -2; if (arity[arity[0]] > 0) {
arity[arity[0]]--;
if (arity[arity[0]] == 0) {
str_index += sprintf(& str[str_index], ")");
arity[0]--;
} else {
str_index += sprintf(& str[str_index], ",");
break;
}
} else { } else {
str_index += sprintf(& str[str_index], "["); arity[arity[0]]++;
arity[0]++; if (arity[arity[0]] == 0) {
arity[arity[0]] = -2; str[str_index] = 0;
SHOW_INFO("%s --> TRIE ERROR: pair without end atom '[]' !!!\n", str);
return FALSE;
}
str_index += sprintf(& str[str_index], "|");
break;
} }
break; }
case TabApplTagBits: } else if (IsAtomTerm(t)) {
str_index += sprintf(& str[str_index], "%s(", AtomName(NameOfFunctor((Functor)NonTagPart(t)))); if (arity[arity[0]] == -1) {
if (strcmp("[]", AtomName(AtomOfTerm(t)))) {
str[str_index] = 0;
SHOW_INFO("%s --> TRIE ERROR: pair without end atom '[]' !!!\n", str);
return FALSE;
}
str[str_index - 1] = ']';
arity[0]--;
} else {
str_index += sprintf(& str[str_index], "%s", AtomName(AtomOfTerm(t)));
}
while (arity[0]) {
if (arity[arity[0]] > 0) {
arity[arity[0]]--;
if (arity[arity[0]] == 0) {
str_index += sprintf(& str[str_index], ")");
arity[0]--;
} else {
str_index += sprintf(& str[str_index], ",");
break;
}
} else {
arity[arity[0]]++;
if (arity[arity[0]] == 0) {
str[str_index] = 0;
SHOW_INFO("%s --> TRIE ERROR: pair without end atom '[]' !!!\n", str);
return FALSE;
}
str_index += sprintf(& str[str_index], "|");
break;
}
}
} else if (IsPairTerm(t)) {
if (arity[arity[0]] == -1) {
str[str_index - 1] = ',';
arity[arity[0]] = -2;
} else {
str_index += sprintf(& str[str_index], "[");
arity[0]++; arity[0]++;
arity[arity[0]] = ArityOfFunctor((Functor)NonTagPart(t)); arity[arity[0]] = -2;
break; }
default: } else if (IsApplTerm(t)) {
Yap_Error(INTERNAL_ERROR, TermNil, "unknown type tag (traverse_answer_trie)"); Functor f = (Functor) RepAppl(t);
str_index += sprintf(& str[str_index], "%s(", AtomName(NameOfFunctor(f)));
arity[0]++;
arity[arity[0]] = ArityOfFunctor(f);
} else {
Yap_Error(INTERNAL_ERROR, TermNil, "unknown type tag (traverse_answer_trie)");
} }
if (! IS_ANSWER_LEAF_NODE(ans_node)) { if (! IS_ANSWER_LEAF_NODE(ans_node)) {

View File

@ -1,3 +1,14 @@
/**********************************************************************
The OPTYap Prolog system
OPTYap extends the Yap Prolog system to support or-parallel tabling
Copyright: R. Rocha and NCC - University of Porto, Portugal
File: tab.tries.insts.i
version: $Id: tab.tries.insts.i,v 1.6 2005-05-31 08:18:19 ricroc Exp $
**********************************************************************/
/* ----------------------------------------------- ** /* ----------------------------------------------- **
** Trie instructions: stack organization ** ** Trie instructions: stack organization **
** ----------------------------------------------- */ ** ----------------------------------------------- */
@ -703,7 +714,7 @@
int heap_arity = *aux_ptr; int heap_arity = *aux_ptr;
int vars_arity = *(aux_ptr + heap_arity + 1); int vars_arity = *(aux_ptr + heap_arity + 1);
int subs_arity = *(aux_ptr + heap_arity + 2); int subs_arity = *(aux_ptr + heap_arity + 2);
Functor func = (Functor) NonTagPart(TrNode_entry(node)); Functor func = (Functor) RepAppl(TrNode_entry(node));
int func_arity = ArityOfFunctor(func); int func_arity = ArityOfFunctor(func);
int i; int i;
@ -717,7 +728,7 @@
int heap_arity = *aux_ptr; int heap_arity = *aux_ptr;
int vars_arity = *(aux_ptr + heap_arity + 1); int vars_arity = *(aux_ptr + heap_arity + 1);
int subs_arity = *(aux_ptr + heap_arity + 2); int subs_arity = *(aux_ptr + heap_arity + 2);
Functor func = (Functor) NonTagPart(TrNode_entry(node)); Functor func = (Functor) RepAppl(TrNode_entry(node));
int func_arity = ArityOfFunctor(func); int func_arity = ArityOfFunctor(func);
int i; int i;
@ -732,7 +743,7 @@
int heap_arity = *aux_ptr; int heap_arity = *aux_ptr;
int vars_arity = *(aux_ptr + heap_arity + 1); int vars_arity = *(aux_ptr + heap_arity + 1);
int subs_arity = *(aux_ptr + heap_arity + 2); int subs_arity = *(aux_ptr + heap_arity + 2);
Functor func = (Functor) NonTagPart(TrNode_entry(node)); Functor func = (Functor) RepAppl(TrNode_entry(node));
int func_arity = ArityOfFunctor(func); int func_arity = ArityOfFunctor(func);
int i; int i;
@ -747,7 +758,7 @@
int heap_arity = *aux_ptr; int heap_arity = *aux_ptr;
int vars_arity = *(aux_ptr + heap_arity + 1); int vars_arity = *(aux_ptr + heap_arity + 1);
int subs_arity = *(aux_ptr + heap_arity + 2); int subs_arity = *(aux_ptr + heap_arity + 2);
Functor func = (Functor) NonTagPart(TrNode_entry(node)); Functor func = (Functor) RepAppl(TrNode_entry(node));
int func_arity = ArityOfFunctor(func); int func_arity = ArityOfFunctor(func);
int i; int i;