?? factmngr.c
字號:
/*******************************************************/ /* "C" Language Integrated Production System */ /* */ /* CLIPS Version 6.30 10/19/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 "sysdep.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,NULL }, DecrementFactBasisCount, IncrementFactBasisCount, MatchFactFunction, NULL }; struct fact dummyFact = { { NULL, NULL, 0, 0L }, NULL, NULL, -1L, 0, 0, 1, NULL, NULL, NULL, NULL, { 1, 0, 0UL, NULL, { { 0, NULL } } } }; 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; unsigned long i; struct patternMatch *theMatch, *tmpMatch; for (i = 0; i < FactData(theEnv)->FactHashTableSize; 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 *) * FactData(theEnv)->FactHashTableSize); 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; } ReturnEntityDependencies(theEnv,(struct patternEntity *) tmpFactPtr); 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]; gensprintf(printSpace,"f-%-5lld ",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]; gensprintf(printSpace,"f-%lld",((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,")"); }/*********************************************/
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -