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

📄 factmngr.c

📁 clips源代码
💻 C
📖 第 1 页 / 共 4 页
字号:
   /*===============================*/   /* Return a pointer to the fact. */   /*===============================*/   return((void *) theFact);  }/**************************************//* RemoveAllFacts: Loops through the  *//*   fact-list and removes each fact. *//**************************************/globle void RemoveAllFacts(  void *theEnv)  {   while (FactData(theEnv)->FactList != NULL)     { EnvRetract(theEnv,(void *) FactData(theEnv)->FactList); }  }/************************************************//* EnvCreateFact: Creates a fact data structure *//*   of the specified deftemplate.              *//************************************************/globle struct fact *EnvCreateFact(  void *theEnv,  void *vTheDeftemplate)  {   struct deftemplate *theDeftemplate = (struct deftemplate *) vTheDeftemplate;   struct fact *newFact;   int i;   /*=================================*/   /* A deftemplate must be specified */   /* in order to create a fact.      */   /*=================================*/   if (theDeftemplate == NULL) return(NULL);   /*============================================*/   /* Create a fact for an explicit deftemplate. */   /*============================================*/   if (theDeftemplate->implied == FALSE)     {      newFact = CreateFactBySize(theEnv,theDeftemplate->numberOfSlots);      for (i = 0;           i < (int) theDeftemplate->numberOfSlots;           i++)        { newFact->theProposition.theFields[i].type = RVOID; }     }   /*===========================================*/   /* Create a fact for an implied deftemplate. */   /*===========================================*/   else     {      newFact = CreateFactBySize(theEnv,1);      newFact->theProposition.theFields[0].type = MULTIFIELD;      newFact->theProposition.theFields[0].value = CreateMultifield2(theEnv,0L);     }   /*===============================*/   /* Return a pointer to the fact. */   /*===============================*/   newFact->whichDeftemplate = theDeftemplate;   return(newFact);  }/******************************************//* EnvGetFactSlot: Returns the slot value *//*   from the specified slot of a fact.   *//******************************************/globle intBool EnvGetFactSlot(  void *theEnv,  void *vTheFact,  char *slotName,  DATA_OBJECT *theValue)  {   struct fact *theFact = (struct fact *) vTheFact;   struct deftemplate *theDeftemplate;   short whichSlot;   /*===============================================*/   /* Get the deftemplate associated with the fact. */   /*===============================================*/   theDeftemplate = theFact->whichDeftemplate;   /*==============================================*/   /* Handle retrieving the slot value from a fact */   /* having an implied deftemplate. An implied    */   /* facts has a single multifield slot.          */   /*==============================================*/   if (theDeftemplate->implied)     {      if (slotName != NULL) return(FALSE);      theValue->type = theFact->theProposition.theFields[0].type;      theValue->value = theFact->theProposition.theFields[0].value;      SetpDOBegin(theValue,1);      SetpDOEnd(theValue,((struct multifield *) theValue->value)->multifieldLength);      return(TRUE);     }   /*===================================*/   /* Make sure the slot name requested */   /* corresponds to a valid slot name. */   /*===================================*/   if (FindSlot(theDeftemplate,(SYMBOL_HN *) EnvAddSymbol(theEnv,slotName),&whichSlot) == NULL)     { return(FALSE); }   /*======================================================*/   /* Return the slot value. If the slot value wasn't set, */   /* then return FALSE to indicate that an appropriate    */   /* slot value wasn't available.                         */   /*======================================================*/   theValue->type = theFact->theProposition.theFields[whichSlot-1].type;   theValue->value = theFact->theProposition.theFields[whichSlot-1].value;   if (theValue->type == MULTIFIELD)     {      SetpDOBegin(theValue,1);      SetpDOEnd(theValue,((struct multifield *) theValue->value)->multifieldLength);     }   if (theValue->type == RVOID) return(FALSE);   return(TRUE);  }/***************************************//* EnvPutFactSlot: Sets the slot value *//*   of the specified slot of a fact.  *//***************************************/globle intBool EnvPutFactSlot(  void *theEnv,  void *vTheFact,  char *slotName,  DATA_OBJECT *theValue)  {   struct fact *theFact = (struct fact *) vTheFact;   struct deftemplate *theDeftemplate;   struct templateSlot *theSlot;   short whichSlot;   /*===============================================*/   /* Get the deftemplate associated with the fact. */   /*===============================================*/   theDeftemplate = theFact->whichDeftemplate;   /*============================================*/   /* Handle setting the slot value of a fact    */   /* having an implied deftemplate. An implied  */   /* facts has a single multifield slot.        */   /*============================================*/   if (theDeftemplate->implied)     {      if ((slotName != NULL) || (theValue->type != MULTIFIELD))        { return(FALSE); }      if (theFact->theProposition.theFields[0].type == MULTIFIELD)        { ReturnMultifield(theEnv,(struct multifield *) theFact->theProposition.theFields[0].value); }      theFact->theProposition.theFields[0].type = theValue->type;      theFact->theProposition.theFields[0].value = DOToMultifield(theEnv,theValue);            return(TRUE);     }   /*===================================*/   /* Make sure the slot name requested */   /* corresponds to a valid slot name. */   /*===================================*/   if ((theSlot = FindSlot(theDeftemplate,(SYMBOL_HN *) EnvAddSymbol(theEnv,slotName),&whichSlot)) == NULL)     { return(FALSE); }   /*=============================================*/   /* Make sure a single field value is not being */   /* stored in a multifield slot or vice versa.  */   /*=============================================*/   if (((theSlot->multislot == 0) && (theValue->type == MULTIFIELD)) ||       ((theSlot->multislot == 1) && (theValue->type != MULTIFIELD)))     { return(FALSE); }   /*=====================*/   /* Set the slot value. */   /*=====================*/   if (theFact->theProposition.theFields[whichSlot-1].type == MULTIFIELD)     { ReturnMultifield(theEnv,(struct multifield *) theFact->theProposition.theFields[whichSlot-1].value); }   theFact->theProposition.theFields[whichSlot-1].type = theValue->type;   if (theValue->type == MULTIFIELD)     { theFact->theProposition.theFields[whichSlot-1].value = DOToMultifield(theEnv,theValue); }   else     { theFact->theProposition.theFields[whichSlot-1].value = theValue->value; }      return(TRUE);  }/********************************************************//* EnvAssignFactSlotDefaults: Sets a fact's slot values *//*   to its default value if the value of the slot has  *//*   not yet been set.                                  *//********************************************************/globle intBool EnvAssignFactSlotDefaults(  void *theEnv,  void *vTheFact)  {   struct fact *theFact = (struct fact *) vTheFact;   struct deftemplate *theDeftemplate;   struct templateSlot *slotPtr;   int i;   DATA_OBJECT theResult;   /*===============================================*/   /* Get the deftemplate associated with the fact. */   /*===============================================*/   theDeftemplate = theFact->whichDeftemplate;   /*================================================*/   /* The value for the implied multifield slot of   */   /* an implied deftemplate is set to a multifield  */   /* of length zero when the fact is created.       */   /*================================================*/   if (theDeftemplate->implied) return(TRUE);   /*============================================*/   /* Loop through each slot of the deftemplate. */   /*============================================*/   for (i = 0, slotPtr = theDeftemplate->slotList;        i < (int) theDeftemplate->numberOfSlots;        i++, slotPtr = slotPtr->next)     {      /*===================================*/      /* If the slot's value has been set, */      /* then move on to the next slot.    */      /*===================================*/      if (theFact->theProposition.theFields[i].type != RVOID) continue;      /*======================================================*/      /* Assign the default value for the slot if one exists. */      /*======================================================*/            if (DeftemplateSlotDefault(theEnv,theDeftemplate,slotPtr,&theResult,FALSE))        {         theFact->theProposition.theFields[i].type = theResult.type;         theFact->theProposition.theFields[i].value = theResult.value;        }     }   /*==========================================*/   /* Return TRUE to indicate that the default */   /* values have been successfully set.       */   /*==========================================*/   return(TRUE);  }  /********************************************************//* DeftemplateSlotDefault: Determines the default value *//*   for the specified slot of a deftemplate.           *//********************************************************/globle intBool DeftemplateSlotDefault(  void *theEnv,  struct deftemplate *theDeftemplate,  struct templateSlot *slotPtr,  DATA_OBJECT *theResult,  int garbageMultifield)  {   /*================================================*/   /* The value for the implied multifield slot of an */   /* implied deftemplate does not have a default.    */   /*=================================================*/   if (theDeftemplate->implied) return(FALSE);   /*===============================================*/   /* If the (default ?NONE) attribute was declared */   /* for the slot, then return FALSE to indicate   */   /* the default values for the fact couldn't be   */   /* supplied since this attribute requires that a */   /* default value can't be used for the slot.     */   /*===============================================*/   if (slotPtr->noDefault) return(FALSE);   /*==============================================*/   /* Otherwise if a static default was specified, */   /* use this as the default value.               */   /*==============================================*/   else if (slotPtr->defaultPresent)     {      if (slotPtr->multislot)        {         StoreInMultifield(theEnv,theResult,slotPtr->defaultList,garbageMultifield);        }      else        {         theResult->type = slotPtr->defaultList->type;         theResult->value = slotPtr->defaultList->value;        }     }   /*================================================*/   /* Otherwise if a dynamic-default was specified,  */   /* evaluate it and use this as the default value. */   /*================================================*/   else if (slotPtr->defaultDynamic)     {      if (! EvaluateAndStoreInDataObject(theEnv,(int) slotPtr->multislot,                                         (EXPRESSION *) slotPtr->defaultList,                                         theResult,garbageMultifield))        { return(FALSE); }     }   /*====================================*/   /* Otherwise derive the default value */   /* from the slot's constraints.       */   /*====================================*/   else     {      DeriveDefaultFromConstraints(theEnv,slotPtr->constraints,theResult,                                  (int) slotPtr->multislot,garbageMultifield);     }   /*==========================================*/   /* Return TRUE to indicate that the default */   /* values have been successfully set.       */   /*==========================================*/   return(TRUE);  }/***************************************************************//* CopyFactSlotValues: Copies the slot values from one fact to *//*   another. Both facts must have the same relation name.     *//***************************************************************/globle intBool CopyFactSlotValues(  void *theEnv,  void *vTheDestFact,  void *vTheSourceFact)  {   struct fact *theDestFact = (struct fact *) vTheDestFact;   struct fact *theSourceFact = (struct fact *) vTheSourceFact;   struct deftemplate *theDeftemplate;   struct templateSlot *slotPtr;   int i;   /*===================================*/   /* Both facts must be the same type. */   /*===================================*/   theDeftemplate = theSourceFact->whichDeftemplate;   if (theDestFact->whichDeftemplate != theDeftemplate)     { return(FALSE); }   /*===================================================*/   /* Loop through each slot of the deftemplate copying */   /* the source fact value to the destination fact.    */   /*===================================================*/   for (i = 0, slotPtr = theDeftemplate->slotList;        i < (int) theDeftemplate->numberOfSlots;        i++, slotPtr = slotPtr->next)     {      theDestFact->theProposition.theFields[i].type =         theSourceFact->theProposition.theFields[i].type;      if (theSourceFact->theProposition.theFields[i].type != MULTIFIELD)        {         theDestFact->theProposition.theFields[i].value =           theSourceFact->theProposition.theFields[i].value;        }      else        {         theDestFact->theProposition.theFields[i].value =           CopyMultifield(theEnv,(struct multifield *) theSourceFact->theProposition.theFields[i].value);        }     }   /*========================================*/

⌨️ 快捷键说明

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