[rules-dev] Comparing Prolog

Mark Proctor mproctor at codehaus.org
Tue Jul 9 09:56:18 EDT 2013


_ is bind an unbound field. Just replace with a variable you don't use. _1, _2, _3 would work.

Mark
On 9 Jul 2013, at 10:46, Wolfgang Laun <wolfgang.laun at gmail.com> wrote:

> 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…
It was just a sketch that I took 20s to illustrate for you, written in the email,  I expected it not to compile.


> 
>> 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