On Tue, Jul 10, 2012 at 9:56 AM, Alexander Burger <[email protected]> wrote: > > don't find a match, the fourth one > > (be bigger (@x @y) (bigger @x @z) (bigger @z @y)) > > will always match and recurse infinitely.
Is it because it always match or because to know if it would succeed, it must test itself? Hence the recursion, now I got it. > I suspect this can be solved with a 'cut' (anybody out there who > knows?) I thought about the 'cut' before falling asleep, but I'm too weak at it. > but another solution would be to separate it into two > predicates: > > (be isbigger (me her)) > (be isbigger (her son)) > (be isbigger (son daughter)) > > (be bigger (@x @y) (isbigger @x @y)) > (be bigger (@x @y) (isbigger @x @z) (isbigger @z @y)) > > This gives: > > : (? (bigger son daughter)) > -> T > > : (? (bigger me @A)) > @A=her > @A=son > -> NIL > > : (? (bigger @A @B)) > @A=me @B=her > @A=her @B=son > @A=son @B=daughter > @A=me @B=son > @A=her @B=daughter > -> NIL It's a start, but it doesn't span enough: we can't prove «bigger me daughter». - search search - This it what is called a «transitive closure». Alex was right about using two predicates. The first is the base one, the second is its closure. So Alex's rule: (be bigger (@x @y) (isbigger @x @z) (isbigger @z @y)) should be: (be bigger (@x @y) (isbigger @x @z) (bigger @z @y)) Tests left as an exercise !!! Doug: Thanks for (trace). I thought about it but traced (?) instead. chri -- UNSUBSCRIBE: mailto:[email protected]?subject=Unsubscribe
