POINTER st_ExistGenPreTest(CONTEXT IndexContext, st_INDEX StIndex, TERM Term) /************************************************************** INPUT: RETURNS: EFFECTS: ***************************************************************/ { SYMBOL FirstDomain; POINTER Result; #ifdef CHECK if (!st_StackEmpty(st_STACKSAVE)) { misc_StartErrorReport(); misc_ErrorReport("\n In st_ExistGenPreTest: ST-Stack not empty.\n"); misc_FinishErrorReport(); } else if (st_CURRENT_RETRIEVAL != st_NOP) { misc_StartErrorReport(); misc_ErrorReport("\n In st_ExistGenPreTest: %d Retrieval already in progress.\n", st_CURRENT_RETRIEVAL); misc_FinishErrorReport(); } #endif cont_Check(); if (st_Exist(StIndex)) { st_CURRENT_RETRIEVAL = st_GENPRETEST; st_WHICH_CONTEXTS = st_STANDARD; st_INDEX_CONTEXT = IndexContext; st_STACKSAVE = st_StackBottom(); FirstDomain = symbol_FirstIndexVariable(); st_EXIST_MINMAX = term_ComputeSize(Term); cont_CreateBinding(IndexContext, FirstDomain, IndexContext, Term); cont_StartBinding(); st_StackPush(StIndex->subnodes); cont_StartBinding(); Result = st_TraverseForExistGenPreTest(IndexContext); #ifdef CHECK cont_SaveState(); #endif if (Result == NULL) st_CancelExistRetrieval(); return Result; } else return NULL; }
BOOL cont_BindingsAreRenamingModuloMatching(const CONTEXT RenamingContext) { CONTEXT Context; #ifdef CHECK if (!cont_IsContextEmpty(RenamingContext)) { misc_StartErrorReport(); misc_ErrorReport("\n In cont_BindingsAreRenamingModuloMatching:"); misc_ErrorReport(" Renaming context contains bindings.\n"); misc_FinishErrorReport(); } #endif cont_StartBinding(); Context = cont_LastBinding(); while (Context) { if (!symbol_IsIndexVariable(cont_BindingSymbol(Context))) { SYMBOL CodomainSymbol; CodomainSymbol = term_TopSymbol(cont_BindingTerm(Context)); if (symbol_IsVariable(CodomainSymbol)) { if (cont_VarIsRenamed(RenamingContext, CodomainSymbol)) { cont_BackTrack(); return FALSE; } else { cont_CreateBinding(RenamingContext, CodomainSymbol, NULL, NULL); cont_SetContextBindingRenaming(RenamingContext, CodomainSymbol, CodomainSymbol); } } else { cont_BackTrack(); return FALSE; } } Context = cont_BindingLink(Context); } cont_BackTrack(); return TRUE; }
LIST st_GetInstancePreTest(CONTEXT IndexContext, st_INDEX StIndex, TERM Term) /************************************************************** INPUT: RETURNS: EFFECTS: ***************************************************************/ { LIST Result; SYMBOL FirstDomain; cont_Check(); FirstDomain = symbol_FirstIndexVariable(); cont_CreateBinding(IndexContext, FirstDomain, IndexContext, Term); Result = st_TraverseTreeInstancePreTest(IndexContext, StIndex, term_ComputeSize(Term)); cont_Reset(); return Result; }
LIST st_GetGen(CONTEXT IndexContext, st_INDEX StIndex, TERM Term) /************************************************************** INPUT: RETURNS: EFFECTS: ***************************************************************/ { LIST Result; SYMBOL FirstDomain; cont_Check(); FirstDomain = symbol_FirstIndexVariable(); cont_CreateBinding(IndexContext, FirstDomain, cont_InstanceContext(), Term); Result = st_TraverseTreeGen(IndexContext, StIndex); cont_Reset(); return Result; }
BOOL st_EntryDelete(st_INDEX StIndex, POINTER Pointer, TERM Term, const CONTEXT Context) /************************************************************** INPUT: RETURNS: EFFECTS: ***************************************************************/ { BOOL Found; LIST Subnodes; SYMBOL FirstDomain; cont_Check(); FirstDomain = symbol_FirstIndexVariable(); cont_CreateBinding(Context, FirstDomain, Context, Term); for (Found = FALSE, Subnodes = StIndex->subnodes; list_Exist(Subnodes); Subnodes = list_Cdr(Subnodes)) { st_INDEX CurrentNode; CurrentNode = (st_INDEX)list_Car(Subnodes); cont_StartBinding(); if (subst_Variation(Context, CurrentNode->subst)) { list_Rplaca(Subnodes, st_EntryDeleteHelp(Context, CurrentNode, Pointer, &Found)); if (Found) { StIndex->subnodes = list_PointerDeleteElement(StIndex->subnodes, NULL); if (list_Exist(StIndex->subnodes)) { CurrentNode = (st_INDEX)list_Car(StIndex->subnodes); st_SetMax(StIndex, st_Max(CurrentNode)); st_SetMin(StIndex, st_Min(CurrentNode)); for (Subnodes = list_Cdr(StIndex->subnodes); list_Exist(Subnodes); Subnodes = list_Cdr(Subnodes)) { CurrentNode = (st_INDEX)list_Car(Subnodes); if (st_Max(CurrentNode) > st_Max(StIndex)) st_SetMax(StIndex, st_Max(CurrentNode)); if (st_Min(CurrentNode) < st_Min(StIndex)) st_SetMin(StIndex, st_Min(CurrentNode)); } } else { st_SetMax(StIndex, 0); st_SetMin(StIndex, 0); } break; } } cont_BackTrack(); } cont_Reset(); return Found; }
void st_EntryCreate(st_INDEX StIndex, POINTER Pointer, TERM Term, const CONTEXT Context) /************************************************************** INPUT: RETURNS: EFFECTS: ***************************************************************/ { st_INDEX Current; st_INDEX BestNonVariant; SYMBOL FirstDomain; st_MINMAX MinMax; cont_Check(); MinMax = term_ComputeSize(Term); /* CREATE INITIAL BINDING AND INITIALIZE LOCAL VARIABLES */ FirstDomain = cont_NextIndexVariable(Context); cont_CreateBinding(Context, FirstDomain, Context, Term); Current = StIndex; if (st_Max(Current) < MinMax) st_SetMax(Current, MinMax); else if (st_Min(Current) > MinMax) st_SetMin(Current, MinMax); /* FIND "LAST" VARIATION */ while (!st_IsLeaf(Current) && (Current = st_FirstVariant(Context, Current->subnodes, &BestNonVariant))) { if (st_Max(Current) < MinMax) st_SetMax(Current, MinMax); else if (st_Min(Current) > MinMax) st_SetMin(Current, MinMax); StIndex = Current; } if (cont_BindingsSinceLastStart()==0 && Current && st_IsLeaf(Current)) { /* INSERT ENTRY EQUAL MODULO RENAMING */ Current->entries = list_Cons(Pointer, Current->entries); } else if (BestNonVariant) { /* CREATE INNER NODE AND A NEW LEAF */ SUBST ComGen, SubstOld, SubstNew; if (!st_IsLeaf(BestNonVariant)) st_CloseUsedVariables(Context, BestNonVariant->subnodes); ComGen = subst_ComGen(Context, BestNonVariant->subst, &SubstOld, &SubstNew); st_NodeAddInner(BestNonVariant, SubstOld, subst_CloseOpenVariables(SubstNew), ComGen, MinMax, Pointer); } else /* ADD A SINGLE LEAF NODE TO FATHER */ StIndex->subnodes = list_Cons(st_NodeAddLeaf(subst_CloseOpenVariables(subst_Nil()), MinMax, Pointer), StIndex->subnodes); cont_Reset(); }