Esempio n. 1
0
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;
}
Esempio n. 2
0
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;
}