- hxpwork
- 等级:
- 性别:
- 文章: 38
- 积分: 460
- 来自: 广州
|
Fact 插入
- StatefulSession session = null;
- try {
- Collection fields = new ArrayList();
-
-
- for ( int i = 0; i < field.length; i++ ) {
- String row = "{";
- for ( int j = 0; j < field[i].length; j++ ) {
- row += field[i][j] + ",";
- fields.add( new Field( "" + field[i][j],
- j + 1,
- i + 1,
- getZone( i,
- j ) ) );
- }
- row += "}";
- System.out.println( row );
- }
-
- RuleBase ruleBase = readRule();
- session = ruleBase.newStatefulSession();
-
-
- Iterator iter = fields.iterator();
-
- Collection handles = new ArrayList();
- while ( iter.hasNext() ) {
- handles.add( session.insert( iter.next() ) );
- }
- session.fireAllRules();
-
- System.out.println( "Size: " + iteratorToList( session.iterateObjects() ).size() );
-
-
- iter = session.iterateObjects();
-
- while ( iter.hasNext() ) {
- Object next = iter.next();
- if ( next instanceof Field ) {
- field[((Field) next).getRow() - 1][((Field) next).getColumn() - 1] = Integer.parseInt( ((Field) next).getValue() );
- }
- }
-
-
- for ( int i = 0; i < field.length; i++ ) {
- String row = "{";
- for ( int j = 0; j < field[i].length; j++ ) {
- row += field[i][j] + ",";
- }
- row += "}";
- System.out.println( row );
- }
-
- } catch ( Throwable t ) {
- t.printStackTrace();
- } finally {
- if ( session != null ) {
- session.dispose();
- }
- }
规则
- # 首先将所有数字为0的格子删除,并对这个格子插入从1-9的所有可能情况
- 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
- insert( new PossibleValue("1", $field ) );
- insert( new PossibleValue("2", $field ) );
- insert( new PossibleValue("3", $field ) );
- insert( new PossibleValue("4", $field ) );
- insert( new PossibleValue("5", $field ) );
- insert( new PossibleValue("6", $field ) );
- insert( new PossibleValue("7", $field ) );
- insert( new PossibleValue("8", $field ) );
- insert( new PossibleValue("9", $field ) );
-
-
- retract( $field );
-
- #System.out.println("Rule 1 fired.");
- end
-
- # 这个规则是当某一个格子上的PossibleValue只剩下一个时,那么这个PossibleValue的值就是要寻找的值
- 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
- insert( new Field( $value, $column, $row, $zone ) );
- System.out.println ( "Field be found in row="+$row+";col="+$column+"value="+$value );
- 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 2,3,4,5 不会引起该规则的调用,因为这几个规则是将其它可选值删除后剩余的值设为格子数字。
- # 该规则是由Rule 7,8,9激发的
- 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
- insert( 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
- insert( 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
- insert( 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
- # 找到一个可选值A
- PossibleValue( $zone : zone, $val1 : value, $row1 : row, $col1 : column )
- # 要求在相同区域中,不同列上具有与A数字相同的可选值C
- PossibleValue( zone == $zone, value == $val1, $row2 : row, $col2 : column != $col1)
- # 要求与A在同一个格子里有其它可选值B
- PossibleValue( zone == $zone, row == $row1, column == $col1, $val2 : value )
- # 要求在C的格子里有与B的数字相同的可选值
- PossibleValue( zone == $zone, row == $row2, column == $col2, value == $val2 )
- # 要求在A格子中不存在除A与B的数字以外的可选值,也就是说A格子中的可选值不超过两个
- not ( PossibleValue( zone == $zone, row == $row1, column == $col1, value != $val1, value != $val2 ) )
- # 要求在C格子中不存在除A与B的数字以外的可选值,也就是说C格子中的可选值不超过两个
- # 这两个not条件组合起来要表达的就是区域中有A,C两个格子中的可选值一样,并且只有两个
- not ( PossibleValue( zone == $zone, row == $row2, column == $col2, value != $val1, value != $val2 ) )
- # 获得区域中与A数字相同的其它可选值
- $pv : PossibleValue( zone == $zone, value == $val1)
- then
- retract( $pv );
- #System.out.println("Rule 10 fired.");
- end
-
- # 如果在一个区域中的两个空格子只剩两个可选值,则删除该区域中与这两个可选值相同的其它可选值
- # 本规则与上一规则基本一样区别是寻找C格子时使用不同行而不是不同列
- 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 )
- # 本行与规则10不同
- 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
声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
|