📄 factmngr.c
字号:
/*******************************************************/
/* "C" Language Integrated Production System */
/* */
/* CLIPS Version 6.24 05/17/06 */
/* */
/* FACT MANAGER MODULE */
/*******************************************************/
/*************************************************************/
/* Purpose: Provides core routines for maintaining the fact */
/* list including assert/retract operations, data */
/* structure creation/deletion, printing, slot access, */
/* and other utility functions. */
/* */
/* Principal Programmer(s): */
/* Gary D. Riley */
/* */
/* Contributing Programmer(s): */
/* Brian L. Donnell */
/* */
/* Revision History: */
/* 6.23: Added support for templates maintaining their */
/* own list of facts. */
/* */
/* 6.24: Removed LOGICAL_DEPENDENCIES compilation flag. */
/* */
/* Renamed BOOLEAN macro type to intBool. */
/* */
/* AssignFactSlotDefaults function does not */
/* properly handle defaults for multifield slots. */
/* DR0869 */
/* */
/* Support for ppfact command. */
/* */
/*************************************************************/
#define _FACTMNGR_SOURCE_
#include <stdio.h>
#define _STDIO_INCLUDED_
#include "setup.h"
#if DEFTEMPLATE_CONSTRUCT && DEFRULE_CONSTRUCT
#include "constant.h"
#include "symbol.h"
#include "memalloc.h"
#include "exprnpsr.h"
#include "argacces.h"
#include "scanner.h"
#include "router.h"
#include "strngrtr.h"
#include "match.h"
#include "factbld.h"
#include "factqury.h"
#include "reteutil.h"
#include "retract.h"
#include "factcmp.h"
#include "filecom.h"
#include "factfun.h"
#include "factcom.h"
#include "constrct.h"
#include "factrhs.h"
#include "factmch.h"
#include "watch.h"
#include "utility.h"
#include "factbin.h"
#include "factmngr.h"
#include "facthsh.h"
#include "default.h"
#include "commline.h"
#include "envrnmnt.h"
#include "engine.h"
#include "lgcldpnd.h"
#include "drive.h"
#include "ruledlt.h"
#include "tmpltbsc.h"
#include "tmpltdef.h"
#include "tmpltutl.h"
#include "tmpltfun.h"
/***************************************/
/* LOCAL INTERNAL FUNCTION DEFINITIONS */
/***************************************/
static void ResetFacts(void *);
static int ClearFactsReady(void *);
static void RemoveGarbageFacts(void *);
static void DeallocateFactData(void *);
/**************************************************************/
/* InitializeFacts: Initializes the fact data representation. */
/* Facts are only available when both the defrule and */
/* deftemplate constructs are available. */
/**************************************************************/
globle void InitializeFacts(
void *theEnv)
{
struct patternEntityRecord factInfo = { { "FACT_ADDRESS", FACT_ADDRESS,1,0,0,
PrintFactIdentifier,
PrintFactIdentifierInLongForm,
EnvRetract,
NULL,
EnvGetNextFact,
EnvIncrementFactCount,
EnvDecrementFactCount,NULL,NULL,NULL,NULL
},
DecrementFactBasisCount,
IncrementFactBasisCount,
MatchFactFunction,
NULL
};
struct fact dummyFact = { { NULL }, NULL, NULL, -1L, 0, 1,
NULL, NULL, NULL, NULL, { 1, 0, 0 } };
AllocateEnvironmentData(theEnv,FACTS_DATA,sizeof(struct factsData),DeallocateFactData);
memcpy(&FactData(theEnv)->FactInfo,&factInfo,sizeof(struct patternEntityRecord));
dummyFact.factHeader.theInfo = &FactData(theEnv)->FactInfo;
memcpy(&FactData(theEnv)->DummyFact,&dummyFact,sizeof(struct fact));
FactData(theEnv)->LastModuleIndex = -1;
/*=========================================*/
/* Initialize the fact hash table (used to */
/* quickly determine if a fact exists). */
/*=========================================*/
InitializeFactHashTable(theEnv);
/*============================================*/
/* Initialize the fact callback functions for */
/* use with the reset and clear commands. */
/*============================================*/
EnvAddResetFunction(theEnv,"facts",ResetFacts,60);
AddClearReadyFunction(theEnv,"facts",ClearFactsReady,0);
/*=============================*/
/* Initialize periodic garbage */
/* collection for facts. */
/*=============================*/
AddCleanupFunction(theEnv,"facts",RemoveGarbageFacts,0);
/*===================================*/
/* Initialize fact pattern matching. */
/*===================================*/
InitializeFactPatterns(theEnv);
/*==================================*/
/* Initialize the facts keyword for */
/* use with the watch command. */
/*==================================*/
#if DEBUGGING_FUNCTIONS
AddWatchItem(theEnv,"facts",0,&FactData(theEnv)->WatchFacts,80,DeftemplateWatchAccess,DeftemplateWatchPrint);
#endif
/*=========================================*/
/* Initialize fact commands and functions. */
/*=========================================*/
FactCommandDefinitions(theEnv);
FactFunctionDefinitions(theEnv);
/*==============================*/
/* Initialize fact set queries. */
/*==============================*/
#if FACT_SET_QUERIES
SetupFactQuery(theEnv);
#endif
/*==================================*/
/* Initialize fact patterns for use */
/* with the bload/bsave commands. */
/*==================================*/
#if (BLOAD || BLOAD_ONLY || BLOAD_AND_BSAVE) && (! RUN_TIME)
FactBinarySetup(theEnv);
#endif
/*===================================*/
/* Initialize fact patterns for use */
/* with the constructs-to-c command. */
/*===================================*/
#if CONSTRUCT_COMPILER && (! RUN_TIME)
FactPatternsCompilerSetup(theEnv);
#endif
}
/***********************************/
/* DeallocateFactData: Deallocates */
/* environment data for facts. */
/***********************************/
static void DeallocateFactData(
void *theEnv)
{
struct factHashEntry *tmpFHEPtr, *nextFHEPtr;
struct fact *tmpFactPtr, *nextFactPtr;
int i;
struct patternMatch *theMatch, *tmpMatch;
for (i = 0; i < SIZE_FACT_HASH; i++)
{
tmpFHEPtr = FactData(theEnv)->FactHashTable[i];
while (tmpFHEPtr != NULL)
{
nextFHEPtr = tmpFHEPtr->next;
rtn_struct(theEnv,factHashEntry,tmpFHEPtr);
tmpFHEPtr = nextFHEPtr;
}
}
rm3(theEnv,FactData(theEnv)->FactHashTable,
sizeof(struct factHashEntry *) * SIZE_FACT_HASH);
tmpFactPtr = FactData(theEnv)->FactList;
while (tmpFactPtr != NULL)
{
nextFactPtr = tmpFactPtr->nextFact;
theMatch = (struct patternMatch *) tmpFactPtr->list;
while (theMatch != NULL)
{
tmpMatch = theMatch->next;
rtn_struct(theEnv,patternMatch,theMatch);
theMatch = tmpMatch;
}
ReturnFact(theEnv,tmpFactPtr);
tmpFactPtr = nextFactPtr;
}
tmpFactPtr = FactData(theEnv)->GarbageFacts;
while (tmpFactPtr != NULL)
{
nextFactPtr = tmpFactPtr->nextFact;
ReturnFact(theEnv,tmpFactPtr);
tmpFactPtr = nextFactPtr;
}
}
/**********************************************/
/* PrintFactWithIdentifier: Displays a single */
/* fact preceded by its fact identifier. */
/**********************************************/
globle void PrintFactWithIdentifier(
void *theEnv,
char *logicalName,
struct fact *factPtr)
{
char printSpace[20];
sprintf(printSpace,"f-%-5ld ",factPtr->factIndex);
EnvPrintRouter(theEnv,logicalName,printSpace);
PrintFact(theEnv,logicalName,factPtr,FALSE,FALSE);
}
/****************************************************/
/* PrintFactIdentifier: Displays a fact identifier. */
/****************************************************/
globle void PrintFactIdentifier(
void *theEnv,
char *logicalName,
void *factPtr)
{
char printSpace[20];
sprintf(printSpace,"f-%ld",((struct fact *) factPtr)->factIndex);
EnvPrintRouter(theEnv,logicalName,printSpace);
}
/********************************************/
/* PrintFactIdentifierInLongForm: Display a */
/* fact identifier in a longer format. */
/********************************************/
globle void PrintFactIdentifierInLongForm(
void *theEnv,
char *logicalName,
void *factPtr)
{
if (PrintUtilityData(theEnv)->AddressesToStrings) EnvPrintRouter(theEnv,logicalName,"\"");
if (factPtr != (void *) &FactData(theEnv)->DummyFact)
{
EnvPrintRouter(theEnv,logicalName,"<Fact-");
PrintLongInteger(theEnv,logicalName,((struct fact *) factPtr)->factIndex);
EnvPrintRouter(theEnv,logicalName,">");
}
else
{ EnvPrintRouter(theEnv,logicalName,"<Dummy Fact>"); }
if (PrintUtilityData(theEnv)->AddressesToStrings) EnvPrintRouter(theEnv,logicalName,"\"");
}
/*******************************************/
/* DecrementFactBasisCount: Decrements the */
/* partial match busy count of a fact */
/*******************************************/
globle void DecrementFactBasisCount(
void *theEnv,
void *vFactPtr)
{
struct fact *factPtr = (struct fact *) vFactPtr;
struct multifield *theSegment;
int i;
EnvDecrementFactCount(theEnv,factPtr);
theSegment = &factPtr->theProposition;
for (i = 0 ; i < (int) theSegment->multifieldLength ; i++)
{
AtomDeinstall(theEnv,theSegment->theFields[i].type,theSegment->theFields[i].value);
}
}
/*******************************************/
/* IncrementFactBasisCount: Increments the */
/* partial match busy count of a fact. */
/*******************************************/
globle void IncrementFactBasisCount(
void *theEnv,
void *vFactPtr)
{
struct fact *factPtr = (struct fact *) vFactPtr;
struct multifield *theSegment;
int i;
EnvIncrementFactCount(theEnv,factPtr);
theSegment = &factPtr->theProposition;
for (i = 0 ; i < (int) theSegment->multifieldLength ; i++)
{
AtomInstall(theEnv,theSegment->theFields[i].type,theSegment->theFields[i].value);
}
}
/**************************************************/
/* PrintFact: Displays the printed representation */
/* of a fact containing the relation name and */
/* all of the fact's slots or fields. */
/**************************************************/
globle void PrintFact(
void *theEnv,
char *logicalName,
struct fact *factPtr,
int seperateLines,
int ignoreDefaults)
{
struct multifield *theMultifield;
/*=========================================*/
/* Print a deftemplate (non-ordered) fact. */
/*=========================================*/
if (factPtr->whichDeftemplate->implied == FALSE)
{
PrintTemplateFact(theEnv,logicalName,factPtr,seperateLines,ignoreDefaults);
return;
}
/*==============================*/
/* Print an ordered fact (which */
/* has an implied deftemplate). */
/*==============================*/
EnvPrintRouter(theEnv,logicalName,"(");
EnvPrintRouter(theEnv,logicalName,factPtr->whichDeftemplate->header.name->contents);
theMultifield = (struct multifield *) factPtr->theProposition.theFields[0].value;
if (theMultifield->multifieldLength != 0)
{
EnvPrintRouter(theEnv,logicalName," ");
PrintMultifield(theEnv,logicalName,theMultifield,0,
(long) (theMultifield->multifieldLength - 1),
FALSE);
}
EnvPrintRouter(theEnv,logicalName,")");
}
/*********************************************/
/* MatchFactFunction: Filters a fact through */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -