⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 objrtmch.c

📁 clips源代码
💻 C
📖 第 1 页 / 共 4 页
字号:
   /*******************************************************/   /*      "C" Language Integrated Production System      */   /*                                                     */   /*               CLIPS Version 6.30  10/19/06          */   /*                                                     */   /*          OBJECT PATTERN MATCHER MODULE              */   /*******************************************************//**************************************************************//* Purpose: RETE Network Interface for Objects                *//*                                                            *//* Principal Programmer(s):                                   *//*      Brian L. Donnell                                      *//*                                                            *//* Contributing Programmer(s):                                *//*                                                            *//* Revision History:                                          *//*      6.23: Correction for FalseSymbol/TrueSymbol. DR0859   *//*                                                            *//*      6.24: Removed INCREMENTAL_RESET and                   *//*            LOGICAL_DEPENDENCIES compilation flags.         *//*                                                            *//*            Converted INSTANCE_PATTERN_MATCHING to          *//*            DEFRULE_CONSTRUCT.                              *//*                                                            *//*            Renamed BOOLEAN macro type to intBool.          *//*                                                            *//*      6.30: Modified the QueueObjectMatchAction function    *//*            so that instance retract actions always occur   *//*            before instance assert and modify actions.      *//*            This prevents the pattern matching process      *//*            from attempting the evaluation of a join        *//*            expression that accesses the slots of a         *//*            retracted instance.                             *//*                                                            *//*            Added support for hashed alpha memories.        *//*                                                            *//**************************************************************//* =========================================   *****************************************               EXTERNAL DEFINITIONS   =========================================   ***************************************** */#include "setup.h"#if DEFRULE_CONSTRUCT && OBJECT_SYSTEM#include "classfun.h"#include "memalloc.h"#include "drive.h"#include "engine.h"#include "envrnmnt.h"#include "lgcldpnd.h"#include "multifld.h"#if (! RUN_TIME) && (! BLOAD_ONLY)#include "incrrset.h"#endif#include "reteutil.h"#include "ruledlt.h"#include "reorder.h"#include "retract.h"#include "router.h"#include "objrtfnx.h"#define _OBJRTMCH_SOURCE_#include "objrtmch.h"#include "insmngr.h"/* =========================================   *****************************************      INTERNALLY VISIBLE FUNCTION HEADERS   =========================================   ***************************************** */static void QueueObjectMatchAction(void *,int,INSTANCE_TYPE *,int);static SLOT_BITMAP *QueueModifySlotMap(void *,SLOT_BITMAP *,int);static void ReturnObjectMatchAction(void *,OBJECT_MATCH_ACTION *);static void ProcessObjectMatchQueue(void *);static void MarkObjectPatternNetwork(void *,SLOT_BITMAP *);static intBool CompareSlotBitMaps(SLOT_BITMAP *,SLOT_BITMAP *);static void ObjectPatternMatch(void *,int,OBJECT_PATTERN_NODE *,struct multifieldMarker *);static void ProcessPatternNode(void *,int,OBJECT_PATTERN_NODE *,struct multifieldMarker *);static void CreateObjectAlphaMatch(void *,OBJECT_ALPHA_NODE *);static intBool EvaluateObjectPatternTest(void *,int,struct multifieldMarker *,EXPRESSION *,                                         OBJECT_PATTERN_NODE *);static void ObjectAssertAction(void *,INSTANCE_TYPE *);static void ObjectModifyAction(void *,INSTANCE_TYPE *,SLOT_BITMAP *);static void ObjectRetractAction(void *,INSTANCE_TYPE *,SLOT_BITMAP *);static void ObjectPatternNetErrorMessage(void *,OBJECT_PATTERN_NODE *);static void TraceErrorToObjectPattern(void *,int,OBJECT_PATTERN_NODE *);/* =========================================   *****************************************          EXTERNALLY VISIBLE FUNCTIONS   =========================================   ***************************************** *//***************************************************************************  NAME         : ObjectMatchDelay  DESCRIPTION  : H/L interface for SetDelayObjectPatternMatching  INPUTS       : None  RETURNS      : Nothing useful  SIDE EFFECTS : DelayObjectPatternMatching set and Rete network updates                 delayed until pattern-matching is completed  NOTES        : H/L Syntax: (object-pattern-match-delay <action>*) ***************************************************************************/globle void ObjectMatchDelay(  void *theEnv,  DATA_OBJECT *result)  {   register int ov;   ov = SetDelayObjectPatternMatching(theEnv,TRUE);   EvaluateExpression(theEnv,GetFirstArgument(),result);   if (EvaluationData(theEnv)->EvaluationError)     {      SetHaltExecution(theEnv,FALSE);      SetEvaluationError(theEnv,FALSE);      SetDelayObjectPatternMatching(theEnv,ov);      SetEvaluationError(theEnv,TRUE);     }   else     SetDelayObjectPatternMatching(theEnv,ov);  }/***************************************************  NAME         : SetDelayObjectPatternMatching  DESCRIPTION  : Sets the flag determining if Rete                 network activity is to be delayed                 for objects or not  INPUTS       : The value of the flag  RETURNS      : The old value of the flag  SIDE EFFECTS : DelayObjectPatternMatching set  NOTES        : When the delay is set to FALSE,                 all pending Rete network updates                 are performed ***************************************************/globle intBool SetDelayObjectPatternMatching(  void *theEnv,  int value)  {   intBool oldval;   oldval = ObjectReteData(theEnv)->DelayObjectPatternMatching;   if (value)     ObjectReteData(theEnv)->DelayObjectPatternMatching = TRUE;   else     {      ObjectReteData(theEnv)->DelayObjectPatternMatching = FALSE;      ObjectNetworkAction(theEnv,0,NULL,-1);     }   return(oldval);  }/***************************************************  NAME         : GetDelayObjectPatternMatching  DESCRIPTION  : Gets the flag determining if Rete                 network activity is to be delayed                 for objects or not  INPUTS       : None  RETURNS      : The flag  SIDE EFFECTS : None  NOTES        : None ***************************************************/globle intBool GetDelayObjectPatternMatching(  void *theEnv)  {   return(ObjectReteData(theEnv)->DelayObjectPatternMatching);  }/********************************************************  NAME         : ObjectNetworkPointer  DESCRIPTION  : Returns the first object network                 pattern node  INPUTS       : None  RETURNS      : The top of the object pattern network  SIDE EFFECTS : None  NOTES        : None ********************************************************/globle OBJECT_PATTERN_NODE *ObjectNetworkPointer(  void *theEnv)  {   return(ObjectReteData(theEnv)->ObjectPatternNetworkPointer);  }/********************************************************  NAME         : ObjectNetworkTerminalPointer  DESCRIPTION  : Returns the first terminal pattern node  INPUTS       : None  RETURNS      : The last node of a pattern  SIDE EFFECTS : None  NOTES        : None ********************************************************/globle OBJECT_ALPHA_NODE *ObjectNetworkTerminalPointer(  void *theEnv)  {   return(ObjectReteData(theEnv)->ObjectPatternNetworkTerminalPointer);  }/***************************************************  NAME         : SetObjectNetworkPointer  DESCRIPTION  : Sets the object pattern network to                  the given network  INPUTS       : Top of the new pattern network  RETURNS      : Nothing useful  SIDE EFFECTS : ObjectPatternNetworkPointer set  NOTES        : None ***************************************************/globle void SetObjectNetworkPointer(  void *theEnv,  OBJECT_PATTERN_NODE *value)  {   ObjectReteData(theEnv)->ObjectPatternNetworkPointer = value;  }/*******************************************************  NAME         : SetObjectNetworkTerminalPointer  DESCRIPTION  : Sets the global list of terminal                 pattern nodes (the ones containing                 the bitmaps) to the given node  INPUTS       : The last node of a pattern  RETURNS      : Nothing useful  SIDE EFFECTS : ObjectPatternNetworkTerminalPointer set  NOTES        : None *******************************************************/globle void SetObjectNetworkTerminalPointer(  void *theEnv,  OBJECT_ALPHA_NODE *value)  {   ObjectReteData(theEnv)->ObjectPatternNetworkTerminalPointer = value;  }/************************************************************************  NAME         : ObjectNetworkAction  DESCRIPTION  : Main driver for pattern-matching on objects                 If the pattern-matching is current delayed or another                 object is currently being pattern-matched, the requested                 match action is queued for later processing.                 Otherwise, the match action is performed and the                 Rete network is updated.  INPUTS       : 1) The match action type                    OBJECT_ASSERT  (1)                    OBJECT_RETRACT (2)                    OBJECT_MODIFY  (3)                 2) The instance to be matched (can be NULL if only                    want pending actions to be performed)                 3) The name id of the slot being updated (can be -1)                    If this argument is -1, it is assumed that any                    pattern which could match this instance must be                    checked.  Otherwise, only the patterns which                    explicitly match on the named slot will be checked.  RETURNS      : Nothing useful  SIDE EFFECTS : Action queued or Rete network updated  NOTES        : None ************************************************************************/globle void ObjectNetworkAction(  void *theEnv,  int type,  INSTANCE_TYPE *ins,  int slotNameID)  {   SLOT_BITMAP *tmpMap;   if (EngineData(theEnv)->JoinOperationInProgress)     return;   EngineData(theEnv)->JoinOperationInProgress = TRUE;   /* ================================================      For purposes of conflict resolution, all objects      which have had pattern-matching delayed will      have the same relative timestamp, i.e., the      inference engine thinks they all just appeared      simultaneously      When delay is off, however, each object gets the      new and current timestamp as expected.      ================================================ */   ObjectReteData(theEnv)->UseEntityTimeTag = DefruleData(theEnv)->CurrentEntityTimeTag++;   /* ==================================================      If pattern-matching is delayed (by use of the      set-object-pattern-match-delay function), then      the instance should be marked for later processing      (when the delay is turned off).      ================================================== */   if (ins != NULL)     {      /* 6.05 Bug Fix */      ins->reteSynchronized = FALSE;      if (ObjectReteData(theEnv)->DelayObjectPatternMatching == FALSE)        switch (type)        {         case OBJECT_ASSERT  :           ObjectAssertAction(theEnv,ins);           break;         case OBJECT_RETRACT :           ObjectRetractAction(theEnv,ins,NULL);           break;         default             :           tmpMap = QueueModifySlotMap(theEnv,NULL,slotNameID);           ObjectModifyAction(theEnv,ins,tmpMap);           rm(theEnv,(void *) tmpMap,SlotBitMapSize(tmpMap));        }      else        QueueObjectMatchAction(theEnv,type,ins,slotNameID);     }   /* ========================================      Process all pending actions in the queue      All updates will use the same timestamp      ======================================== */   ProcessObjectMatchQueue(theEnv);   EngineData(theEnv)->JoinOperationInProgress = FALSE;   ForceLogicalRetractions(theEnv);   /*=========================================*/   /* Free partial matches that were released */   /* by the assertion of the fact.           */   /*=========================================*/   if (EngineData(theEnv)->ExecutingRule == NULL) FlushGarbagePartialMatches(theEnv);  }/* =========================================   *****************************************          INTERNALLY VISIBLE FUNCTIONS   =========================================   ***************************************** *//***************************************************  NAME         : ResetObjectMatchTimeTags  DESCRIPTION  : If CurrentObjectMatchTimeTag + 1                 would cause an overflow,                 CurrentObjectMatchTimeTag                 is reset to 0L and all time tags                 in object pattern nodes are reset.  INPUTS       : None  RETURNS      : Nothing useful  SIDE EFFECTS : CurrentObjectMatchTimeTag reset to                 0, and all match time tags reset                 These tags are used to recognize                 valid pattern nodes on a match  NOTES        : None ***************************************************/globle void ResetObjectMatchTimeTags(  void *theEnv)  {   OBJECT_ALPHA_NODE *alphaPtr;   OBJECT_PATTERN_NODE *lastLevel;   /* ============================================      If the current tag incremented by one would      not cause an overflow, then we can leave      things alone.      ============================================ */   if ((ObjectReteData(theEnv)->CurrentObjectMatchTimeTag + 1L) > ObjectReteData(theEnv)->CurrentObjectMatchTimeTag)     return;   ObjectReteData(theEnv)->CurrentObjectMatchTimeTag = 0L;   alphaPtr = ObjectNetworkTerminalPointer(theEnv);   while (alphaPtr != NULL)     {

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -