📄 crstrtgy.c
字号:
/*******************************************************/
/* "C" Language Integrated Production System */
/* */
/* CLIPS Version 6.24 05/17/06 */
/* */
/* CONFLICT RESOLUTION STRATEGY MODULE */
/*******************************************************/
/*************************************************************/
/* Purpose: Used to determine where a new activation is */
/* placed on the agenda based on the current conflict */
/* resolution strategy (depth, breadth, mea, lex, */
/* simplicity, or complexity). Also provides the */
/* set-strategy and get-strategy commands. */
/* */
/* Principal Programmer(s): */
/* Gary D. Riley */
/* */
/* Contributing Programmer(s): */
/* */
/* Revision History: */
/* 6.23: Corrected compilation errors for files */
/* generated by constructs-to-c. DR0861 */
/* */
/* 6.24: Removed CONFLICT_RESOLUTION_STRATEGIES */
/* compilation flag. */
/* */
/*************************************************************/
#define _CRSTRTGY_SOURCE_
#include <stdio.h>
#define _STDIO_INCLUDED_
#include <string.h>
#include "setup.h"
#if DEFRULE_CONSTRUCT
#include "constant.h"
#include "pattern.h"
#include "reteutil.h"
#include "argacces.h"
#include "agenda.h"
#include "envrnmnt.h"
#include "crstrtgy.h"
#define GetMatchingItem(x,i) (x->basis->binds[i].gm.theMatch->matchingItem)
/***************************************/
/* LOCAL INTERNAL FUNCTION DEFINITIONS */
/***************************************/
static ACTIVATION *PlaceDepthActivation(ACTIVATION *,ACTIVATION *);
static ACTIVATION *PlaceBreadthActivation(ACTIVATION *,ACTIVATION *);
static ACTIVATION *PlaceLEXActivation(void *,ACTIVATION *,ACTIVATION *);
static ACTIVATION *PlaceMEAActivation(void *,ACTIVATION *,ACTIVATION *);
static ACTIVATION *PlaceComplexityActivation(ACTIVATION *,ACTIVATION *);
static ACTIVATION *PlaceSimplicityActivation(ACTIVATION *,ACTIVATION *);
static ACTIVATION *PlaceRandomActivation(ACTIVATION *,ACTIVATION *);
static struct partialMatch *SortPartialMatch(void *,struct partialMatch *);
static int ComparePartialMatches(void *,ACTIVATION *,ACTIVATION *);
static char *GetStrategyName(int);
/******************************************************************/
/* PlaceActivation: Coordinates placement of an activation on the */
/* Agenda based on the current conflict resolution strategy. */
/******************************************************************/
globle void PlaceActivation(
void *theEnv,
ACTIVATION **whichAgenda,
ACTIVATION *newActivation)
{
ACTIVATION *placeAfter = NULL;
/*================================================*/
/* Set the flag which indicates that a change has */
/* been made to the agenda. */
/*================================================*/
EnvSetAgendaChanged(theEnv,TRUE);
/*=============================================*/
/* Determine the location where the activation */
/* should be placed in the agenda based on the */
/* current conflict resolution strategy. */
/*==============================================*/
if (*whichAgenda != NULL) switch (AgendaData(theEnv)->Strategy)
{
case DEPTH_STRATEGY:
placeAfter = PlaceDepthActivation(*whichAgenda,newActivation);
break;
case BREADTH_STRATEGY:
placeAfter = PlaceBreadthActivation(*whichAgenda,newActivation);
break;
case LEX_STRATEGY:
placeAfter = PlaceLEXActivation(theEnv,*whichAgenda,newActivation);
break;
case MEA_STRATEGY:
placeAfter = PlaceMEAActivation(theEnv,*whichAgenda,newActivation);
break;
case COMPLEXITY_STRATEGY:
placeAfter = PlaceComplexityActivation(*whichAgenda,newActivation);
break;
case SIMPLICITY_STRATEGY:
placeAfter = PlaceSimplicityActivation(*whichAgenda,newActivation);
break;
case RANDOM_STRATEGY:
placeAfter = PlaceRandomActivation(*whichAgenda,newActivation);
break;
}
/*==============================================================*/
/* Place the activation at the appropriate place in the agenda. */
/*==============================================================*/
if (placeAfter == NULL) /* then place it at the beginning of then agenda. */
{
newActivation->next = *whichAgenda;
*whichAgenda = newActivation;
if (newActivation->next != NULL) newActivation->next->prev = newActivation;
}
else /* insert it in the agenda. */
{
newActivation->next = placeAfter->next;
newActivation->prev = placeAfter;
placeAfter->next = newActivation;
if (newActivation->next != NULL)
{ newActivation->next->prev = newActivation; }
}
}
/*******************************************************************/
/* PlaceDepthActivation: Determines the location in the agenda */
/* where a new activation should be placed for the depth */
/* strategy. Returns a pointer to the activation after which */
/* the new activation should be placed (or NULL if the */
/* activation should be placed at the beginning of the agenda). */
/*******************************************************************/
static ACTIVATION *PlaceDepthActivation(
ACTIVATION *actPtr,
ACTIVATION *newActivation)
{
int salience;
unsigned long timetag;
ACTIVATION *lastAct;
/*============================================*/
/* Set up initial information for the search. */
/*============================================*/
salience = newActivation->salience;
timetag = newActivation->timetag;
lastAct = NULL;
/*=========================================================*/
/* Find the insertion point in the agenda. The activation */
/* is placed before activations of lower salience and */
/* after activations of higher salience. Among activations */
/* of equal salience, the activation is placed before */
/* activations with an equal or lower timetag (yielding */
/* depth first traversal). */
/*=========================================================*/
while (actPtr != NULL)
{
if (actPtr->salience > salience)
{
lastAct = actPtr;
actPtr = actPtr->next;
}
else if (actPtr->salience < salience)
{ return(lastAct); }
else if (timetag < actPtr->timetag)
{
lastAct = actPtr;
actPtr = actPtr->next;
}
else
{ return(lastAct); }
}
/*===========================================*/
/* Return the insertion point in the agenda. */
/*===========================================*/
return(lastAct);
}
/*******************************************************************/
/* PlaceBreadthActivation: Determines the location in the agenda */
/* where a new activation should be placed for the breadth */
/* strategy. Returns a pointer to the activation after which */
/* the new activation should be placed (or NULL if the */
/* activation should be placed at the beginning of the agenda). */
/*******************************************************************/
static ACTIVATION *PlaceBreadthActivation(
ACTIVATION *actPtr,
ACTIVATION *newActivation)
{
int salience;
unsigned long timetag;
ACTIVATION *lastAct;
/*============================================*/
/* Set up initial information for the search. */
/*============================================*/
salience = newActivation->salience;
timetag = newActivation->timetag;
lastAct = NULL;
/*=========================================================*/
/* Find the insertion point in the agenda. The activation */
/* is placed before activations of lower salience and */
/* after activations of higher salience. Among activations */
/* of equal salience, the activation is placed after */
/* activations with a lessor timetag (yielding breadth */
/* first traversal). */
/*=========================================================*/
while (actPtr != NULL)
{
if (actPtr->salience > salience)
{
lastAct = actPtr;
actPtr = actPtr->next;
}
else if (actPtr->salience < salience)
{ return(lastAct); }
else if (timetag > actPtr->timetag)
{
lastAct = actPtr;
actPtr = actPtr->next;
}
else
{ return(lastAct); }
}
/*===========================================*/
/* Return the insertion point in the agenda. */
/*===========================================*/
return(lastAct);
}
/*******************************************************************/
/* PlaceLEXActivation: Determines the location in the agenda */
/* where a new activation should be placed for the lex */
/* strategy. Returns a pointer to the activation after which */
/* the new activation should be placed (or NULL if the */
/* activation should be placed at the beginning of the agenda). */
/*******************************************************************/
static ACTIVATION *PlaceLEXActivation(
void *theEnv,
ACTIVATION *actPtr,
ACTIVATION *newActivation)
{
int salience;
unsigned long timetag;
ACTIVATION *lastAct;
int flag;
/*===============================================*/
/* Sort the fact identifiers for the activation. */
/*===============================================*/
if (newActivation->sortedBasis == NULL)
{ newActivation->sortedBasis = SortPartialMatch(theEnv,newActivation->basis); }
/*============================================*/
/* Set up initial information for the search. */
/*============================================*/
timetag = newActivation->timetag;
salience = newActivation->salience;
lastAct = NULL;
/*=========================================================*/
/* Find the insertion point in the agenda. The activation */
/* is placed before activations of lower salience and */
/* after activations of higher salience. Among activations */
/* of equal salience, the OPS5 lex strategy is used for */
/* determining placement. */
/*=========================================================*/
while (actPtr != NULL)
{
if (actPtr->salience > salience)
{
lastAct = actPtr;
actPtr = actPtr->next;
}
else if (actPtr->salience < salience)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -