📄 incrrset.c
字号:
{
if (joinPtr->firstJoin == TRUE)
{
if (((struct patternNodeHeader *) GetPatternForJoin(joinPtr))->initialize == FALSE)
{
PrimeJoin(theEnv,joinPtr);
joinPtr->marked = TRUE; /* GDR 6.05 */
}
}
else if (joinPtr->lastLevel->initialize == FALSE)
{
PrimeJoin(theEnv,joinPtr);
joinPtr->marked = TRUE; /* GDR 6.05 */
}
}
/*================================================================*/
/* If the join is associated with a rule activation (i.e. partial */
/* matches that reach this join cause an activation to be placed */
/* on the agenda), then add activations to the agenda for the */
/* rule being incrementally reset. */
/*================================================================*/
else if (joinPtr->ruleToActivate == tempRule)
{
for (theList = joinPtr->beta;
theList != NULL;
theList = theList->next)
{ AddActivation(theEnv,tempRule,theList); }
}
}
}
/****************************************************************************/
/* PrimeJoin: Updates a join in a rule for an incremental reset. Joins are */
/* updated by "priming" them only if the join (or its associated pattern) */
/* is shared with other rules that have already been incrementally reset. */
/* A join for a new rule will be updated if it is marked for */
/* initialization and either its parent join or its associated entry */
/* pattern node has not been marked for initialization. */
/****************************************************************************/
static void PrimeJoin(
void *theEnv,
struct joinNode *joinPtr)
{
struct partialMatch *theList;
/*===========================================================*/
/* If the join is the first join of a rule, then send all of */
/* the partial matches from the alpha memory of the pattern */
/* associated with this join to the join for processing and */
/* the priming process is then complete. */
/*===========================================================*/
if (joinPtr->firstJoin == TRUE)
{
for (theList = ((struct patternNodeHeader *) joinPtr->rightSideEntryStructure)->alphaMemory;
theList != NULL;
theList = theList->next)
{ NetworkAssert(theEnv,theList,joinPtr,RHS); }
return;
}
/*======================================================*/
/* If the join already has partial matches in its beta */
/* memory, then don't bother priming it. I don't recall */
/* if this situation is possible. */
/*======================================================*/
if (joinPtr->beta != NULL) return;
/*================================================================*/
/* Send all partial matches from the preceding join to this join. */
/*================================================================*/
for (theList = joinPtr->lastLevel->beta;
theList != NULL;
theList = theList->next)
{
if (! theList->counterf) /* 6.05 incremental reset bug fix */
{ NetworkAssert(theEnv,theList,joinPtr,LHS); }
}
}
/*********************************************************************/
/* MarkPatternForIncrementalReset: Given a pattern node and its type */
/* (fact, instance, etc.), calls the appropriate function to mark */
/* the pattern for an incremental reset. Used to mark the pattern */
/* nodes both before and after an incremental reset. */
/*********************************************************************/
static void MarkPatternForIncrementalReset(
void *theEnv,
int rhsType,
struct patternNodeHeader *theHeader,
int value)
{
struct patternParser *tempParser;
tempParser = GetPatternParser(theEnv,rhsType);
if (tempParser != NULL)
{
if (tempParser->markIRPatternFunction != NULL)
{ (*tempParser->markIRPatternFunction)(theEnv,theHeader,value); }
}
}
#endif
/********************************************/
/* EnvGetIncrementalReset: C access routine */
/* for the get-incremental-reset command. */
/********************************************/
globle intBool EnvGetIncrementalReset(
void *theEnv)
{
return(EngineData(theEnv)->IncrementalResetFlag);
}
/********************************************/
/* EnvSetIncrementalReset: C access routine */
/* for the set-incremental-reset command. */
/********************************************/
globle intBool EnvSetIncrementalReset(
void *theEnv,
int value)
{
int ov;
ov = EngineData(theEnv)->IncrementalResetFlag;
if (EnvGetNextDefrule(theEnv,NULL) != NULL) return(-1);
EngineData(theEnv)->IncrementalResetFlag = value;
return(ov);
}
/****************************************************/
/* SetIncrementalResetCommand: H/L access routine */
/* for the set-incremental-reset command. */
/****************************************************/
globle int SetIncrementalResetCommand(
void *theEnv)
{
int oldValue;
DATA_OBJECT argPtr;
oldValue = EnvGetIncrementalReset(theEnv);
/*============================================*/
/* Check for the correct number of arguments. */
/*============================================*/
if (EnvArgCountCheck(theEnv,"set-incremental-reset",EXACTLY,1) == -1)
{ return(oldValue); }
/*=========================================*/
/* The incremental reset behavior can't be */
/* changed when rules are loaded. */
/*=========================================*/
if (EnvGetNextDefrule(theEnv,NULL) != NULL)
{
PrintErrorID(theEnv,"INCRRSET",1,FALSE);
EnvPrintRouter(theEnv,WERROR,"The incremental reset behavior cannot be changed with rules loaded.\n");
SetEvaluationError(theEnv,TRUE);
return(oldValue);
}
/*==================================================*/
/* The symbol FALSE disables incremental reset. Any */
/* other value enables incremental reset. */
/*==================================================*/
EnvRtnUnknown(theEnv,1,&argPtr);
if ((argPtr.value == EnvFalseSymbol(theEnv)) && (argPtr.type == SYMBOL))
{ EnvSetIncrementalReset(theEnv,FALSE); }
else
{ EnvSetIncrementalReset(theEnv,TRUE); }
/*=======================*/
/* Return the old value. */
/*=======================*/
return(oldValue);
}
/****************************************************/
/* GetIncrementalResetCommand: H/L access routine */
/* for the get-incremental-reset command. */
/****************************************************/
globle int GetIncrementalResetCommand(
void *theEnv)
{
int oldValue;
oldValue = EnvGetIncrementalReset(theEnv);
if (EnvArgCountCheck(theEnv,"get-incremental-reset",EXACTLY,0) == -1)
{ return(oldValue); }
return(oldValue);
}
#endif /* DEFRULE_CONSTRUCT */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -