1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
/*******************************************************/
/* "C" Language Integrated Production System */
/* */
/* CLIPS Version 6.40 08/25/16 */
/* */
/* ENGINE HEADER FILE */
/*******************************************************/
/*************************************************************/
/* Purpose: Provides functionality primarily associated with */
/* the run and focus commands. */
/* */
/* Principal Programmer(s): */
/* Gary D. Riley */
/* */
/* Contributing Programmer(s): */
/* */
/* Revision History: */
/* */
/* 6.23: Correction for FalseSymbol/TrueSymbol. DR0859 */
/* */
/* Corrected compilation errors for files */
/* generated by constructs-to-c. DR0861 */
/* */
/* 6.24: Removed DYNAMIC_SALIENCE, INCREMENTAL_RESET, */
/* and LOGICAL_DEPENDENCIES compilation flags. */
/* */
/* Renamed BOOLEAN macro type to intBool. */
/* */
/* Added access functions to the HaltRules flag. */
/* */
/* Added EnvGetNextFocus, EnvGetFocusChanged, and */
/* EnvSetFocusChanged functions. */
/* */
/* 6.30: Added additional developer statistics to help */
/* analyze join network performance. */
/* */
/* Removed pseudo-facts used in not CEs. */
/* */
/* Added context information for run functions. */
/* */
/* Added before rule firing callback function. */
/* */
/* Changed garbage collection algorithm. */
/* */
/* Changed integer type/precision. */
/* */
/* Added EnvHalt function. */
/* */
/* Used gensprintf instead of sprintf. */
/* */
/* Removed conditional code for unsupported */
/* compilers/operating systems (IBM_MCW, */
/* MAC_MCW, and IBM_TBC). */
/* Added const qualifiers to remove C++ */
/* deprecation warnings. */
/* */
/* Converted API macros to function calls. */
/* */
/* 6.40: Removed LOCALE definition. */
/* */
/* Pragma once and other inclusion changes. */
/* */
/* Added support for booleans with <stdbool.h>. */
/* */
/* Removed use of void pointers for specific */
/* data structures. */
/* */
/* ALLOW_ENVIRONMENT_GLOBALS no longer supported. */
/* */
/* Incremental reset is always enabled. */
/* */
/* UDF redesign. */
/* */
/*************************************************************/
#ifndef _H_engine
#pragma once
#define _H_engine
typedef struct focalModule FocalModule;
#include "lgcldpnd.h"
#include "ruledef.h"
#include "network.h"
#include "moduldef.h"
#include "retract.h"
struct focalModule
{
Defmodule *theModule;
struct defruleModule *theDefruleModule;
FocalModule *next;
};
typedef struct ruleFiredFunctionItem RuleFiredFunctionItem;
typedef void RuleFiredFunction(Environment *,Activation *,void *);
struct ruleFiredFunctionItem
{
const char *name;
RuleFiredFunction *func;
int priority;
RuleFiredFunctionItem *next;
void *context;
};
#define ENGINE_DATA 18
struct engineData
{
Defrule *ExecutingRule;
bool HaltRules;
struct joinNode *TheLogicalJoin;
struct partialMatch *TheLogicalBind;
struct dependency *UnsupportedDataEntities;
bool alreadyEntered;
RuleFiredFunctionItem *ListOfAfterRuleFiresFunctions;
RuleFiredFunctionItem *ListOfBeforeRuleFiresFunctions;
FocalModule *CurrentFocus;
bool FocusChanged;
#if DEBUGGING_FUNCTIONS
bool WatchStatistics;
bool WatchFocus;
#endif
bool IncrementalResetInProgress;
bool JoinOperationInProgress;
struct partialMatch *GlobalLHSBinds;
struct partialMatch *GlobalRHSBinds;
struct joinNode *GlobalJoin;
struct partialMatch *GarbagePartialMatches;
struct alphaMatch *GarbageAlphaMatches;
bool AlreadyRunning;
#if DEVELOPER
long leftToRightComparisons;
long rightToLeftComparisons;
long leftToRightSucceeds;
long rightToLeftSucceeds;
long leftToRightLoops;
long rightToLeftLoops;
long findNextConflictingComparisons;
long betaHashHTSkips;
long betaHashListSkips;
long unneededMarkerCompare;
#endif
};
#define EngineData(theEnv) ((struct engineData *) GetEnvironmentData(theEnv,ENGINE_DATA))
#define MAX_PATTERNS_CHECKED 64
long long Run(Environment *,long long);
bool AddAfterRuleFiresFunction(Environment *,const char *,
RuleFiredFunction *,int,void *);
bool RemoveAfterRuleFiresFunction(Environment *,const char *);
bool AddBeforeRuleFiresFunction(Environment *,const char *,
RuleFiredFunction *,int,void *);
bool RemoveBeforeRuleFiresFunction(Environment *,const char *);
RuleFiredFunctionItem *AddRuleFiredFunctionToCallList(Environment *,const char *,int,RuleFiredFunction *,
RuleFiredFunctionItem *,void *);
RuleFiredFunctionItem *RemoveRuleFiredFunctionFromCallList(Environment *,const char *,
RuleFiredFunctionItem *,bool *);
void DeallocateRuleFiredCallList(Environment *,RuleFiredFunctionItem *);
void InitializeEngine(Environment *);
void SetBreak(Defrule *);
void Halt(Environment *);
bool RemoveBreak(Defrule *);
void RemoveAllBreakpoints(Environment *);
void ShowBreaks(Environment *,const char *,Defmodule *);
bool DefruleHasBreakpoint(Defrule *);
void RunCommand(Environment *,UDFContext *,UDFValue *);
void SetBreakCommand(Environment *,UDFContext *,UDFValue *);
void RemoveBreakCommand(Environment *,UDFContext *,UDFValue *);
void ShowBreaksCommand(Environment *,UDFContext *,UDFValue *);
void HaltCommand(Environment *,UDFContext *,UDFValue *);
void FocusCommand(Environment *,UDFContext *,UDFValue *);
void ClearFocusStackCommand(Environment *,UDFContext *,UDFValue *);
void ClearFocusStack(Environment *);
FocalModule *GetNextFocus(Environment *,FocalModule *);
const char *FocalModuleName(FocalModule *);
Defmodule *FocalModuleModule(FocalModule *);
void Focus(Defmodule *);
bool GetFocusChanged(Environment *);
void SetFocusChanged(Environment *,bool);
void ListFocusStackCommand(Environment *,UDFContext *,UDFValue *);
void ListFocusStack(Environment *,const char *);
void GetFocusStackFunction(Environment *,UDFContext *,UDFValue *);
void GetFocusStack(Environment *,CLIPSValue *);
void PopFocusFunction(Environment *,UDFContext *,UDFValue *);
Defmodule *PopFocus(Environment *);
bool GetHaltRules(Environment *);
void SetHaltRules(Environment *,bool);
Activation *NextActivationToFire(Environment *);
#endif /* _H_engine */