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

📄 factrete.c

📁 clips源代码
💻 C
📖 第 1 页 / 共 3 页
字号:
   /*******************************************************/   /*      "C" Language Integrated Production System      */   /*                                                     */   /*             CLIPS Version 6.24  05/17/06            */   /*                                                     */   /*          FACT RETE ACCESS FUNCTIONS MODULE          */   /*******************************************************//*************************************************************//* Purpose: Rete access functions for fact pattern matching. *//*                                                           *//* Principal Programmer(s):                                  *//*      Gary D. Riley                                        *//*                                                           *//* Contributing Programmer(s):                               *//*                                                           *//* Revision History:                                         *//*      6.23: Correction for FalseSymbol/TrueSymbol. DR0859  *//*                                                           *//*      6.24: Removed INCREMENTAL_RESET compilation flag.    *//*                                                           *//*            Renamed BOOLEAN macro type to intBool.         *//*                                                           *//*************************************************************/#define _FACTRETE_SOURCE_#include <stdio.h>#define _STDIO_INCLUDED_#include "setup.h"#if DEFTEMPLATE_CONSTRUCT && DEFRULE_CONSTRUCT#include "memalloc.h"#include "extnfunc.h"#include "router.h"#include "incrrset.h"#include "reteutil.h"#include "drive.h"#include "engine.h"#include "factgen.h"#include "factmch.h"#include "envrnmnt.h"#include "factrete.h"/***************************************************************//* FactPNGetVar1: Fact pattern network function for extracting *//*   a variable's value. This is the most generalized routine. *//***************************************************************/globle intBool FactPNGetVar1(  void *theEnv,  void *theValue,  DATA_OBJECT_PTR returnValue)  {   unsigned short theField, theSlot;   struct fact *factPtr;   struct field *fieldPtr;   struct multifieldMarker *marks;   struct multifield *segmentPtr;   int extent;   struct factGetVarPN1Call *hack;   /*==========================================*/   /* Retrieve the arguments for the function. */   /*==========================================*/   hack = (struct factGetVarPN1Call *) ValueToBitMap(theValue);   /*=====================================================*/   /* Get the pointer to the fact from the partial match. */   /*=====================================================*/   factPtr = FactData(theEnv)->CurrentPatternFact;   marks = FactData(theEnv)->CurrentPatternMarks;   /*==========================================================*/   /* Determine if we want to retrieve the fact address of the */   /* fact, rather than retrieving a field from the fact.      */   /*==========================================================*/   if (hack->factAddress)     {      returnValue->type = FACT_ADDRESS;      returnValue->value = (void *) factPtr;      return(TRUE);     }   /*=========================================================*/   /* Determine if we want to retrieve the entire slot value. */   /*=========================================================*/   if (hack->allFields)     {      theSlot = hack->whichSlot;      fieldPtr = &factPtr->theProposition.theFields[theSlot];      returnValue->type = fieldPtr->type;      returnValue->value = fieldPtr->value;      if (returnValue->type == MULTIFIELD)        {         SetpDOBegin(returnValue,1);         SetpDOEnd(returnValue,((struct multifield *) fieldPtr->value)->multifieldLength);        }      return(TRUE);     }   /*====================================================*/   /* If the slot being accessed is a single field slot, */   /* then just return the single value found in that    */   /* slot. The multifieldMarker data structures do not  */   /* have to be considered since access to a single     */   /* field slot is not affected by variable bindings    */   /* from multifield slots.                             */   /*====================================================*/   theField = hack->whichField;   theSlot = hack->whichSlot;   fieldPtr = &factPtr->theProposition.theFields[theSlot];   /*==========================================================*/   /* Retrieve a value from a multifield slot. First determine */   /* the range of fields for the variable being retrieved.    */   /*==========================================================*/   extent = -1;   theField = AdjustFieldPosition(theEnv,marks,theField,theSlot,&extent);   /*=============================================================*/   /* If a range of values are being retrieved (i.e. a multifield */   /* variable), then return the values as a multifield.          */   /*=============================================================*/   if (extent != -1)     {      returnValue->type = MULTIFIELD;      returnValue->value = (void *) fieldPtr->value;      returnValue->begin = theField;      returnValue->end = theField + extent - 1;      return(TRUE);     }   /*========================================================*/   /* Otherwise a single field value is being retrieved from */   /* a multifield slot. Just return the type and value.     */   /*========================================================*/   segmentPtr = (struct multifield *) fieldPtr->value;   fieldPtr = &segmentPtr->theFields[theField];   returnValue->type = fieldPtr->type;   returnValue->value = fieldPtr->value;   return(TRUE);  }/**************************************************//* FactPNGetVar2: Fact pattern network function   *//*   for extracting a variable's value. The value *//*   extracted is from a single field slot.       *//**************************************************/globle intBool FactPNGetVar2(  void *theEnv,  void *theValue,  DATA_OBJECT_PTR returnValue)  {   struct fact *factPtr;   struct factGetVarPN2Call *hack;   struct field *fieldPtr;   /*==========================================*/   /* Retrieve the arguments for the function. */   /*==========================================*/   hack = (struct factGetVarPN2Call *) ValueToBitMap(theValue);   /*==============================*/   /* Get the pointer to the fact. */   /*==============================*/   factPtr = FactData(theEnv)->CurrentPatternFact;   /*============================================*/   /* Extract the value from the specified slot. */   /*============================================*/   fieldPtr = &factPtr->theProposition.theFields[hack->whichSlot];   returnValue->type = fieldPtr->type;   returnValue->value = fieldPtr->value;   return(TRUE);  }/*****************************************************************//* FactPNGetVar3: Fact pattern network function for extracting a *//*   variable's value. The value extracted is from a multifield  *//*   slot that contains at most one multifield variable.         *//*****************************************************************/globle intBool FactPNGetVar3(  void *theEnv,  void *theValue,  DATA_OBJECT_PTR returnValue)  {   struct fact *factPtr;   struct multifield *segmentPtr;   struct field *fieldPtr;   struct factGetVarPN3Call *hack;   /*==========================================*/   /* Retrieve the arguments for the function. */   /*==========================================*/   hack = (struct factGetVarPN3Call *) ValueToBitMap(theValue);   /*==============================*/   /* Get the pointer to the fact. */   /*==============================*/   factPtr = FactData(theEnv)->CurrentPatternFact;   /*============================================================*/   /* Get the multifield value from which the data is retrieved. */   /*============================================================*/   segmentPtr = (struct multifield *) factPtr->theProposition.theFields[hack->whichSlot].value;   /*=========================================*/   /* If the beginning and end flags are set, */   /* then retrieve a multifield value.       */   /*=========================================*/   if (hack->fromBeginning && hack->fromEnd)     {      returnValue->type = MULTIFIELD;      returnValue->value = (void *) segmentPtr;      returnValue->begin = (long) hack->beginOffset;      returnValue->end = (long) (segmentPtr->multifieldLength - (hack->endOffset + 1));      return(TRUE);     }   /*=====================================================*/   /* Return a single field value from a multifield slot. */   /*=====================================================*/   if (hack->fromBeginning)     { fieldPtr = &segmentPtr->theFields[hack->beginOffset]; }   else     { fieldPtr = &segmentPtr->theFields[segmentPtr->multifieldLength - (hack->endOffset + 1)]; }   returnValue->type = fieldPtr->type;   returnValue->value = fieldPtr->value;   return(TRUE);  }/******************************************************//* FactPNConstant1: Fact pattern network function for *//*   comparing a value stored in a single field slot  *//*   to a constant for either equality or inequality. *//******************************************************/#if IBM_TBC#pragma argsused#endifgloble intBool FactPNConstant1(  void *theEnv,  void *theValue,  DATA_OBJECT_PTR returnValue)  {#if MAC_MCW || IBM_MCW || MAC_XCD#pragma unused(returnValue)#endif   struct factConstantPN1Call *hack;   struct field *fieldPtr;   struct expr *theConstant;   /*==========================================*/   /* Retrieve the arguments for the function. */   /*==========================================*/   hack = (struct factConstantPN1Call *) ValueToBitMap(theValue);   /*============================================*/   /* Extract the value from the specified slot. */   /*============================================*/   fieldPtr = &FactData(theEnv)->CurrentPatternFact->theProposition.theFields[hack->whichSlot];   /*====================================*/   /* Compare the value to the constant. */   /*====================================*/   theConstant = GetFirstArgument();   if (theConstant->type != fieldPtr->type) return(1 - hack->testForEquality);   if (theConstant->value != fieldPtr->value) return(1 - hack->testForEquality);   return(hack->testForEquality);  }/****************************************************************//* FactPNConstant2: Fact pattern network function for comparing *//*   a value stored in a slot to a constant for either equality *//*   or inequality. The value being retrieved from the slot has *//*   no multifields to its right (thus it can be retrieved      *//*   relative to the beginning).                                *//****************************************************************/#if IBM_TBC#pragma argsused#endifgloble intBool FactPNConstant2(  void *theEnv,  void *theValue,  DATA_OBJECT_PTR returnValue)  {

⌨️ 快捷键说明

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