Exemple #1
0
/****************************************************************************
 * Writing out a bound variable                                             *
 ****************************************************************************/
static void PRINT_writeBVar(WordPtr outStream, DF_TermPtr tmPtr)
{
  int i;
  int bvind = DF_bvIndex(tmPtr);
  PRINT_BVList lbvs = PRINT_bvs;

  for (i = bvind; ((i != 1) && lbvs) ; i--) 
    lbvs = lbvs->next;

  // Is this checking and the else branch really necessary? 
  // Printing should start from top-level closed terms?
  if (lbvs) STREAM_printf(outStream, "%s", 
			  MCSTR_toCString(DF_strDataValue(lbvs->name)));
  else STREAM_printf(outStream, "#%d", i); 
}
Exemple #2
0
/* (weak) head normalize bound variable or implicit suspension with 
   bound variable as term skeleton. */
static DF_TermPtr HN_hnormBV(DF_TermPtr bvPtr, Boolean whnf)
{
							
    DF_TermPtr rtPtr; //term pointer to be returned
    if (HN_isEmptyEnv()){                        //[|#i, 0, 0, nil|] -> #i
        rtPtr = bvPtr;
        HNL_setRegsRig(bvPtr);
    } else { //non-empty env       
        int dbind = DF_bvIndex(bvPtr);

        if (dbind > ol) {                        //[|#i,ol,nl,e|] -> #i-ol+nl
            int newind = dbind - ol + nl;

            AM_embedError(newind);
            rtPtr =(DF_TermPtr)AM_hreg;
            HNL_pushBV(newind); 
            HNL_setRegsRig(rtPtr);
            HN_setEmptyEnv();
        } else { // i <= ol
            DF_EnvPtr    envitem = DF_envListNth(envlist, dbind);
            int          nladj   = nl-DF_envIndex(envitem);

            if (DF_isDummyEnv(envitem)){         //[|#i,ol,nl,..@l..|]->#(nl-l)
                rtPtr = (DF_TermPtr)AM_hreg;
                HNL_pushBV(nladj); 
                HNL_setRegsRig(rtPtr);
                HN_setEmptyEnv();
            }  else { //pair env    [|#i,ol,nl,..(s,l)..|] -> [|s,0,(nl-l),nil|]
                DF_TermPtr tmPtr = DF_termDeref(DF_envPairTerm(envitem));
                if ((nladj != 0) && (DF_isSusp(tmPtr))) {//combine susp
                    int newnl = DF_suspNL(tmPtr)+nladj;
                    AM_embedError(newnl);
                    HN_setEnv(DF_suspOL(tmPtr), newnl, DF_suspEnv(tmPtr));
                    rtPtr = HN_hnormDispatch(DF_suspTermSkel(tmPtr), whnf);
                } else {      
                    HN_setEnv(0, nladj, DF_EMPTY_ENV); 
                    rtPtr = HN_hnormDispatch(tmPtr, whnf);
                }
            }         //pair env  
        }        // i<= ol    
    }        //non-empty env

    return rtPtr;    
}