SYMBOL cont_TermMaxVar(CONTEXT Context, TERM Term) /********************************************************* INPUT: A context and a term. RETURNS: The maximal variable in <Term> with respect to the bindings in <Context> ********************************************************/ { LIST scan; SYMBOL result; #ifdef CHECK if (!term_IsTerm(Term)) { misc_StartErrorReport(); misc_ErrorReport("\n In cont_TermMaxVar: Input term is corrupted.\n"); misc_FinishErrorReport(); } #endif Term = cont_Deref(&Context,Term); result = symbol_Null(); if (term_IsStandardVariable(Term)) { if (term_TopSymbol(Term) > result) result = term_TopSymbol(Term); } else { for (scan = term_ArgumentList(Term); !list_Empty(scan); scan = list_Cdr(scan)) { SYMBOL max = cont_TermMaxVar(Context, list_Car(scan)); if (max > result) result = max; } } return result; }
void cont_BackTrackLastBindingHelp(void) { cont_CURRENTBINDING = cont_LastBinding(); cont_SetLastBinding(cont_BindingLink(cont_CURRENTBINDING)); cont_SetBindingTerm(cont_CURRENTBINDING, NULL); cont_SetBindingContext(cont_CURRENTBINDING, NULL); cont_SetBindingRenaming(cont_CURRENTBINDING, symbol_Null()); cont_SetBindingLink(cont_CURRENTBINDING, NULL); cont_BINDINGS--; }
void cont_InitBinding(CONTEXT C, SYMBOL Var) /********************************************************** INPUT: A context and a variable. RETURNS: Nothing. EFFECT: Initializes a binding of variable in the given context. ********************************************************/ { cont_CURRENTBINDING = cont_Binding(C, Var); cont_SetBindingLink(cont_CURRENTBINDING, (CONTEXT)NULL); cont_SetBindingTerm(cont_CURRENTBINDING, (TERM)NULL); cont_SetBindingSymbol(cont_CURRENTBINDING, Var); cont_SetBindingRenaming(cont_CURRENTBINDING, symbol_Null()); cont_SetBindingContext(cont_CURRENTBINDING, (CONTEXT)NULL); }
void symbol_FPrint(FILE* File, SYMBOL Symbol) /************************************************************** INPUT: A file and a symbol. RETURNS: None. SUMMARY: Prints a symbol to the file. ***************************************************************/ { #ifdef CHECK if (!symbol_IsSymbol(Symbol)) { misc_StartErrorReport(); misc_ErrorReport("\n In symbol_FPrint: Illegal input.\n"); misc_FinishErrorReport(); } #endif if (symbol_Equal(symbol_Null(),Symbol)) fputs("NULL", File); else if (symbol_IsVariable(Symbol)) { SYMBOL NormSymbol; NormSymbol = symbol_NormVar(Symbol); if (symbol_IsStandardVariable(Symbol)) { if (Symbol <= 6) /* U, V, W, X, Y, Z */ sprintf(symbol_VARSTRING,"%c", 'U' + NormSymbol - 1); else /* X1, X2, X3, ... */ sprintf(symbol_VARSTRING,"X%d", NormSymbol - 6); } else if (symbol_IsIndexVariable(Symbol)) /* I1, I2, I3, ... */ sprintf(symbol_VARSTRING,"I%d", NormSymbol); fputs(symbol_VARSTRING, File); } else if (symbol_SignatureExists()) fputs(symbol_Name(Symbol), File); else fprintf(File, "%d", Symbol); }