Issue title: Manners benchmark rules do not match the original problem
 Issue body: I took a look at the manners benchmark script and it has some changes which confuse me. You can find the CLIPS version of manners here https://github.com/smarr/CLIPS/blob/master/examples/manners/manners.clp

Is the None the same as NOT pattern? AKA first order logic negation. I find python a bit hard to read. I can't tell what NONE is and if it's really checking for the none existence of a given pattern. The opposite (exist (blah)) would be the exist of a given pattern.
 Comments: 
 Comment 0: Hi, thanks for posting the question. Yes `None` is equivalent to the CLIPS `Not` pattern. The behavior and use is described in the documentation:

https://github.com/jruizgit/rules/blob/master/docs/py/reference.md#lack-of-information

Please note: I wrote the manners benchmark in Python using a state machine for legibility. 
 Comment 1: thanks for responding. I looked at the rete.c code and it's not clear to me exactly how it's calculating none existence. I've studied several RETE implementation including CLIPS 6.x and several old ones written in LISP. It doesn't look like any of the known approaches that I'm aware of. Generally the slower approach is to iterate over the right and left memories of a 2-input (aka beta) node and perform the comparison. The faster approach is to use a specialized hash index, which is what CLIPS 6.3 uses. The fastest implementations all use specialized hash index for Exist and Not nodes.
 Comment 2: Hi, thanks for pointing that out. rete.c only creates a tree by parsing a JSON document. The tree is then compiled into Lua script, which is executed by Redis. You can see the code that does the Not evaluation in net.c line 1676. When I originally wrote the code I started by evaluating all the right messages and left frames. This was too slow. So I indexed right messages and left frames for a faster evaluation.  
 Comment 3: I don't use Lua, so I don't really undestand what Lua is doing. If I understand correctly, the engine is using Redis as the working memory and creating multiple indexes for each message based on rules. Is that an accurate interpretation? The last time I played with Redis, I just used it as a regular key/value store and benchmarked it against other K/V databases. To the best of my knowledge, the most optimal approach design for handling NOT, Exist and Only is with custom hash indexes. You can find the approach I used up on sourceforge. Using Redis may come back to bite you, since it won't give you the level of control necessary to use optimal design.

https://sourceforge.net/p/jamocha/svn/HEAD/tree/morendo/src/main/org/jamocha/rete/NotJoin.java
https://sourceforge.net/p/jamocha/svn/HEAD/tree/morendo/src/main/org/jamocha/rete/DefaultWM.java
{'source': 'GithubIssues', 'repo_name_with_owner': 'jruizgit/rules', 'issue_id': 356834660, 'repo_stars': 1037.0}