[rules-users] Negation semantics in Drools

Paul Fodor paul.i.fodor at gmail.com
Fri Apr 17 17:35:25 EDT 2009


I looked in the manual and I think this was your intended behaviour for
insertLogical (your approach to the best it can be done). I think it's fine.
Not many programs are non locally stratified, so this is definitely good
enough.
Paul.
On Fri, Apr 17, 2009 at 5:13 PM, Paul Fodor <paul.i.fodor at gmail.com> wrote:

> Hi Edson,
>
> The "insertLogical" doesn't work for non-stratified programs.
> For instance, in the win-nowin example, if there is a move(1,2) and
> a move(2,1), the order in which the two facts are inserted determines the
> final model (please see hte tests below).
>
> In logic programming, this example has two stable models: {win(1)} and
> {win(2)}, or a well-founded model {} (win(1) and win(2) are both undefined).
>
> Regards,
> Paul.
>  *
>
> package
> *tests;
>
> *
>
> import
> *tests.Test.Win;*
>
> import
> *tests.Test.Move;
>
> *
>
> rule
> *"direct"
>
> *when*
>
> m : Move(x : first, y : second)
>
> *not* Win(first == y)
>
> *then*
>
> *insertLogical*(*new* Win(m.getFirst()));*
>
> end
> *
>
> move
>
> 1
>
> 2
>
> move
>
> 2
>
> 1
>
> Test:
>
> reading rulefile: win.drl ...
>
> reading datafile: win_upper3_drools.drools ...
>
> loading cputime: 0.016
>
> loading walltime: 0.016
>
> calculating ...
>
> computing cputime: 0.0
>
> computing walltime: 0.0040
>
> Derived facts in memory:move(1, 2).
>
> win(2).
>
> move(2, 1).
>
> 3
>
> move
>
> 2
>
> 1
>
> move
>
> 1
>
> 2
>
> Test:
>
> reading rulefile: win.drl ...
>
> reading datafile: win_upper4_drools.drools ...
>
> loading cputime: 0.016
>
> loading walltime: 0.016
>
> calculating ...
>
> computing cputime: 0.0
>
> computing walltime: 0.0040
>
> Derived facts in memory:move(2, 1).
>
> win(1).
>
> move(1, 2).
>
> 3
>
> 2009/4/17 Edson Tirelli <tirelli at post.com>
>   >
> >
> >    I did not had time to analyze what jess is doing, but note that what
> is important is the final answer. In your example, with Move(1,2) and
> Move(2,3), the final answer must be Win(2), right? And that is what Drools
> will answer, does not matter the order in which the data is entered into the
> engine.
> >
> >    BUT, *very important*: the following construct in backward chaining:
> >
> > win(X):- move(X,Y), not(win(Y)).
> >
> >     Is better represented in forward chaining using *logicalInsert*
> instead of a regular *insert*:
> >
> > rule "direct" % Drools
> >
> >     when
> >         m : Move(x : first, y : second)
> >         not Win(first == y)
> >     then
> >         logicalInsert(new Win(m.getFirst()));
> > end
> >
> >     Since in your backward chaining rule, only one win() predicate
> instantiation will remain true.
> >
> >     So, even with differences in the reasoning algorithm, the answer is
> correct.
> >
> >     Please explain further if I am missing anything.
> >
> >     Edson
> >
> >
> > 2009/4/17 Paul Fodor <paul.i.fodor at gmail.com>
> >>
> >> Hi Edson, Greg,
> >> I don't think the rule is written wrong. This is how the win-nowin
> program is written in logic programming: X wins if there is a move from X to
> some Y and Y doesn't win:
> >>
> >> win(X):- move(X,Y), not(win(Y)).
> >>
> >> rule "direct" % Drools
> >>
> >>     when
> >>         m : Move(x : first, y : second)
> >>         not Win(first == y)
> >>     then
> >>  insert(new Win(m.getFirst()));
> >> end
> >>
> >> I think that it's interesting that, in Jess (another production rule
> system), the stratified model is always computed right, no matter what was
> the order of the facts in the database. If you want to take a look, please
> see the equivalent program in Jess for win-nowin that I attached. Just run
> it with:
> >> jess test.clp
> >>
> >> win_upper1_jess.jess
> >>
> >> (move (cur 1) (next 2))
> >> (move (cur 1) (next 3))
> >> (move (cur 2) (next 4))
> >> (move (cur 2) (next 5))
> >> ...
> >>
> >> win_upper2_jess.jess
> >>
> >> (move (cur 2) (next 4))
> >> (move (cur 2) (next 5))
> >> (move (cur 1) (next 2))
> >> (move (cur 1) (next 3))
> >> ...
> >>
> >> test.clp:
> >>
> >> (deftemplate move (slot cur) (slot next))
> >> (deftemplate win (slot val))
> >>
> >> (defrule find_win
> >>      (move (cur ?cur) (next ?next))
> >>      (not (win (val ?next)))
> >>      =>
> >>      (assert (win (val ?cur)))
> >> )
> >>
> >> (defquery query-win
> >>       (win (val ?val))
> >> )
> >> (open "win_result.txt" output a)
> >> (printout output  ./win_upper1_jess.jess crlf)
> >> (reset)
> >> (load-facts "./win_upper1_jess.jess")
> >> (bind ?tmx (call java.lang.management.ManagementFactory
> getThreadMXBean))
> >> (deffunction cputime () (return (* (?tmx getCurrentThreadCpuTime)
> 1E-9)))
> >> (bind ?starttime_wall (time))
> >> (bind ?starttime_cpu (cputime))
> >> (run)
> >> (bind ?query_result (run-query* query-win))
> >> (bind ?count 0)
> >> (while (?query_result next)
> >>     (++ ?count)
> >> )
> >> (printout output "solutions: " ?count crlf)
> >> (bind ?endtime_cpu (cputime))
> >> (bind ?endtime_wall (time))
> >> (bind ?walltime (- ?endtime_wall ?starttime_wall))
> >> (bind ?cputime (- ?endtime_cpu ?starttime_cpu))
> >> (printout output "computing cputime: " ?cputime crlf)
> >> (printout output "computing walltime: " ?walltime crlf)
> >> (close output)
> >>
> >> Regards,
> >> Paul Fodor.
> >>
> >> 2009/4/16 Edson Tirelli <tirelli at post.com>
> >>>
> >>>    Ha, thanks a lot Greg. I need new glasses... he is actually
> comparing with the parameter "second", but when creating the win fact, using
> the parameter "first".
> >>>
> >>> not Win(first == m.second)
> >>>   insert(new Win(m.first));
> >>>
> >>>    Yes, in this case the engine is working exactly as it should.
> >>>
> >>>    Anyway, I added the (fixed) test case to the codebase, just in case.
> :)
> >>>
> >>>    Thanks,
> >>>        Edson
> >>>
> >>> 2009/4/16 Greg Barton <greg_barton at yahoo.com>
> >>>>
> >>>> You don't have to worry.  The engine is acting as it should.
> >>>>
> >>>> The rule Paul had was this, a bit simplified for clarity:
> >>>>
> >>>> rule "direct"
> >>>> when
> >>>>    m : Move()
> >>>>    not Win(first == m.second)
> >>>> then
> >>>>        insert(new Win(m.first));
> >>>> end
> >>>>
> >>>> If the insertion order is [Move(1,2), Move(2,3)] then the rule matches
> first on Move(2,3) and Win(2) is inserted.  No other rule fires because now
> Move(1,2) and Win(2) match up, removing the instantiation with Move(1,2)
> from the agenda.
> >>>>
> >>>> If the insertion order is [Move(2,3), Move(1,2)] then the order is
> this:
> >>>>
> >>>> matched Move(1,2) insert Win(1)
> >>>> matched Move(2,3) insert Win(2)
> >>>>
> >>>> The insertion of Win(1) in the first firing does NOT prevent the
> instantiation with Move(2,3) from then firing.
> >>>>
> >>>> So it's all good. :)  Sample code and output attached.
> >>>>
> >>>> --- On Thu, 4/16/09, Greg Barton <greg_barton at yahoo.com> wrote:
> >>>>
> >>>> > From: Greg Barton <greg_barton at yahoo.com>
> >>>> > Subject: Re: [rules-users] Negation semantics in Drools
> >>>> > To: "Rules Users List" <rules-users at lists.jboss.org>
> >>>> > Date: Thursday, April 16, 2009, 8:50 PM
> >>>> > It is on the latest snapshot release,
> >>>> > 5.0.0.20090417.005612-483
> >>>> >
> >>>> > --- On Thu, 4/16/09, Edson Tirelli <tirelli at post.com>
> >>>> > wrote:
> >>>> >
> >>>> > >     We need to investigate if that is still happening
> >>>> > in
> >>>> > > latest trunk.
> >>>> >
> >>>> >
> >>>> >
> >>>> > _______________________________________________
> >>>> > rules-users mailing list
> >>>> > rules-users at lists.jboss.org
> >>>> > https://lists.jboss.org/mailman/listinfo/rules-users
> >>>>
> >>>>
> >>>>
> >>>> _______________________________________________
> >>>> rules-users mailing list
> >>>> rules-users at lists.jboss.org
> >>>> https://lists.jboss.org/mailman/listinfo/rules-users
> >>>>
> >>>
> >>>
> >>>
> >>> --
> >>>  Edson Tirelli
> >>>  JBoss Drools Core Development
> >>>  JBoss, a division of Red Hat @ www.jboss.com
> >>>
> >>> _______________________________________________
> >>> rules-users mailing list
> >>> rules-users at lists.jboss.org
> >>> https://lists.jboss.org/mailman/listinfo/rules-users
> >>>
> >>
> >>
> >> _______________________________________________
> >> rules-users mailing list
> >> rules-users at lists.jboss.org
> >> https://lists.jboss.org/mailman/listinfo/rules-users
> >>
> >
> >
> >
> > --
> >  Edson Tirelli
> >  JBoss Drools Core Development
> >  JBoss, a division of Red Hat @ www.jboss.com
> >
> > _______________________________________________
> > rules-users mailing list
> > rules-users at lists.jboss.org
> > https://lists.jboss.org/mailman/listinfo/rules-users
> >
>
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://lists.jboss.org/pipermail/rules-users/attachments/20090417/0ae82035/attachment.html 


More information about the rules-users mailing list