(Context ctx)
| 489 | // / Sudoku solving example. |
| 490 | |
| 491 | void sudokuExample(Context ctx) throws TestFailedException |
| 492 | { |
| 493 | System.out.println("SudokuExample"); |
| 494 | Log.append("SudokuExample"); |
| 495 | |
| 496 | // 9x9 matrix of integer variables |
| 497 | IntExpr[][] X = new IntExpr[9][]; |
| 498 | for (int i = 0; i < 9; i++) |
| 499 | { |
| 500 | X[i] = new IntExpr[9]; |
| 501 | for (int j = 0; j < 9; j++) |
| 502 | X[i][j] = (IntExpr) ctx.mkConst( |
| 503 | ctx.mkSymbol("x_" + (i + 1) + "_" + (j + 1)), |
| 504 | ctx.getIntSort()); |
| 505 | } |
| 506 | |
| 507 | // each cell contains a value in {1, ..., 9} |
| 508 | BoolExpr[][] cells_c = new BoolExpr[9][]; |
| 509 | for (int i = 0; i < 9; i++) |
| 510 | { |
| 511 | cells_c[i] = new BoolExpr[9]; |
| 512 | for (int j = 0; j < 9; j++) |
| 513 | cells_c[i][j] = ctx.mkAnd(ctx.mkLe(ctx.mkInt(1), X[i][j]), |
| 514 | ctx.mkLe(X[i][j], ctx.mkInt(9))); |
| 515 | } |
| 516 | |
| 517 | // each row contains a digit at most once |
| 518 | BoolExpr[] rows_c = new BoolExpr[9]; |
| 519 | for (int i = 0; i < 9; i++) |
| 520 | rows_c[i] = ctx.mkDistinct(X[i]); |
| 521 | |
| 522 | // each column contains a digit at most once |
| 523 | BoolExpr[] cols_c = new BoolExpr[9]; |
| 524 | for (int j = 0; j < 9; j++) { |
| 525 | IntExpr[] col = new IntExpr[9]; |
| 526 | for (int i = 0; i < 9; i++) { |
| 527 | col[i] = X[i][j]; |
| 528 | } |
| 529 | cols_c[j] = ctx.mkDistinct(col); |
| 530 | } |
| 531 | |
| 532 | // each 3x3 square contains a digit at most once |
| 533 | BoolExpr[][] sq_c = new BoolExpr[3][]; |
| 534 | for (int i0 = 0; i0 < 3; i0++) |
| 535 | { |
| 536 | sq_c[i0] = new BoolExpr[3]; |
| 537 | for (int j0 = 0; j0 < 3; j0++) |
| 538 | { |
| 539 | IntExpr[] square = new IntExpr[9]; |
| 540 | for (int i = 0; i < 3; i++) |
| 541 | for (int j = 0; j < 3; j++) |
| 542 | square[3 * i + j] = X[3 * i0 + i][3 * j0 + j]; |
| 543 | sq_c[i0][j0] = ctx.mkDistinct(square); |
| 544 | } |
| 545 | } |
| 546 | |
| 547 | BoolExpr sudoku_c = ctx.mkTrue(); |
| 548 | for (BoolExpr[] t : cells_c) |
no test coverage detected