[rules-dev] Comparing Prolog

Wolfgang Laun wolfgang.laun at gmail.com
Tue Jul 9 05:46:43 EDT 2013


On 08/07/2013, Mark Proctor <mproctor at codehaus.org> wrote:
> As per the email, we don't' have the nice syntax for list unification - but
> it's just sugar. The same thing can be done, just more verbosely. I've not
> checked this compiles, but it shows the intent.

Next time do so, it's quite interesting, see below...

> query nextTo(String x, String y, List list)
>     isRight( x, y, list )
>     or
>     isRight( y, x, list )
> end
>
> query isRight(String l, String r, List list)
>     l := String() from list[0]
>     r := String() from list[1]
>     tail : List() from list.subList(1, list.size() )
>     isRight( l, r, tail )
> end
>

Copied your rules into a drl, and 5.5.0 crashes with:

Exception in thread "main" java.lang.NullPointerException
	at org.drools.rule.builder.QueryElementBuilder.build(QueryElementBuilder.java:59)
	at org.drools.rule.builder.PatternBuilder.build(PatternBuilder.java:180)
	at org.drools.rule.builder.PatternBuilder.build(PatternBuilder.java:123)
	at org.drools.rule.builder.GroupElementBuilder.build(GroupElementBuilder.java:67)
	at org.drools.rule.builder.RuleBuilder.build(RuleBuilder.java:84)
	at org.drools.compiler.PackageBuilder.addRule(PackageBuilder.java:2830)
	at org.drools.compiler.PackageBuilder.compileRules(PackageBuilder.java:970)
	at org.drools.compiler.PackageBuilder.compileAllRules(PackageBuilder.java:879)
	at org.drools.compiler.PackageBuilder.addPackage(PackageBuilder.java:871)
	at org.drools.compiler.PackageBuilder.addPackageFromDrl(PackageBuilder.java:466)
	at org.drools.compiler.PackageBuilder.addKnowledgeResource(PackageBuilder.java:694)
	at org.drools.builder.impl.KnowledgeBuilderImpl.add(KnowledgeBuilderImpl.java:51)
	at org.drools.builder.impl.KnowledgeBuilderImpl.add(KnowledgeBuilderImpl.java:40)

OK, I must not omit an import, but an NPE is uncalled for. So, I added
   import java.util.List
and then I get:
   ### compilation errors ###
   Unable to resolve ObjectType 'isRight' : [Rule name='nextTo']
   Query's must use positional or bindings, not field constraints:

This error message ought to be rewritten as
 "Queries require positional arguments or bindings, not field constraints"

Next, I added some semicolons:

query nextTo(String x, String y, List list)
    isRight( x, y, list; )
    or
    isRight( y, x, list; )
end

query isRight(String l, String r, List list)
    l := String() from list.get(0)
    r := String() from list.get(1)
    tail : List() from list.subList(1, list.size() )
    isRight( l, r, tail; )
end

and then I get:
   ### compilation errors ###
   Unable to resolve ObjectType 'isRight' : [Rule name='nextTo']

I had to swap the queries so that the definition of isRight precedes
its use in nextTo. That's a potentially blocking bug, since queries
can be used mutually recursively.

Quite a haul...
Wolfgang


More information about the rules-dev mailing list