                          CLIPS DISCREPANCY REPORT

DR #                : 0833
DATE                : 09/13/99
STATUS              : OPEN

REPORTED BY         : Gary Riley
ORGANIZATION        : 
PHONE #             :
ADDRESS             :

CLIPS VERSION       : CLIPS 6.1
HOST                : All
OS                  : All

********************
PROBLEM DESCRIPTION:
********************

PutFactSlot C function does not properly increment/decrement
the slot value that it changes.

*****************
COMMAND SEQUENCE:
*****************



***********
RESOLUTION:
***********

In the function PutFactSlot in the file factmngr.c,
replace the lines

   /*============================================*/
   /* 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((struct multifield *) theFact->theProposition.theFields[0].value); }

      theFact->theProposition.theFields[0].type = theValue->type;
      theFact->theProposition.theFields[0].value = DOToMultifield(theValue);
      
      return(TRUE);
     }

with

   /*============================================*/
   /* 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); }

      AtomDeinstall(theFact->theProposition.theFields[0].type,
                    theFact->theProposition.theFields[0].value);

      if (theFact->theProposition.theFields[0].type == MULTIFIELD)
        { ReturnMultifield((struct multifield *) theFact->theProposition.theFields[0].value); }

      theFact->theProposition.theFields[0].type = theValue->type;
      theFact->theProposition.theFields[0].value = DOToMultifield(theValue);
      
      AtomInstall(theFact->theProposition.theFields[0].type,
                  theFact->theProposition.theFields[0].value);

      return(TRUE);
     }

and replace the lines

   /*=====================*/
   /* Set the slot value. */
   /*=====================*/

   if (theFact->theProposition.theFields[whichSlot-1].type == MULTIFIELD)
     { ReturnMultifield((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(theValue); }
   else
     { theFact->theProposition.theFields[whichSlot-1].value = theValue->value; }
   
with

   /*=====================*/
   /* Set the slot value. */
   /*=====================*/

   AtomDeinstall(theFact->theProposition.theFields[whichSlot-1].type,
                 theFact->theProposition.theFields[whichSlot-1].value);

   if (theFact->theProposition.theFields[whichSlot-1].type == MULTIFIELD)
     { ReturnMultifield((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(theValue); }
   else
     { theFact->theProposition.theFields[whichSlot-1].value = theValue->value; }
   
   AtomInstall(theFact->theProposition.theFields[whichSlot-1].type,
               theFact->theProposition.theFields[whichSlot-1].value);

*******
STATUS:
*******

FIXED BY            : Gary Riley
DATE                : 02/10/99
IMPLEMENTED BY      : Gary Riley
IN VERSION          : 6.2
DATE                :
DOCUMENTED BY       :
DATE                :
TESTED BY           :
DATE                :
APPROVED BY         :
DATE                :
