protected Sudoku.Core.Sudoku SolveWithScope(Sudoku.Core.Sudoku instance) { var z3Solver = GetReusableSolver(); z3Solver.Push(); BoolExpr instance_c = GetPuzzleConstraint(instance); z3Solver.Assert(instance_c); if (z3Solver.Check() == Status.SATISFIABLE) { Model m = z3Solver.Model; for (int i = 0; i < 9; i++) { for (int j = 0; j < 9; j++) { if (instance.GetCell(i, j) == 0) { instance.SetCell(i, j, ((IntNum)m.Evaluate(X[i][j])).Int); } } } } else { Console.WriteLine("Failed to solve sudoku"); } z3Solver.Pop(); return(instance); }
protected Sudoku.Core.Sudoku SolveOriginalCleanup(Sudoku.Core.Sudoku instance) { BoolExpr instance_c = GetPuzzleConstraint(instance); var z3Solver = GetSolver(); z3Solver.Assert(GenericContraints); z3Solver.Assert(instance_c); if (z3Solver.Check() == Status.SATISFIABLE) { Model m = z3Solver.Model; for (int i = 0; i < 9; i++) { for (int j = 0; j < 9; j++) { if (instance.GetCell(i, j) == 0) { instance.SetCell(i, j, ((IntNum)m.Evaluate(X[i][j])).Int); } } } } else { Console.WriteLine("Failed to solve sudoku"); } return(instance); }
protected Sudoku.Core.Sudoku SolveWithSubstitutions(Sudoku.Core.Sudoku instance) { var substExprs = new List <Expr>(); var substVals = new List <Expr>(); for (int i = 0; i < 9; i++) { for (int j = 0; j < 9; j++) { if (instance.GetCell(i, j) != 0) { substExprs.Add(X[i][j]); substVals.Add(z3Context.MkInt(instance.GetCell(i, j))); } } } BoolExpr instance_c = (BoolExpr)GenericContraints.Substitute(substExprs.ToArray(), substVals.ToArray()); var z3Solver = GetSolver(); z3Solver.Assert(instance_c); if (z3Solver.Check() == Status.SATISFIABLE) { Model m = z3Solver.Model; for (int i = 0; i < 9; i++) { for (int j = 0; j < 9; j++) { if (instance.GetCell(i, j) == 0) { instance.SetCell(i, j, ((IntNum)m.Evaluate(X[i][j])).Int); } } } } else { Console.WriteLine("Failed to solve sudoku"); } return(instance); }
Sudoku.Core.Sudoku SudokuExample(Sudoku.Core.Sudoku instance) { BoolExpr instance_c = _ctx.MkTrue(); for (int i = 0; i < 9; i++) { for (int j = 0; j < 9; j++) { instance_c = _ctx.MkAnd(instance_c, (BoolExpr) _ctx.MkITE(_ctx.MkEq(_ctx.MkInt(instance.GetCell(i, j)), _ctx.MkInt(0)), _ctx.MkTrue(), _ctx.MkEq(X[i][j], _ctx.MkInt(instance.GetCell(i, j))))); } } Solver s = _ctx.MkSolver(); s.Assert(sudoku_c); s.Assert(instance_c); if (s.Check() == Status.SATISFIABLE) { Model m = s.Model; for (int i = 0; i < 9; i++) { for (int j = 0; j < 9; j++) { instance.SetCell(i, j, ((IntNum)m.Evaluate(X[i][j])).Int); } } return(instance); } else { Console.WriteLine("Failed to solve sudoku"); return(instance); } }
protected Sudoku.Core.Sudoku SolveOriginalVersion(Sudoku.Core.Sudoku instance) { BoolExpr instance_c = z3Context.MkTrue(); for (int i = 0; i < 9; i++) { for (int j = 0; j < 9; j++) { instance_c = z3Context.MkAnd(instance_c, (BoolExpr) z3Context.MkITE(z3Context.MkEq(z3Context.MkInt(instance.GetCell(i, j)), z3Context.MkInt(0)), z3Context.MkTrue(), z3Context.MkEq(X[i][j], z3Context.MkInt(instance.GetCell(i, j))))); } } Solver s = z3Context.MkSolver(); s.Assert(GenericContraints); s.Assert(instance_c); if (s.Check() == Status.SATISFIABLE) { Model m = s.Model; for (int i = 0; i < 9; i++) { for (int j = 0; j < 9; j++) { instance.SetCell(i, j, ((IntNum)m.Evaluate(X[i][j])).Int); } } return(instance); } else { Console.WriteLine("Failed to solve sudoku"); return(instance); } }