📄 agenda.c
字号:
{
if (theActivation == NULL) RemoveAllActivations(theEnv);
else RemoveActivation(theEnv,(struct activation *) theActivation,TRUE,TRUE);
return(TRUE);
}
/*******************************************************/
/* DetachActivation: Detaches the specified activation */
/* from the list of activations on the Agenda. */
/*******************************************************/
globle intBool DetachActivation(
void *theEnv,
void *vTheActivation)
{
struct defruleModule *theModuleItem;
struct activation *theActivation = (struct activation *) vTheActivation;
/*============================*/
/* A NULL pointer is invalid. */
/*============================*/
if (theActivation == NULL) SystemError(theEnv,"AGENDA",1);
/*====================================*/
/* Determine the module of the agenda */
/* in which the activation is stored. */
/*====================================*/
theModuleItem = (struct defruleModule *) theActivation->theRule->header.whichModule;
/*========================================================*/
/* If the activation is the top activation on the agenda, */
/* then update the module pointer to agenda. */
/*========================================================*/
if (theActivation == theModuleItem->agenda)
{ theModuleItem->agenda = theActivation->next; }
/*==================================================*/
/* Update the pointers in the preceding activation. */
/*==================================================*/
if (theActivation->prev != NULL)
{ theActivation->prev->next = theActivation->next; }
/*==================================================*/
/* Update the pointers in the following activation. */
/*==================================================*/
if (theActivation->next != NULL)
{ theActivation->next->prev = theActivation->prev; }
/*=================================================*/
/* Update the pointers in the detached activation. */
/*=================================================*/
theActivation->prev = NULL;
theActivation->next = NULL;
/*=============================*/
/* Mark the agenda as changed. */
/*=============================*/
AgendaData(theEnv)->AgendaChanged = TRUE;
return(TRUE);
}
/****************************************************************************/
/* PrintActivation: Prints an activation in a "pretty" format. Salience, */
/* rule name, and the partial match which activated the rule are printed. */
/****************************************************************************/
static void PrintActivation(
void *theEnv,
char *logicalName,
void *vTheActivation)
{
struct activation *theActivation = (struct activation *) vTheActivation;
char printSpace[20];
sprintf(printSpace,"%-6d ",theActivation->salience);
EnvPrintRouter(theEnv,logicalName,printSpace);
EnvPrintRouter(theEnv,logicalName,ValueToString(theActivation->theRule->header.name));
EnvPrintRouter(theEnv,logicalName,": ");
PrintPartialMatch(theEnv,logicalName,theActivation->basis);
}
/*******************************/
/* EnvAgenda: C access routine */
/* for the agenda command. */
/*******************************/
globle void EnvAgenda(
void *theEnv,
char *logicalName,
void *vTheModule)
{
struct defmodule *theModule = (struct defmodule *) vTheModule;
ListItemsDriver(theEnv,logicalName,theModule,"activation","activations",
EnvGetNextActivation,NULL,PrintActivation,NULL);
}
/*******************************************************************/
/* RemoveActivation: Returns an activation and its associated data */
/* structures to the Memory Manager. Links to other activations */
/* and partial matches may also be updated. */
/*******************************************************************/
globle void RemoveActivation(
void *theEnv,
void *vTheActivation,
int updateAgenda,
int updateLinks)
{
struct defruleModule *theModuleItem;
struct activation *theActivation = (struct activation *) vTheActivation;
/*====================================*/
/* Determine the module of the agenda */
/* in which the activation is stored. */
/*====================================*/
theModuleItem = (struct defruleModule *) theActivation->theRule->header.whichModule;
/*=================================*/
/* Update the agenda if necessary. */
/*=================================*/
if (updateAgenda == TRUE)
{
/*===============================================*/
/* Update the pointer links between activations. */
/*===============================================*/
if (theActivation->prev == NULL)
{
theModuleItem->agenda = theModuleItem->agenda->next;
if (theModuleItem->agenda != NULL) theModuleItem->agenda->prev = NULL;
}
else
{
theActivation->prev->next = theActivation->next;
if (theActivation->next != NULL)
{ theActivation->next->prev = theActivation->prev; }
}
/*===================================*/
/* Indicate removal of activation if */
/* activations are being watched. */
/*===================================*/
#if DEBUGGING_FUNCTIONS
if (theActivation->theRule->watchActivation)
{
EnvPrintRouter(theEnv,WTRACE,"<== Activation ");
PrintActivation(theEnv,WTRACE,(void *) theActivation);
EnvPrintRouter(theEnv,WTRACE,"\n");
}
#endif
/*=============================*/
/* Mark the agenda as changed. */
/*=============================*/
AgendaData(theEnv)->AgendaChanged = TRUE;
}
/*============================================*/
/* Update join and agenda links if necessary. */
/*============================================*/
if ((updateLinks == TRUE) && (theActivation->basis != NULL))
{ theActivation->basis->binds[theActivation->basis->bcount].gm.theValue = NULL; }
/*================================================*/
/* Return the activation to the free memory pool. */
/*================================================*/
AgendaData(theEnv)->NumberOfActivations--;
if (theActivation->sortedBasis != NULL)
{ ReturnPartialMatch(theEnv,theActivation->sortedBasis); }
rtn_struct(theEnv,activation,theActivation);
}
/**************************************************************/
/* AgendaClearFunction: Agenda clear routine for use with the */
/* clear command. Resets the current time tag to zero. */
/**************************************************************/
static void AgendaClearFunction(
void *theEnv)
{
AgendaData(theEnv)->CurrentTimetag = 0;
}
/*************************************************/
/* RemoveAllActivations: Removes all activations */
/* from the agenda of the current module. */
/*************************************************/
globle void RemoveAllActivations(
void *theEnv)
{
struct activation *tempPtr, *theActivation;
theActivation = GetDefruleModuleItem(theEnv,NULL)->agenda;
while (theActivation != NULL)
{
tempPtr = theActivation->next;
RemoveActivation(theEnv,theActivation,TRUE,TRUE);
theActivation = tempPtr;
}
}
/*********************************************************/
/* EnvGetAgendaChanged: Returns the value of the boolean */
/* flag which indicates whether any changes have been */
/* made to the agenda. */
/*********************************************************/
globle int EnvGetAgendaChanged(
void *theEnv)
{
return(AgendaData(theEnv)->AgendaChanged);
}
/*****************************************************************/
/* EnvSetAgendaChanged: Sets the value of the boolean flag which */
/* indicates whether any changes have been made to the agenda. */
/*****************************************************************/
globle void EnvSetAgendaChanged(
void *theEnv,
int value)
{
AgendaData(theEnv)->AgendaChanged = value;
}
/**********************************************************/
/* EnvReorderAgenda: Completely reorders the agenda based */
/* on the current conflict resolution strategy. */
/**********************************************************/
globle void EnvReorderAgenda(
void *theEnv,
void *vTheModule)
{
struct activation *theActivation, *tempPtr;
struct defmodule *theModule = (struct defmodule *) vTheModule;
int allModules = FALSE;
struct defruleModule *theModuleItem;
/*=============================================*/
/* If the module specified is a NULL pointer, */
/* then every module has its agenda reordered. */
/*=============================================*/
if (theModule == NULL)
{
allModules = TRUE;
theModule = (struct defmodule *) EnvGetNextDefmodule(theEnv,NULL);
}
/*========================*/
/* Reorder the agenda(s). */
/*========================*/
for (;
theModule != NULL;
theModule = (struct defmodule *) EnvGetNextDefmodule(theEnv,theModule))
{
/*=================================*/
/* Get the list of activations and */
/* remove them from the agenda. */
/*=================================*/
theModuleItem = GetDefruleModuleItem(theEnv,theModule);
theActivation = theModuleItem->agenda;
theModuleItem->agenda = NULL;
/*=========================================*/
/* Reorder the activations by placing them */
/* back on the agenda one by one. */
/*=========================================*/
while (theActivation != NULL)
{
tempPtr = theActivation->next;
theActivation->next = NULL;
theActivation->prev = NULL;
PlaceActivation(theEnv,&(theModuleItem->agenda),theActivation);
theActivation = tempPtr;
}
/*===============================================*/
/* Return if only one agenda is being reordered. */
/*===============================================*/
if (! allModules) return;
}
}
/****************************************************/
/* GetNumberOfActivations: Returns the value of the */
/* total number of activations on all agendas. */
/****************************************************/
globle unsigned long GetNumberOfActivations(
void *theEnv)
{
return(AgendaData(theEnv)->NumberOfActivations);
}
/******************************************************/
/* RefreshCommand: H/L Command for refreshing a rule. */
/* Syntax: (refresh <defrule-name>) */
/******************************************************/
globle void RefreshCommand(
void *theEnv)
{
char *ruleName;
void *rulePtr;
/*===========================*/
/* Get the name of the rule. */
/*===========================*/
ruleName = GetConstructName(theEnv,"refresh","rule name");
if (ruleName == NULL) return;
/*===============================*/
/* Determine if the rule exists. */
/*===============================*/
rulePtr = EnvFindDefrule(theEnv,ruleName);
if (rulePtr == NULL)
{
CantFindItemErrorMessage(theEnv,"defrule",ruleName);
return;
}
/*===================*/
/* Refresh the rule. */
/*===================*/
EnvRefresh(theEnv,rulePtr);
}
/************************************************************/
/* EnvRefresh: Refreshes a defrule. Activations of the rule */
/* that have already been fired are added to the agenda. */
/************************************************************/
globle intBool EnvRefresh(
void *theEnv,
void *theRule)
{
struct defrule *rulePtr;
struct partialMatch *listOfMatches;
/*====================================*/
/* Refresh each disjunct of the rule. */
/*====================================*/
for (rulePtr = (struct defrule *) theRule;
rulePtr != NULL;
rulePtr = rulePtr->disjunct)
{
/*================================*/
/* Check each partial match that */
/* satisfies the LHS of the rule. */
/*================================*/
for (listOfMatches = rulePtr->lastJoin->beta;
listOfMatches != NULL;
listOfMatches = listOfMatches->next)
{
/*=======================================================*/
/* If the partial match is associated with an activation */
/* (which it should always be) and it isn't associated */
/* with a not CE that still has matches, then place a */
/* new activation on the agenda if this partial match */
/* doesn't have an activation associated with it. */
/*=======================================================*/
if ((listOfMatches->activationf) && (! listOfMatches->counterf))
{
if (listOfMatches->binds[listOfMatches->bcount].gm.theValue == NULL)
{ AddActivation(theEnv,rulePtr,listOfMatches); }
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -