[jboss-svn-commits] JBL Code SVN: r7835 - in labs/jbossrules/trunk/drools-examples/src/main/rules/org/drools/examples: . sudoku
jboss-svn-commits at lists.jboss.org
jboss-svn-commits at lists.jboss.org
Sun Nov 26 10:18:43 EST 2006
Author: mfrandsen
Date: 2006-11-26 10:18:41 -0500 (Sun, 26 Nov 2006)
New Revision: 7835
Added:
labs/jbossrules/trunk/drools-examples/src/main/rules/org/drools/examples/sudoku/
labs/jbossrules/trunk/drools-examples/src/main/rules/org/drools/examples/sudoku/sudoku.drl
Log:
Sudoku solving with JBoss Rules - rules
Added: labs/jbossrules/trunk/drools-examples/src/main/rules/org/drools/examples/sudoku/sudoku.drl
===================================================================
--- labs/jbossrules/trunk/drools-examples/src/main/rules/org/drools/examples/sudoku/sudoku.drl 2006-11-26 14:31:23 UTC (rev 7834)
+++ labs/jbossrules/trunk/drools-examples/src/main/rules/org/drools/examples/sudoku/sudoku.drl 2006-11-26 15:18:41 UTC (rev 7835)
@@ -0,0 +1,168 @@
+package org.drools.examples.sudoku
+
+import org.drools.examples.sudoku.Field;
+import org.drools.examples.sudoku.PossibleValue;
+
+rule "Rule 1: If a field has the value 0, it is empty: remove it and insert the PossibleValues"
+ salience 100
+ when
+ $field : Field( value == 0, $row : row, $column : column, $zone : zone )
+ then
+ assert( new PossibleValue("1", $field ) );
+ assert( new PossibleValue("2", $field ) );
+ assert( new PossibleValue("3", $field ) );
+ assert( new PossibleValue("4", $field ) );
+ assert( new PossibleValue("5", $field ) );
+ assert( new PossibleValue("6", $field ) );
+ assert( new PossibleValue("7", $field ) );
+ assert( new PossibleValue("8", $field ) );
+ assert( new PossibleValue("9", $field ) );
+ retract( $field );
+ #System.out.println("Rule 1 fired.");
+end
+
+rule "Rule 2: If there is one PossibleValue left at a certain position, it should be the Fields value"
+ salience 5
+ when
+ $pv : PossibleValue ( $row : row, $zone : zone, $column : column, $value : value )
+ not ( PossibleValue ( row == $row, zone == $zone, column == $column, value != $value ) )
+ then
+ assert( new Field( $value, $column, $row, $zone ) );
+ retract( $pv );
+ #System.out.println("Rule 2 fired.");
+end
+
+
+rule "Rule 3: If there is a field with a value in a row, remove all PossibleValues with this value in this row"
+ salience 15
+ when
+ $field2 : Field( $row : row, $value : value != 0 )
+ $possible : PossibleValue( row == $row, value == $value )
+ then
+ retract( $possible );
+ #System.out.println("Rule 3 fired.");
+end
+
+rule "Rule 4: If there is a field with a value in a column, remove all PossibleValues with this value in this column"
+ salience 15
+ when
+ $field1 : Field( $column : column, $value : value != 0 )
+ $possible : PossibleValue( column == $column, value == $value )
+ then
+ retract( $possible );
+ #System.out.println("Rule 4 fired.");
+end
+
+rule "Rule 5: If there is a field with a value in a zone, remove all PossibleValues with this value in this zone"
+ salience 15
+ when
+ $field1 : Field( $zone : zone, $value : value != 0 )
+ $possible : PossibleValue( zone == $zone, value == $value )
+ then
+ retract( $possible );
+ #System.out.println("Rule 5 fired.");
+end
+
+rule "Rule 6: For fields with a value remove all PossibleValues"
+ salience 250
+ when
+ Field( value != 0, $col : column, $row : row, $zone : zone )
+ $pv : PossibleValue( column == $col, row == $row, zone == $zone )
+ then
+ retract( $pv );
+ #System.out.println("Rule 6 fired.");
+end
+
+rule "Rule 7: If there is only one PossibleValue left in a zone, it must have the value of the field"
+ salience 4
+ when
+ $pv : PossibleValue( $zone : zone, $value : value, $col : column, $row : row)
+ not (PossibleValue( zone == $zone, value == $value ))
+ not (Field( value == $value, zone == $zone) )
+ not (Field( value == $value, row == $row) )
+ not (Field( value == $value, column == $col) )
+ then
+ assert( new Field( $value, $col, $row, $zone ) );
+ retract( $pv );
+ #System.out.println("Rule 7 fired.");
+end
+
+rule "Rule 8: If there is only one PossibleValue left in a column, it must have the value of the field"
+ salience 4
+ when
+ $pv1 : PossibleValue( $zone : zone, $value : value, $col : column, $row : row)
+ not (PossibleValue( column == $col, value == $value ))
+ not (Field( value == $value, zone == $zone) )
+ not (Field( value == $value, row == $row) )
+ not (Field( value == $value, column == $col) )
+ then
+ assert( new Field( $value, $col, $row, $zone ) );
+ retract( $pv1 );
+ #System.out.println("Rule 8 fired.");
+end
+
+rule "Rule 9: If there is only one PossibleValue left in a row, it must have the value of the field"
+ salience 4
+ when
+ $pv : PossibleValue( $zone : zone, $value : value, $col : column, $row : row)
+ not (PossibleValue( row == $row, value == $value ))
+ not (Field( value == $value, zone == $zone) )
+ not (Field( value == $value, row == $row) )
+ not (Field( value == $value, column == $col) )
+ then
+ assert( new Field( $value, $col, $row, $zone ) );
+ retract( $pv );
+ #System.out.println("Rule 9 fired.");
+end
+
+rule "Rule 10: If there are two fields with only two possible values, remove the PossibleValues for the same Value in the rest of the zone"
+ salience 1
+ when
+ PossibleValue( $zone : zone, $val1 : value, $row1 : row, $col1 : column )
+ PossibleValue( zone == $zone, value == $val1, $row2 : row, $col2 : column != $col1)
+ PossibleValue( zone == $zone, row == $row1, column == $col1, $val2 : value )
+ PossibleValue( zone == $zone, row == $row2, column == $col2, value == $val2 )
+ not ( PossibleValue( zone == $zone, row == $row1, column == $col1, value != $val1, value != $val2 ) )
+ not ( PossibleValue( zone == $zone, row == $row2, column == $col2, value != $val1, value != $val2 ) )
+ $pv : PossibleValue( zone == $zone, value == $val1)
+ then
+ retract( $pv );
+ #System.out.println("Rule 10 fired.");
+end
+
+# This rule differs from the one above, that the 2nd PV should not be in the same row (above: not in the same column
+rule "Rule 11: If there are two fields with only two possible values, remove the PossibleValues for the same Value in the rest of the zone"
+ salience 1
+ when
+ PossibleValue( $zone : zone, $val1 : value, $row1 : row, $col1 : column )
+ PossibleValue( zone == $zone, value == $val1, $row2 : row != $row1, $col2 : column)
+ PossibleValue( zone == $zone, row == $row1, column == $col1, $val2 : value )
+ PossibleValue( zone == $zone, row == $row2, column == $col2, value == $val2 )
+ not ( PossibleValue( zone == $zone, row == $row1, column == $col1, value != $val1, value != $val2 ) )
+ not ( PossibleValue( zone == $zone, row == $row2, column == $col2, value != $val1, value != $val2 ) )
+ $pv : PossibleValue( zone == $zone, value == $val1)
+ then
+ retract( $pv );
+ #System.out.println("Rule 11 fired.");
+end
+
+##################################################
+# Rules not needed, just for debugging purpose:
+##################################################
+rule "log PossibleValues from certain row"
+ salience -25
+ when
+ $pos1 : PossibleValue ( row == 1, $value : value)
+ then
+ System.out.println("Left PV: " + $pos1.getRow() + $pos1.getColumn() + $pos1.getZone() + ":" + $pos1.getValue() );#+ $pos2.getValue());
+end
+
+
+
+rule "log all fields"
+ salience -20
+ when
+ $field : Field ( value == 0 )
+ then
+ System.out.println("left Field " + $field.toString());
+end
\ No newline at end of file
More information about the jboss-svn-commits
mailing list