bool TermVarSearchProp(Term_p term, DerefType deref, TermProperties prop) { PStack_p stack = PStackAlloc(); int i; bool res = false; PStackPushP(stack, term); PStackPushInt(stack, deref); while(!PStackEmpty(stack)) { deref = PStackPopInt(stack); term = PStackPopP(stack); term = TermDeref(term, &deref); if(TermIsVar(term) && TermCellQueryProp(term, prop)) { res = true; break; } for(i=0; i<term->arity; i++) { PStackPushP(stack, term->args[i]); PStackPushInt(stack, deref); } } PStackFree(stack); return res; }
Term_p VarBankFCodeAssertAlloc(VarBank_p bank, FunCode f_code) { Term_p var; assert(f_code < 0); var = VarBankFCodeFind(bank, f_code); if(!var) { var = TermDefaultCellAlloc(); var->entry_no = f_code; var->f_code = f_code; TermCellSetProp(var, TPIsShared); PDArrayAssignP(bank->f_code_index, -f_code, var); bank->max_var = MAX(-f_code, bank->max_var); } assert(!TermCellQueryProp(var, TPIsGround)); return var; }
Term_p term_top_marked(Term_p term, VarBank_p freshvars, PStack_p bindings) { Term_p handle; if(TermCellQueryProp(term, TPOpFlag)) { if(!term->binding) { handle = VarBankGetFreshVar(freshvars); term->binding = handle; PStackPushP(bindings, term); } else { handle = term->binding; } } else if(TermIsVar(term)) { handle = VarBankFCodeAssertAlloc(freshvars, term->f_code); } else { handle = TermDefaultCellAlloc(); handle->arity = term->arity; handle->f_code = term->f_code; if(handle->arity > 0) { int i; handle->args = TermArgArrayAlloc(handle->arity); for(i=0; i<handle->arity; i++) { handle->args[i] = term_top_marked(term->args[i], freshvars, bindings); } } } return handle; }
void TermFree(Term_p junk) { assert(junk); if(!TermIsVar(junk)) { assert(!TermCellQueryProp(junk, TPIsShared)); if(junk->arity) { int i; assert(junk->args); for(i=0; i<junk->arity; i++) { TermFree(junk->args[i]); } } else { assert(!junk->args); } TermTopFree(junk); } }
static void pdtree_forward(PDTree_p tree, Subst_p subst) { PDTNode_p handle = tree->tree_pos, next = NULL; FunCode i = tree->tree_pos->trav_count, limit; Term_p term = PStackTopP(tree->term_stack); limit = PDT_NODE_CLOSED(tree,handle); while(i<limit) { if(((i==0)||(i>handle->max_var))&&!TermIsVar(term)) { next = IntMapGetVal(handle->f_alternatives,term->f_code); i++; if(next) { PStackPushP(tree->term_proc, term); TermLRTraverseNext(tree->term_stack); next->trav_count = PDT_NODE_INIT_VAL(tree); next->bound = false; assert(!next->variable); tree->tree_pos = next; #ifdef MEASURE_EXPENSIVE tree->visited_count++; #endif break; } } else { next = PDArrayElementP(handle->v_alternatives,i); i++; if(next) { assert(next->variable); if((!next->variable->binding)&&(!TermCellQueryProp(term,TPPredPos))) { PStackDiscardTop(tree->term_stack); SubstAddBinding(subst, next->variable, term); next->trav_count = PDT_NODE_INIT_VAL(tree); next->bound = true; tree->tree_pos = next; tree->term_weight -= (TermStandardWeight(term) - TermStandardWeight(next->variable)); #ifdef MEASURE_EXPENSIVE tree->visited_count++; #endif break; } else if(TBTermEqual(next->variable->binding,term)) { PStackDiscardTop(tree->term_stack); next->trav_count = PDT_NODE_INIT_VAL(tree); next->bound = false; tree->tree_pos = next; tree->term_weight -= (TermStandardWeight(term) - TermStandardWeight(next->variable)); #ifdef MEASURE_EXPENSIVE tree->visited_count++; #endif break; } } } } handle->trav_count = i; }