ACTerm_p ACTermNormalize(Sig_p sig, Term_p term) { ACTerm_p handle = ACTermAlloc(term->f_code); if(!TermIsVar(term) && (term->arity != 0)) { int i; if(SigQueryFuncProp(sig, term->f_code, FPIsAC)) { PTree_p args = NULL, cell; PStack_p stack; ac_collect_args(&args, sig, term->f_code, term); i=0; stack = PTreeTraverseInit(args); while((cell = PTreeTraverseNext(stack))) { PDArrayAssignP(handle->args,i++, cell->key); } PTreeTraverseExit(stack); PTreeFree(args); } else if(SigQueryFuncProp(sig, term->f_code, FPCommutative)) { ACTerm_p t1, t2, tmp; t1 = ACTermNormalize(sig,term->args[0]); t2 = ACTermNormalize(sig,term->args[1]); if(ACTermCompare(t1, t2) > 0) { tmp = t1; t1 = t2; t2 = tmp; } PDArrayAssignP(handle->args,0,t1); PDArrayAssignP(handle->args,1,t2); } else { for(i=0; i<term->arity; i++) { PDArrayAssignP(handle->args,i, ACTermNormalize(sig,term->args[i])); } } } return handle; }
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; }