_ 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 <[email protected]> wrote:

> On 08/07/2013, Mark Proctor <[email protected]> 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


_______________________________________________
rules-dev mailing list
[email protected]
https://lists.jboss.org/mailman/listinfo/rules-dev

Reply via email to