📄 factqury.c
字号:
{
IncrementDeftemplateBusyCount(theEnv,(void *) val->value);
head = get_struct(theEnv,query_template);
head->templatePtr = (struct deftemplate *) val->value;
head->chain = NULL;
head->nxt = NULL;
return(head);
}
if (val->type == SYMBOL)
{
/* ===============================================
Allow instance-set query restrictions to have a
module specifier as part of the class name,
but search imported defclasses too if a
module specifier is not given
=============================================== */
templatePtr = (struct deftemplate *)
FindImportedConstruct(theEnv,"deftemplate",NULL,DOPToString(val),
&count,TRUE,NULL);
if (templatePtr == NULL)
{
CantFindItemInFunctionErrorMessage(theEnv,"deftemplate",DOPToString(val),func);
return(NULL);
}
IncrementDeftemplateBusyCount(theEnv,(void *) templatePtr);
head = get_struct(theEnv,query_template);
head->templatePtr = templatePtr;
head->chain = NULL;
head->nxt = NULL;
return(head);
}
if (val->type == MULTIFIELD)
{
head = bot = NULL;
end = GetpDOEnd(val);
for (i = GetpDOBegin(val) ; i <= end ; i++)
{
if (GetMFType(val->value,i) == SYMBOL)
{
templateName = ValueToString(GetMFValue(val->value,i));
templatePtr = (struct deftemplate *)
FindImportedConstruct(theEnv,"deftemplate",NULL,templateName,
&count,TRUE,NULL);
if (templatePtr == NULL)
{
CantFindItemInFunctionErrorMessage(theEnv,"deftemplate",templateName,func);
DeleteQueryTemplates(theEnv,head);
return(NULL);
}
}
else
{
DeleteQueryTemplates(theEnv,head);
return(NULL);
}
IncrementDeftemplateBusyCount(theEnv,(void *) templatePtr);
tmp = get_struct(theEnv,query_template);
tmp->templatePtr = templatePtr;
tmp->chain = NULL;
tmp->nxt = NULL;
if (head == NULL)
head = tmp;
else
bot->chain = tmp;
bot = tmp;
}
return(head);
}
return(NULL);
}
/******************************************************
NAME : DeleteQueryTemplates
DESCRIPTION : Deletes a query class-list
INPUTS : The query list address
RETURNS : Nothing useful
SIDE EFFECTS : Nodes deallocated
Busy count decremented for all templates
NOTES : None
******************************************************/
static void DeleteQueryTemplates(
void *theEnv,
QUERY_TEMPLATE *qlist)
{
QUERY_TEMPLATE *tmp;
while (qlist != NULL)
{
while (qlist->chain != NULL)
{
tmp = qlist->chain;
qlist->chain = qlist->chain->chain;
DecrementDeftemplateBusyCount(theEnv,(void *) tmp->templatePtr);
rtn_struct(theEnv,query_template,tmp);
}
tmp = qlist;
qlist = qlist->nxt;
DecrementDeftemplateBusyCount(theEnv,(void *) tmp->templatePtr);
rtn_struct(theEnv,query_template,tmp);
}
}
/************************************************************
NAME : TestForFirstInChain
DESCRIPTION : Processes all templates in a restriction chain
until success or done
INPUTS : 1) The current chain
2) The index of the chain restriction
(e.g. the 4th query-variable)
RETURNS : TRUE if query succeeds, FALSE otherwise
SIDE EFFECTS : Sets current restriction class
Fact variable values set
NOTES : None
************************************************************/
static int TestForFirstInChain(
void *theEnv,
QUERY_TEMPLATE *qchain,
int indx)
{
QUERY_TEMPLATE *qptr;
FactQueryData(theEnv)->AbortQuery = TRUE;
for (qptr = qchain ; qptr != NULL ; qptr = qptr->chain)
{
FactQueryData(theEnv)->AbortQuery = FALSE;
if (TestForFirstFactInTemplate(theEnv,qptr->templatePtr,qchain,indx))
{ return(TRUE); }
if ((EvaluationData(theEnv)->HaltExecution == TRUE) || (FactQueryData(theEnv)->AbortQuery == TRUE))
return(FALSE);
}
return(FALSE);
}
/*****************************************************************
NAME : TestForFirstFactInTemplate
DESCRIPTION : Processes all facts in a template
INPUTS : 1) Visitation traversal id
2) The template
3) The current template restriction chain
4) The index of the current restriction
RETURNS : TRUE if query succeeds, FALSE otherwise
SIDE EFFECTS : Fact variable values set
NOTES : None
*****************************************************************/
static int TestForFirstFactInTemplate(
void *theEnv,
struct deftemplate *templatePtr,
QUERY_TEMPLATE *qchain,
int indx)
{
struct fact *theFact;
DATA_OBJECT temp;
theFact = templatePtr->factList;
while (theFact != NULL)
{
FactQueryData(theEnv)->QueryCore->solns[indx] = theFact;
if (qchain->nxt != NULL)
{
theFact->factHeader.busyCount++;
if (TestForFirstInChain(theEnv,qchain->nxt,indx+1) == TRUE)
{
theFact->factHeader.busyCount--;
break;
}
theFact->factHeader.busyCount--;
if ((EvaluationData(theEnv)->HaltExecution == TRUE) || (FactQueryData(theEnv)->AbortQuery == TRUE))
break;
}
else
{
theFact->factHeader.busyCount++;
EvaluationData(theEnv)->CurrentEvaluationDepth++;
EvaluateExpression(theEnv,FactQueryData(theEnv)->QueryCore->query,&temp);
EvaluationData(theEnv)->CurrentEvaluationDepth--;
PeriodicCleanup(theEnv,FALSE,TRUE);
theFact->factHeader.busyCount--;
if (EvaluationData(theEnv)->HaltExecution == TRUE)
break;
if ((temp.type != SYMBOL) ? TRUE :
(temp.value != EnvFalseSymbol(theEnv)))
break;
}
theFact = theFact->nextTemplateFact;
while ((theFact != NULL) ? (theFact->garbage == 1) : FALSE)
theFact = theFact->nextTemplateFact;
}
if (theFact != NULL)
return(((EvaluationData(theEnv)->HaltExecution == TRUE) || (FactQueryData(theEnv)->AbortQuery == TRUE))
? FALSE : TRUE);
return(FALSE);
}
/************************************************************
NAME : TestEntireChain
DESCRIPTION : Processes all templates in a restriction chain
until done
INPUTS : 1) The current chain
2) The index of the chain restriction
(i.e. the 4th query-variable)
RETURNS : Nothing useful
SIDE EFFECTS : Sets current restriction template
Query fact variables set
Solution sets stored in global list
NOTES : None
************************************************************/
static void TestEntireChain(
void *theEnv,
QUERY_TEMPLATE *qchain,
int indx)
{
QUERY_TEMPLATE *qptr;
FactQueryData(theEnv)->AbortQuery = TRUE;
for (qptr = qchain ; qptr != NULL ; qptr = qptr->chain)
{
FactQueryData(theEnv)->AbortQuery = FALSE;
TestEntireTemplate(theEnv,qptr->templatePtr,qchain,indx);
if ((EvaluationData(theEnv)->HaltExecution == TRUE) || (FactQueryData(theEnv)->AbortQuery == TRUE))
return;
}
}
/*****************************************************************
NAME : TestEntireTemplate
DESCRIPTION : Processes all facts in a template
INPUTS : 1) The module for which templates tested must be
in scope
3) The template
4) The current template restriction chain
5) The index of the current restriction
RETURNS : Nothing useful
SIDE EFFECTS : Instance variable values set
Solution sets stored in global list
NOTES : None
*****************************************************************/
static void TestEntireTemplate(
void *theEnv,
struct deftemplate *templatePtr,
QUERY_TEMPLATE *qchain,
int indx)
{
struct fact *theFact;
DATA_OBJECT temp;
theFact = templatePtr->factList;
while (theFact != NULL)
{
FactQueryData(theEnv)->QueryCore->solns[indx] = theFact;
if (qchain->nxt != NULL)
{
theFact->factHeader.busyCount++;
TestEntireChain(theEnv,qchain->nxt,indx+1);
theFact->factHeader.busyCount--;
if ((EvaluationData(theEnv)->HaltExecution == TRUE) || (FactQueryData(theEnv)->AbortQuery == TRUE))
break;
}
else
{
theFact->factHeader.busyCount++;
EvaluationData(theEnv)->CurrentEvaluationDepth++;
EvaluateExpression(theEnv,FactQueryData(theEnv)->QueryCore->query,&temp);
EvaluationData(theEnv)->CurrentEvaluationDepth--;
PeriodicCleanup(theEnv,FALSE,TRUE);
theFact->factHeader.busyCount--;
if (EvaluationData(theEnv)->HaltExecution == TRUE)
break;
if ((temp.type != SYMBOL) ? TRUE :
(temp.value != EnvFalseSymbol(theEnv)))
{
if (FactQueryData(theEnv)->QueryCore->action != NULL)
{
theFact->factHeader.busyCount++;
EvaluationData(theEnv)->CurrentEvaluationDepth++;
ValueDeinstall(theEnv,FactQueryData(theEnv)->QueryCore->result);
EvaluateExpression(theEnv,FactQueryData(theEnv)->QueryCore->action,FactQueryData(theEnv)->QueryCore->result);
ValueInstall(theEnv,FactQueryData(theEnv)->QueryCore->result);
EvaluationData(theEnv)->CurrentEvaluationDepth--;
PeriodicCleanup(theEnv,FALSE,TRUE);
theFact->factHeader.busyCount--;
if (ProcedureFunctionData(theEnv)->BreakFlag || ProcedureFunctionData(theEnv)->ReturnFlag)
{
FactQueryData(theEnv)->AbortQuery = TRUE;
break;
}
if (EvaluationData(theEnv)->HaltExecution == TRUE)
break;
}
else
AddSolution(theEnv);
}
}
theFact = theFact->nextTemplateFact;
while ((theFact != NULL) ? (theFact->garbage == 1) : FALSE)
theFact = theFact->nextTemplateFact;
}
}
/***************************************************************************
NAME : AddSolution
DESCRIPTION : Adds the current fact set to a global list of
solutions
INPUTS : None
RETURNS : Nothing useful
SIDE EFFECTS : Global list and count updated
NOTES : Solutions are stored as sequential arrays of struct fact *
***************************************************************************/
static void AddSolution(
void *theEnv)
{
QUERY_SOLN *new_soln;
register unsigned i;
new_soln = (QUERY_SOLN *) gm2(theEnv,(int) sizeof(QUERY_SOLN));
new_soln->soln = (struct fact **)
gm2(theEnv,(sizeof(struct fact *) * (FactQueryData(theEnv)->QueryCore->soln_size)));
for (i = 0 ; i < FactQueryData(theEnv)->QueryCore->soln_size ; i++)
new_soln->soln[i] = FactQueryData(theEnv)->QueryCore->solns[i];
new_soln->nxt = NULL;
if (FactQueryData(theEnv)->QueryCore->soln_set == NULL)
FactQueryData(theEnv)->QueryCore->soln_set = new_soln;
else
FactQueryData(theEnv)->QueryCore->soln_bottom->nxt = new_soln;
FactQueryData(theEnv)->QueryCore->soln_bottom = new_soln;
FactQueryData(theEnv)->QueryCore->soln_cnt++;
}
/***************************************************
NAME : PopQuerySoln
DESCRIPTION : Deallocates the topmost solution
set for an fact-set query
INPUTS : None
RETURNS : Nothing useful
SIDE EFFECTS : Solution set deallocated
NOTES : Assumes QueryCore->soln_set != 0
***************************************************/
static void PopQuerySoln(
void *theEnv)
{
FactQueryData(theEnv)->QueryCore->soln_bottom = FactQueryData(theEnv)->QueryCore->soln_set;
FactQueryData(theEnv)->QueryCore->soln_set = FactQueryData(theEnv)->QueryCore->soln_set->nxt;
rm(theEnv,(void *) FactQueryData(theEnv)->QueryCore->soln_bottom->soln,
(sizeof(struct fact *) * FactQueryData(theEnv)->QueryCore->soln_size));
rm(theEnv,(void *) FactQueryData(theEnv)->QueryCore->soln_bottom,sizeof(QUERY_SOLN));
}
#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -