11. Change History
Version 5.2 (May 3rd, 2001):
Bug fix release. Fixed the few bugs previously described in the FAQ
for version 5.1. This manual has been only minimally updated.
Version 5.1 (April 24th, 2000):
Bug fix release. Fixed two bugs in backwards chaining (thanks Ashraf
Afifi.) Also, a regression repaired: pattern bindings couldn't be
matched as they could in Jess 4, and now they can again.
Version 5.0 (January 28th, 2000):
Added new function cross-reference section to the manual (thanks to
Roger Firestone for the idea.) parseDeftemplate now handles comments
in child templates (thanks Richard Long.) TextAreaWriter (and hence
Console and ConsoleApplet) prunes the oldest characters from its
TextArea to prevent the Win32 freeze problem.
Version 5.0b4 (January 5th, 2000):
Fixed broken fact-slot-value function. Some support for new RU.LONG
type. Added (run-until-halt), runUntilHalt(), activationSemaphore,
etc. (unique) CE no longer prevents partial matches from being
retracted, only from being propagated (thanks Vicken Kasparian.)
Nested nots and (exists) CE added. Unmatched variables can appear in
function calls within defqueries (thanks Michal
Fadljevic). Bsave/bload now works with defclasses (thanks Russ
Milliken.) ReflectFunctions cache result of BeanInfo.getPropertyDescriptors().
Version 5.0b3 (November 30th, 1999):
Support for reworked version of Bob Orchard's fuzzy logic
extensions. When multiple activations of one rule were due to
different multifield matches of the same set of facts, retracting one
fact would cause only one activation to be removed. This is now fixed
(thanks, Al Davis.) Share function-call-containing join nodes; thanks
George Rudolph for the reminder. Fixed UnWatch class for buggy JDK 1.x
compilers. Can match directly on defglobals now. ReflectFunctions
cache result of Class.getMethods().
Version 5.0b2 (November 8th, 1999):
Several bugs in run-query and parseDefquery fixed (thanks Alex
Karasulu). (watch) handlers flush stdout (thanks David Young.) Fix
bare return-value constraints in multislots (thanks Dave Barnett.)
Problem with returning parameters from deffunctions, and missing
resolveValue calls in BagFunctions fixed (thanks Bruce Douglas.)
assert() and retract() call processPendingFacts() directly (thanks
Thomas Barnekow.) Multislot matching "optimization" fixed (thanks
Robert Gaimari.) Deffacts allows global variables in fact slots
(thanks Michael Coen.) Try harder to coerce all multifield entries to
same type when converting to Java array (thanks Ralph Grove.) Fix
a synchronization problem (thanks Javier Maria Torres Ramon.)
Version 5.0b1 (September 21st, 1999):
jess.Console works again (thanks Lakshmi Vempati). Compiles with buggy
JDK 1.1.x compiler. bload/bsave preserves listeners (i.e., deffacts work).
Did away with Successor class (simplified Rete network, reduced memory
usage.) Fixed bug where redefined rules with shared nodes wouldn't
reset. Specialized Value subclasses now explicitly override
numericValue(). Yet another pesky "not" bug (thanks Vadim Zaliva.) All
facts/definstances inherit, ultimately, from "__fact". In Rete
network, callNodeRight() takes Fact, not token; right memories store
Facts, too (fewer allocations, less memory!) Return-value constraint
was erroneously requiring bound variable; thanks Dave Kirby. Miroslav Madecki
reported a "ghost fact" bug; fixing it improved Jess's "manners"
benchmark performace by another 25% (!) "system" returns a Process
object (thanks Alan Moore). (open) uses a 10-character buffer - large file
I/O speedup (thanks Norman Gyhra).
Version 5.0a6 (July 8th, 1999):
insert$, replace$ behave as documented w.r.t argument types (thanks
Emmanuel Pierre). Typo: agenda wasn't being cleared on reset (thanks
Bob Orchard.) Removed some redundant checks in network (more
speedups!) Final multivar argument to deffunction now properly handles
passed-in multifields; thanks Ning Zhong. Added "import". Fixed bug in
using variable as salience value; thanks David Young. Bug in special
code for calling public methods of package-private classes; thanks
Cheruku Srini. Bug in member$ fixed (thanks David Young again.) Bug in
retracting facts which are multifield pattern-matched on rule LHS
fixed (thanks Yang Xiao). All classes serializable again (thanks
Michael Friedrich). Several small optimizations related to
fact-duplication (thanks Osvaldo Pinali Doederlein.) JessEvents
working again, with event mask. Bitwise arithmetic functions
added. Fixed some more multifield matching strangeness (thanks
Benjamin Good). Added "|" (or) connective constraint.
Version 5.0a5 (May 20th, 1999):
Drastic changes to the way Funcalls are executed (much simplification
and speedup!) Fixed "corrupted negcnt" when retracting definstance
facts (thanks Abel Martinez.) Much improved agenda management,
including time tags. Smart indexing based on tested values. New
heuristics for eliminating redundant tests. (store foo nil) now
removes value of foo (thanks Kathy Lee Simunich for the suggestion.)
(system) command now pipes program output to console (thanks Fang Liu
for idea). (undefinstance *) now removes all definstances (thanks Mike
Lucero for idea). Multiple defglobal references on rule LHS no longer
broken (thanks Jacek Gwizdka for report.) Many upgrades to
JessException class (thanks Kenny Macleod). Some Value constructors
no longer have the redundant second argument. get/set-fact-duplication
(thanks to Osvaldo Pinali Doederlein for the idea.) Bob Orchard
figured out how to get rid of the extra EOFs in jess.ConsolePanel.
Console and ConsoleApplet can now read a file and continue, as they
used to. Backwards chaining now more general; one goal can trigger
multiple rules, both in parallel and in chains. ViewFunctions and
ReflectFunctions moved into jess package, many more classes now
package-private. jess.reflect package renamed jess.awt; TextReader,
TextAreaWriter moved into it. "throw" command added (thanks Eric
Version 5.0a4 (March 18th, 1999):
Call removePropertyChangeListener on undefinstance (thanks to Dan
Larner.) Added defadvice. Three buglets, thanks to Bob Orchard:
defglobals can now refer to other Defglobals in their definitions;
(bind) and (foreach) are now pickier about arguments; undefined
variables now universally evaluate as 'nil'. Applet security problems
fixed (thanks S.S. Ozsariyildiz). Problem with matching and otherwise
dealing with zero-length multislots and array bean properties fixed;
null array values are converted into zero-length arrays (thanks
Miroslav Madecki.) (call) does much better error reporting. Passing
Strings to functions accepting Objects now works (J. P. van
Version 5.0a3 (February 12th, 1999):
Token(Token) changes UPDATE to ADD. Hashcode used in TokenTree
modifiable. (clear) now fully clears deffacts. Many general
speedups. TokenTree hash factor can now be set globally and per-rule.
Functional Accelerator class exists for math functions. (modify)
funcalls print out correctly. get-var removed (no longer needed.)
Nonsychronization error in jess.Retract.call() led to Corrupted
Negcnt; fixed (reported by Dan Larner). Other corrupted negcnt error
due to duplicated tokens fixed. definstances can be static or
dynamic. jess.Pattern is public; several methods added or made public
to support rule editors. Defrule.toString works for all cases. Console
class now uses Main to do business. .jessrc file now named
scriptlib.clp and found using Class.getResource(). (batch) can use
getResource() to find scripts, so they can live in .jar files. Batch
now an intrinsic. Rewrote some multifield functions to better handle
EXTERNAL_ADDRESS objects; added hashCode() to jess.Value. (facts) and
(rules) now in scriptlib, not Java. Much improved public interface for
Deftemplate, Fact classes.
Version 5.0a2 (December 15th, 1998):
m_sortcode in Token no longer a blank final to work around JDK 1.1.6/7a
javac bug. Makefile no longer mentions unbundled files. Backward
chaining works again (was broken in 5.0a1)
Version 5.0a1 (December 9th, 1998):
All 16-bit (Reader/Writer) text I/O - some user code changes required.
Serialization (crude version). Inheritance for deftemplates,
defclasses. jess.Main reads $HOME/.jessrc at startup if it exists. No
more ReteDisplay, Resetable, or Clearable interfaces: instead, use
jess.JessListener and jess.JessEvent. (view) uses JessListener instead of
Observer/Observable; rewritten to provide movable nodes, per-node
debug code. jess.reflect.JessListener class renamed to
jess.reflect.JessAWTListener. Bean-itized many function names (name()
-> getName()), breaking lots of user code, I'm afraid. (run)
returns number of rules fired. Ordered facts now stored as unordered
with one multislot named __data. Backwards chaining added. Bload and
Version 4.5 (April 15th, 1999):
Fixed "corrupted negcnt" when retracting definstance facts (thanks
Version 4.4 (March 18th, 1999):
Token(Token) changes UPDATE to ADD. (clear) not truly clearing
deffacts (thanks to Rob Jefson). Passing Strings to Java methods
expecting Object now works. Call removePropertyChangeListener in
Version 4.3 (December 1st, 1998):
Fixed redundant default-value processing, which was leading to odd
problems with definstances with null slot values (thanks to
S.S. Ozsariyildiz). Removed intern()s from Tokenizer (faster
compilation). Fixed NIL/nil ambiguity in ReflectFunctions (thanks
Version 4.2 (November 12th, 1998):
Fixed 'Corrupted negcnt' bug (thanks to Todd Bowers). (if ... then)
function now throws an exception if atom 'then' is missing. Version string
in 4.1 final was inadvertently left at 4.1b6. Added section to README
explaining rule LHS semantics a bit better. Rete.findFactByID() is now
public. Fix for very tricky 'phantom fact' problem reported by Steve
Bucuvalas. Java method calls on Jess Strings now work for all Strings,
not just alphanumeric ones. "animals" example modified to work with
transitional gensym implementation.
Version 4.1 (September 15th, 1998):
Some minor bug fixes; code to allow you to leave off the '$' on a
multivar after its first use, as in CLIPS.
Allow named variables in (not) CEs as long as they're not used in
subsequent CEs. Fix a bug that was causing (return) to not work if
inside a (foreach) inside a deffunction. Recursive deffunctions now
work again. Jess works around a bug in some versions of Java that was
preventing the atom '-' from parsing. Rete.listDefglobals() no longer
lists duplicates of redefined defglobals (Karl Mueller found this
one.) ReteDisplay.fireRule() is now called as appropriate. Accessing
pattern-binding variables on rule LHSs works again (Karl again.)
(reset) wasn't clearing all activations (thanks Al Davis);
fixed. Funcall.toString() puts parens around the ValueVector version.
Just remove some debug code and extra files inadvertently shipped with 4.1b4.
addUserfunction, addDeffunction, etc collapsed into one
addUserfunction routine in Rete class; same with
findUserfunction. RU.getAtom() and RU.putAtom are gone!
Userfunction.name() now returns String. ControlStructure
interface used to clean up handling of such things. ReteCompiler uses
Hashtables of Bindings instead of int for vartables. Added
default-dynamic deftemplate slot qualifier. Added
set-/get-reset-globals, and changed the default defglobal reset
behaviour. Added dynamic rule salience. Removed arbitrary limit of 32
slots for ordered facts and 32 tests per slot for all facts. "unique"
CE (15-30% speed increase for many problems!) Various documentation
improvements (many thanks to Win Carus.) Better error reporting
(addContext() call in JessException.) Malformed calls to 'eval' or
'build' or 'executeCommand' no longer go into an infinite loop on
EOF. Added "store" and "fetch". Added "external-addressp". Rearranged
Test1, Test2 classes into an inheritance hierarchy with a virtual
doTest method, allowing for alternate implementations (undocumented
java-test functionality included). Value class will do more type
conversions automatically. Final multifield argument of a deffunction
now acts as a wildcard, as in CLIPS (thanks David Young.)
Problem with calling public methods of package-private classes from Jess
fixed thanks to Lars Rasmusson's explanation. OutOfMemoryError
while parsing file containing unbalanced open parens fixed. Line breaks
in double-quoted strings no longer need to be (but can be) escaped. Two
fixes thanks to Andreas Rasmusson: gensym* returns a symbol as
documented, not a string; and a propertyChangeEvent for a bogus
property no longer causes Jess to retract a definstance without
updating it. Many of the synchronized methods in the Rete class
no longer are synchronized; instead they use either synchronized blocks
keyed to affected members or simply depend on the internal synchronization
of Hashtables. read and readline explicitly act differently
for console-like and file-like streams. ConsoleDisplay gets a
Clear Window button.
- Bug in character-escape lexing fixed thanks to Josiah
Poon. Parser-related bug in explode$ fixed thanks to Andrew
X. Comas. eval, build, executeCommand()
again properly return the result of last expression, not
EOF. min, max take arbitrary # of
arguments. implode$ now works; it apparently never really
did. printout puts parens around multifields
again. str-compare documentation
corrected. undefinstance now removes the fact representing an
object as well as deactivating matching. Wrote large regression test
suite (not included in distribution). Bug in multiple simultaneous
Rete.run() calls in separate threads fixed thanks to Andreas
Rasmusson. Selectable conflict resolution strategies (only depth and
breadth supported now) and user-definable strategies. The try
command is added.
- Much better lexer (no more StreamTokenizer). Input
buffering problems with JDK 1.1.2-1.1.4 fixed. Bug in (test)
CE fixed. Can call run on rule RHS. Bug in incremental update
fixed. Separate command-line, applet, and GUI console driver classes
(Quiz* classes broken up, renamed to
Console*). read and readline should work
exactly as in CLIPS. Manual describes more about how to write Java
main(). Bug in definstance that was preventing use
of subclasses of a defclassed class is fixed.
BeanInfo support. quiz.html embeds only one QuizDisplay
applet. Pumps demo works again (sorry). Conflict resolution strategy
now should be exactly the same as CLIPS's default.
Extensive manual rewrite, adding lots of Java/Jess interoperation info.
Allow standard CLIPS deffunction docstrings. Thanks to Jack Fitch, Dave
Carlson and Alex Jacobson, property names for reflected Java Beans now
use standard capitalization transform. Better error reporting, especially
during parsing and from the command line. set and get
renamed to set-member and get-member. set and
get are now functions that read and write Bean
properly handles quoted strings in function calls. executeCommand
and friends reuse a single parser. Thanks to Karl Mueller for
Rete.retractString. Taught batch to read
applet-based data files. eval now handles non-sexps. Better
mechanism for synchronizing streams. QuizDisplay
is an applet as well as an application. run accepts an argument,
the maximum number of rules to fire. Fixed bug in modify when
new slot value was a zero-length multifield. Fixed ReteCompiler
bug where MTELN nodes were not consistently generated for zero-length
multifield matches. Thanks to Sidney Bailin, fixed problem with accessing
defglobals and variables bound to pattern indexes on rule LHSs. Added
get-var function. Added
undefinstance. modify and retract now
handle definstance facts specially. Fixed some doPPPattern
bugs (Dave Carlson again!).
Added jess.reflect package containing new, call,
set, and get. Added JessListener and its subclasses.
added engine. Changed printing of external-addresses to include
Java class name. Changed parser to accept variable names as Funcall heads
(call is substitued, resulting in a runtime error if call
is not installed). and and or functions now accept any
values as arguments, not only funcalls. Added foreach control
structure. Command prompt doesn't print NIL return values. Fixed
another not bug (thanks to Sidney Bailin). Added matching of Java
objects on rule LHSs: definstance, defclass. TokenTree
now uses sortcode % 101 as hash key, not the sortcode
itself. All global classes moved into jess package. Jess
class renamed Main.
Cleaned up router/parser interactions. Jess will now read only one construct
on a line of input (just like CLIPS). All Jess output now goes through
WSTDOUT router, not through ReteDisplay.stdout(). Fixed
bug whereby second and later references to subfields of multifields on
the LHS of a rule would resolve to the whole multifield. modify
can now properly handle multislots. format handles trailing spaces.
Finally, parsing of integers: 2 is an RU.INTEGER, while
2.0 is an RU.FLOAT. Added eval and
Code reformat. Major performance enhancements (Value and Funcall
recycling; Fastfunction interface; Rete memories are now btrees; RU.CLEAR
tokens). test CE. Return-value constraints. ppdefrule
thanks to Rajaram Ganeshan. Blank variables in not CEs. system
blocks by default. readline fixed. build supported. logic for
predicate functions in Rete network now precisely the same as for CLIPS.
QuizDisplay demo. while and if accept boolean
variables. Implied returns from if and while functions.
Added explode$. Added I/O routers: open, close.
Added format. Added bag.
system and integer Userfunction classes renamed (Win95
filename capitalization problem!). Broken delete$, insert$,
replace$ fixed. view command added. Big if/then in Funcall
class finally removed in favor of separate implementation classes for intrinsics,
leading to a modest speed increase. Documentation vastly expanded! Added
catch for ArrayOutOfBoundsException in command-line interface;
no more crash on wrong number of arguments. Broken evenp, oddp
fixed. str-cat, sym-cat made more general. Broken sub-string
fixed. Big switch in Node1 class replaced by separate classes,
leading to a very modest speed increase.
Added the assert-string and batch commands. Two bug fixes
in multislot code (thanks to Nancy Flaherty). Added undefrule
and the ability to redefine rules. Added the system function,
although it doesn't work very well under Java. Public function engine()
in jess.Context class allows you to do fancier things in Userfunctions.
Added the non-standard load-package and load-function
functions. Many new contributed functions packaged with Jess for doing
math, handling multifields, and other neat stuff thanks to Win Carus. Added
time (1 second resolution).
A few code changes to accomodate Microsoft's Java compiler; Jess now compiles
unchanged with JVC thanks to Mike Finnegan. Added member$ multifield
function. Added clear intrinsic thanks to Karl Mueller. Introduced
a new way of handling not patterns which I think finally guarantees
there are no more not-related bugs remaining! load-facts, which
has been non-functional throughout the beta period, is working again. Documentation
now explains unzipping and compiling a little better. Modified the way
fact-id's are handled so that you can write (retract 3) to retract
Lots of bug reports and improvement suggestions from the field - thanks
folks! All the reported bugs in the multifield implementation, and some
residual odd behavior in the not CE, have been fixed. The exit
command has been added. A command prompt has been added. The #
character can now be used in symbols. The access levels on some methods
in the Rete class have been opened up; Rete is no longer
final. nth$ is now 1-based, as it is in CLIPS. The if
and while constructs now fire on not FALSE instead of
TRUE. The str-index function has been fixed and added.
Probably a few more things I'm forgetting here. Thanks for the input. Particular
thanks to Nancy Flaherty, Joszef Toth, Karl Mueller, Duane Steward, and
Michelle Dunn for reporting bugs fixed in this version; sorry if I left
First public release of Jess 3.0.
UserPackage interface. Lots of new example UserFunctions for multifields,
string, and predicates.
Multislots! Also important bug fix: under certain circumstances, the Rete
network compilation could fail 1) if (not()) CEs occurred on the
LHS of a rule, 2) new variables were introduced in that rule's patterns
listed after the (not()) CEs, and 3) these latter variables were
tested (i.e., in a predicate constraint) on the LHS of the rule.
Incremental reset. Watch activations. gc() in LostDisplay,
NullDisplay. Multifields! All the Rete engine classes are now
in a package named jess. Many classes and methods that should
not be manipulated by clients are now package-private.
Ken Bertapelle found another bug, which has been squashed, in the pattern
Jess 2.2 adds a few new function calls (load-facts, save-facts)
and fixes a serious bug (thanks to Ken Bertapelle for pointing it out!)
which caused Jess to crash when predicate constraints were used in a certain
way. Another bug fix corrected the fact that retract only retracted
the first of a list of facts. Jess used to give a truly inscrutable error
message if a variable was first used in a not CE (a syntax error); the
current error message is much easier to understand. I also clarified a
few points in the documentation.
Jess 2.1 is *much* faster than version 2.0. The Monkey example runs in
about half the time as under Jess 2.0, and for some inputs, the speed has
increased by an order of magnitude! This is probably the last big speed
increase I'll get. For Java/Rete weenies, this speed increase came from
banishing the use of java.lang.Vector in Tokens and in two-input node memories.
Jess is now within a believable interpreted Java/C++ speed ratio range
of about 30:1. Jess 2.1 now includes rule salience. It also implements
a few additional intrinsic functions: gensym*, mod, readline.
Jess 2.1 fixes a bug in the way predicate constraints were parsed under
some conditions by Jess 2.0. The parser now reports line numbers when it
encounters an error.
Jess 2.0 is intrinsically about 30% faster than version 1.0. The internal
data structures changed quite a bit. The Rete network now shares nodes
in the Join network instead of just in the pattern network. The current
data structures should allow for continued improvement.
Back to index