📄 rulecom.c
字号:
/*******************************************************/
/* "C" Language Integrated Production System */
/* */
/* CLIPS Version 6.24 05/17/06 */
/* */
/* RULE COMMANDS MODULE */
/*******************************************************/
/*************************************************************/
/* Purpose: Provides the matches command. Also provides the */
/* the developer commands show-joins and rule-complexity. */
/* Also provides the initialization routine which */
/* registers rule commands found in other modules. */
/* */
/* Principal Programmer(s): */
/* Gary D. Riley */
/* */
/* Contributing Programmer(s): */
/* */
/* Revision History: */
/* */
/* 6.24: Removed CONFLICT_RESOLUTION_STRATEGIES */
/* INCREMENTAL_RESET, and LOGICAL_DEPENDENCIES */
/* compilation flags. */
/* */
/* Renamed BOOLEAN macro type to intBool. */
/* */
/*************************************************************/
#define _RULECOM_SOURCE_
#include <stdio.h>
#define _STDIO_INCLUDED_
#include <string.h>
#include "setup.h"
#if DEFRULE_CONSTRUCT
#include "argacces.h"
#include "constant.h"
#include "constrct.h"
#include "crstrtgy.h"
#include "engine.h"
#include "envrnmnt.h"
#include "evaluatn.h"
#include "extnfunc.h"
#include "incrrset.h"
#include "lgcldpnd.h"
#include "memalloc.h"
#include "pattern.h"
#include "reteutil.h"
#include "router.h"
#include "ruledlt.h"
#include "watch.h"
#if BLOAD || BLOAD_AND_BSAVE || BLOAD_ONLY
#include "rulebin.h"
#endif
#include "rulecom.h"
/***************************************/
/* LOCAL INTERNAL FUNCTION DEFINITIONS */
/***************************************/
#if DEVELOPER
static void ShowJoins(void *,void *);
#endif
/****************************************************************/
/* DefruleCommands: Initializes defrule commands and functions. */
/****************************************************************/
globle void DefruleCommands(
void *theEnv)
{
#if ! RUN_TIME
EnvDefineFunction2(theEnv,"run",'v', PTIEF RunCommand,"RunCommand", "*1i");
EnvDefineFunction2(theEnv,"halt",'v', PTIEF HaltCommand,"HaltCommand","00");
EnvDefineFunction2(theEnv,"focus",'b', PTIEF FocusCommand,"FocusCommand", "1*w");
EnvDefineFunction2(theEnv,"clear-focus-stack",'v',PTIEF ClearFocusStackCommand,
"ClearFocusStackCommand","00");
EnvDefineFunction2(theEnv,"get-focus-stack",'m',PTIEF GetFocusStackFunction,
"GetFocusStackFunction","00");
EnvDefineFunction2(theEnv,"pop-focus",'w',PTIEF PopFocusFunction,
"PopFocusFunction","00");
EnvDefineFunction2(theEnv,"get-focus",'w',PTIEF GetFocusFunction,
"GetFocusFunction","00");
#if DEBUGGING_FUNCTIONS
EnvDefineFunction2(theEnv,"set-break",'v', PTIEF SetBreakCommand,
"SetBreakCommand","11w");
EnvDefineFunction2(theEnv,"remove-break",'v', PTIEF RemoveBreakCommand,
"RemoveBreakCommand", "*1w");
EnvDefineFunction2(theEnv,"show-breaks",'v', PTIEF ShowBreaksCommand,
"ShowBreaksCommand", "01w");
EnvDefineFunction2(theEnv,"matches",'v',PTIEF MatchesCommand,"MatchesCommand","11w");
EnvDefineFunction2(theEnv,"list-focus-stack",'v', PTIEF ListFocusStackCommand,
"ListFocusStackCommand", "00");
EnvDefineFunction2(theEnv,"dependencies", 'v', PTIEF DependenciesCommand,
"DependenciesCommand", "11h");
EnvDefineFunction2(theEnv,"dependents", 'v', PTIEF DependentsCommand,
"DependentsCommand", "11h");
#endif /* DEBUGGING_FUNCTIONS */
EnvDefineFunction2(theEnv,"get-incremental-reset",'b',
GetIncrementalResetCommand,"GetIncrementalResetCommand","00");
EnvDefineFunction2(theEnv,"set-incremental-reset",'b',
SetIncrementalResetCommand,"SetIncrementalResetCommand","11");
EnvDefineFunction2(theEnv,"get-strategy", 'w', PTIEF GetStrategyCommand, "GetStrategyCommand", "00");
EnvDefineFunction2(theEnv,"set-strategy", 'w', PTIEF SetStrategyCommand, "SetStrategyCommand", "11w");
#if DEVELOPER && (! BLOAD_ONLY)
EnvDefineFunction2(theEnv,"rule-complexity",'l', PTIEF RuleComplexityCommand,"RuleComplexityCommand", "11w");
EnvDefineFunction2(theEnv,"show-joins", 'v', PTIEF ShowJoinsCommand, "ShowJoinsCommand", "11w");
#if DEBUGGING_FUNCTIONS
//AddWatchItem(theEnv,"rule-analysis",0,&DefruleData(theEnv)->WatchRuleAnalysis,0,NULL,NULL);
#endif
#endif /* DEVELOPER && (! BLOAD_ONLY) */
#else
#if MAC_MCW || IBM_MCW || MAC_XCD
#pragma unused(theEnv)
#endif
#endif /* ! RUN_TIME */
}
#if DEBUGGING_FUNCTIONS
/****************************************/
/* MatchesCommand: H/L access routine */
/* for the matches command. */
/****************************************/
globle void MatchesCommand(
void *theEnv)
{
char *ruleName;
void *rulePtr;
ruleName = GetConstructName(theEnv,"matches","rule name");
if (ruleName == NULL) return;
rulePtr = EnvFindDefrule(theEnv,ruleName);
if (rulePtr == NULL)
{
CantFindItemErrorMessage(theEnv,"defrule",ruleName);
return;
}
EnvMatches(theEnv,rulePtr);
}
/********************************/
/* EnvMatches: C access routine */
/* for the matches command. */
/********************************/
globle intBool EnvMatches(
void *theEnv,
void *theRule)
{
struct defrule *rulePtr, *tmpPtr;
struct partialMatch *listOfMatches, **theStorage;
struct joinNode *theJoin, *lastJoin;
int i, depth;
ACTIVATION *agendaPtr;
int flag;
int matchesDisplayed;
/*=================================================*/
/* Loop through each of the disjuncts for the rule */
/*=================================================*/
for (rulePtr = (struct defrule *) theRule, tmpPtr = rulePtr;
rulePtr != NULL;
rulePtr = rulePtr->disjunct)
{
/*======================================*/
/* Determine the last join in the rule. */
/*======================================*/
lastJoin = rulePtr->lastJoin;
/*===================================*/
/* Determine the number of patterns. */
/*===================================*/
depth = GetPatternNumberFromJoin(lastJoin);
/*=========================================*/
/* Store the alpha memory partial matches. */
/*=========================================*/
theStorage = (struct partialMatch **)
genalloc(theEnv,(unsigned) (depth * sizeof(struct partialMatch)));
theJoin = lastJoin;
i = depth - 1;
while (theJoin != NULL)
{
if (theJoin->joinFromTheRight)
{ theJoin = (struct joinNode *) theJoin->rightSideEntryStructure; }
else
{
theStorage[i] = ((struct patternNodeHeader *) theJoin->rightSideEntryStructure)->alphaMemory;
i--;
theJoin = theJoin->lastLevel;
}
}
/*========================================*/
/* List the alpha memory partial matches. */
/*========================================*/
for (i = 0; i < depth; i++)
{
if (GetHaltExecution(theEnv) == TRUE)
{
genfree(theEnv,theStorage,(unsigned) (depth * sizeof(struct partialMatch)));
return(TRUE);
}
EnvPrintRouter(theEnv,WDISPLAY,"Matches for Pattern ");
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -