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 Eslinger).
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 Werkhoven.)
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 Bsave added.
Version 4.5 (April 15th, 1999):
Fixed "corrupted negcnt" when retracting definstance facts (thanks Abel Martinez.)
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 undefinstance.
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 Andreas Rasmussen.)
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.
Version 4.1b6:
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.
Version 4.1b5:
Just remove some debug code and extra files inadvertently shipped with 4.1b4.
Version 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.)
Version 4.1b3
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.
Version 4.1b2
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.
Version 4.1b1
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.
Version 4.0
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.
Version 4.0b4
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 properties. ppdefrule 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!).
Version 4.0b3
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.
Version 4.0b2
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 list-function$.
Version 4.0b1
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.
Version 3.2
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.
Version 3.1
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).
Version 3.0
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 fact #3.
Version 3.0b2
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 anyone out.
Version 3.0b1
First public release of Jess 3.0.
Version 3.0a3
UserPackage interface. Lots of new example UserFunctions for multifields, string, and predicates.
Version 3.0a2
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.
Version 3.0a1
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.
Version 2.2.1
Ken Bertapelle found another bug, which has been squashed, in the pattern network.
Version 2.2
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.
Version 2.1
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.
Version 2.0
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