I think the plan is to support both or and || - but this will not include || in expression blocks
( or ( Person(name == "mark") Persn(name == "john" )  )
(  Person(name == "mark")  || Person(name == "john" )  )

Bindings on fields and facts are done with : just like in JRules.

"snippets" are available in predicate and return field constraints and consequences:
Person(age:age == "21")
Person(age == (age + 2) )

The age + 2 is a predicate field contraint and can be any expression, we will support predicate expressions as SMF implementations so we can support multiple languages; we may only deliver java for 3.0, depending on time. Consequences will be SMF implementations as before.

Mark


Michael Neale wrote:
Looks nice.

Can we use normal snippets as an alternative to the "short" syntax below? In
that case, how does one specify the parameter bindings?

also, the drools.assertObject(): would be nice to have a dedicated keyword
for this (can still use the knowledge helper if you like as well).

I am also interested to see what the "or" looks like.


On 12/10/05, Mark Proctor <[EMAIL PROTECTED]> wrote:
I've just coded up in the Drools 3.0 rule language. Bindings are
specified locally and application data is specified as arguments to the
rule. This example shows a converted Miss Manners, so application data
is not used:

public class Guest {
  private String  name;
  private char sex;
  private String hobby;
  ...
}

public class LastSeat {
    private int seat;
    ...
}

public class Seating {
    private int id;
    private int pid;
    private int leftSeat;
    private int rightSeat;
    private String leftName;
    private String rightName;
    private boolean pathDone;
    ...
}

public class Path {
    private int id;
    private String name;
    private int seat;
    ...
}

public class Chosen {
    private int id;
    private String name;
    private String hobby;
    ...
}

public class Count {
    private int value;
   ...
}

rule assignFirstSeat() {
    Context context;
    when {
        context : Context( state == Context.START_UP )
        Guest( guestName:name )
        count : Count(countValue:value)
    } then {
        drools.assert( new Seating( 1, guestName, 2, guestName,
countValue, 0, true ) );
        drools.assert( new Path( countValue, guestName, 1 ) );
        count.setCount(  countValue + 1 );

        ystem.out.println( "seat 1 " + guestName + " );

        context.setPath( Context.ASSIGN_SEATS );
    }
}

rule makePath() {
    Context context;
    int id, pid, leftSeat, rightSeat;
    String pathName;

    when {
        context : Context( state == Context.MAKE_PATH )
        Seat( id:id, pid:pid )
        Path( id == pid, pathName:name, pathSeat:seat )
        (not Path( id == id, name == pathName )
    } else {
        drools.assert( new Path( id, pathName, pathSeat ) );

    }
}

rule findSeating() {
    Context context;
    int id, pid, leftSeat, rightSeat;
    String leftSeatName, rightSeatName, leftGuestName, rightGuestHobby;

    when {
        context : Context( state == Context.START )
        Seating( id:id, pid:pid, leftSeat:leftSeat, leftSeatName:leftName,
              rightSeat:rightSeat, rightSeatName:rightName, pathDone ==
true )
        Guest( name == rightSeatName, rightGuestSex:sex,
rightGuestHobby:hobby )
        Guest( leftGuestName:name , sex != rightGuestSex, hobby ==
rightGuestHobby )

        count : Count(countValue:value)

        not ( Path( id == id, name == leftGuestName) )
        not ( Chosen( id == id, name == leftGuestName, hobby ==
rightGuestHobby) )
    } then {
        int newSeat = rightSeat + 1;
        drools.assert( new Seating( rightSeat, rightSeatName,
leftGuestName, newSeat, countValue, id, false );
        drools.assert( new Path( countValue, leftGuestName, newSeat );
        drools.assert( new Chosen( id, leftGuestName, rightGuestHobby ) );

        System.out.println( "seat " + rightSeat + " " + rightSeatName +
" " + leftGuestName );

        count.setCount(  countValue + 1 );
        context.setPath( Context.MAKE_PATH );
    }
}

rule pathDone() {
    Context context;
    Seat seat;
    when {
        context : Context( state == Context.MAKE_PATH )
        seating : Seating( pathDone == false )
    } then {
        seating.setPathDone( true );
        context.setName( Context.CHECK_DONE );
    }
}

rule areWeDoneYet() {
    Context context;
    when {
        context : Context( state == Context.CHECK_DONE )
        LastSeat( lastSeat: seat )
        Seating( seat == lastSeat )
    } then {
        context.setName( Context.PRINT_RESULTS );
    }
}

rule continueProcessing {
    Context context;
    when {
        context : Context( state == Context.CHECK_DONE )
    } then {
        context.setName( Context.ASSIGN_SEATS);
    }
}

rule printResults() {
    Context context;
    when {
        context : Context( state == Context.PRINT_RESULTS )
        Seating( id: id, rightSeat:rightSeat )
        LastSeat( seat == rightSeat )
        path:Path( id == id, pathName:name, pathSeat:seat)
    } then {
        System.out.println( "name : '" + pathName + "' seat : '" +
pathSeat + "'" );
    }
}

rule allDone {
    Context context;
    when {
        context : Context( state == Context.PRINT_RESULTS )
    } then {
        System.out.println( "rule all done: Condition context
print_results" );
    }
}




Reply via email to