Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- using ClassLibrary1;
- using ClassLibrary3;
- using Microsoft.Z3;
- using System;
- using System.Collections.Generic;
- using System.Linq;
- using System.Text;
- using System.Threading.Tasks;
- namespace WindowsFormsApplication11.Csp
- {
- public class PuzzleComposer
- {
- [Flags()]
- public enum SquareScalar : ulong
- {
- A1 = 0x1, B1 = 0x2, C1 = 0x4, D1 = 0x8,
- E1 = 0x10, F1 = 0x20, G1 = 0x40, H1 = 0x80,
- A2 = 0x100, B2 = 0x200, C2 = 0x400, D2 = 0x800,
- E2 = 0x1000, F2 = 0x2000, G2 = 0x4000, H2 = 0x8000,
- A3 = 0x10000, B3 = 0x20000, C3 = 0x40000, D3 = 0x80000,
- E3 = 0x100000, F3 = 0x200000, G3 = 0x400000, H3 = 0x800000,
- A4 = 0x1000000, B4 = 0x2000000, C4 = 0x4000000, D4 = 0x8000000,
- E4 = 0x10000000, F4 = 0x20000000, G4 = 0x40000000, H4 = 0x80000000,
- A5 = 0x100000000, B5 = 0x200000000, C5 = 0x400000000, D5 = 0x800000000,
- E5 = 0x1000000000, F5 = 0x2000000000, G5 = 0x4000000000, H5 = 0x8000000000,
- A6 = 0x10000000000, B6 = 0x20000000000, C6 = 0x40000000000, D6 = 0x80000000000,
- E6 = 0x100000000000, F6 = 0x200000000000, G6 = 0x400000000000, H6 = 0x800000000000,
- A7 = 0x1000000000000, B7 = 0x2000000000000, C7 = 0x4000000000000, D7 = 0x8000000000000,
- E7 = 0x10000000000000, F7 = 0x20000000000000, G7 = 0x40000000000000, H7 = 0x80000000000000,
- A8 = 0x100000000000000, B8 = 0x200000000000000, C8 = 0x400000000000000, D8 = 0x800000000000000,
- E8 = 0x1000000000000000, F8 = 0x2000000000000000, G8 = 0x4000000000000000, H8 = 0x8000000000000000
- }
- public void Test()
- {
- using(var x = new Microsoft.Z3.Context())
- {
- uint bitboardQueenAttacks = 0x0;
- var bitboardSort = x.MkBitVecSort(64);
- var piece = x.MkDatatypeSort("Piece", new[]{
- x.MkConstructor("Queen", ""),
- x.MkConstructor("Rook", ""),
- x.MkConstructor("Bishop", ""),
- x.MkConstructor("Knight", "")
- });
- var pieceQueen = piece.Constructors[0];
- var pieceRook = piece.Constructors[1];
- var pieceBishop = piece.Constructors[2];
- var pieceKnight = piece.Constructors[3];
- var bitboard_to_piece = x.MkFuncDecl("type_of", bitboardSort, piece);
- var f = x.MkFuncDecl("piece_bitboard_to_attacked", new Microsoft.Z3.Sort[] {
- piece,
- bitboardSort
- }, bitboardSort);
- //x.ParseSMTLIB2String("");
- var solver = x.MkSimpleSolver(); // Solver();
- //solver.Assert(x.MkEq());
- foreach (SquareScalar value in Enum.GetValues(typeof(SquareScalar)))
- {
- UInt64 bitboard = (UInt64)value;
- UInt64 queens = PositionWrapper.AttackedSquares(ClassLibrary3.PieceSpec.Queen, bitboard, bitboard);
- UInt64 orthogonal = PositionWrapper.AttackedSquares(ClassLibrary3.PieceSpec.Rook, bitboard, bitboard);
- UInt64 diagonals = PositionWrapper.AttackedSquares(ClassLibrary3.PieceSpec.Bishop, bitboard, bitboard);
- UInt64 knights = PositionWrapper.AttackedSquares(ClassLibrary3.PieceSpec.Knight, bitboard, bitboard);
- var bvPiecePos = x.MkBV(bitboard, 64);
- // rooks
- solver.Assert(x.MkEq(
- x.MkApp(f, pieceRook.Apply(), bvPiecePos),
- x.MkBV(orthogonal, 64)));
- // queens
- solver.Assert(x.MkEq(
- x.MkApp(f, pieceQueen.Apply(), bvPiecePos),
- x.MkBV(queens, 64)));
- // bishops
- solver.Assert(x.MkEq(
- x.MkApp(f, pieceBishop.Apply(), bvPiecePos),
- x.MkBV(diagonals, 64)));
- // knights
- solver.Assert(x.MkEq(
- x.MkApp(f, pieceKnight.Apply(), bvPiecePos),
- x.MkBV(knights, 64)));
- }
- //EightQueensProblem(bitboardSort, x, solver, f, pieceRook, pieceQueen, pieceBishop);
- var status = SquaresProblem(bitboardSort, x, ref solver, f, pieceRook, pieceQueen, pieceBishop, pieceKnight);
- if (status != Status.SATISFIABLE) return;
- // var status = solver.Check();
- var model = solver.Model;
- ulong piece0 = 0, piece1 = 0, piece2 = 0, piece3 = 0;
- ulong test = 0;
- foreach(var d in model.Decls)
- {
- if (d.Arity != 0) continue;
- var interpr = model.ConstInterp(d);
- System.Diagnostics.Debug.WriteLine(d.Name + " = " + interpr + " (" + string.Format("{0:X}", ulong.Parse(interpr.ToString())) + ")");
- if (d.Name + "" == "piece0")
- {
- piece0 = ulong.Parse(interpr.ToString());
- }
- else if (d.Name + "" == "piece1")
- {
- piece1 = ulong.Parse(interpr.ToString());
- }
- else if (d.Name + "" == "piece2")
- {
- piece2 = ulong.Parse(interpr.ToString());
- }
- else if (d.Name + "" == "piece3")
- {
- piece3 = ulong.Parse(interpr.ToString());
- }
- }
- test = piece0 | piece1 | piece2 | piece3;
- System.Diagnostics.Debug.WriteLine(string.Format("{0:X}", test));
- int file, rank;
- //GameState gm = GameState.Clean;
- var gm = new MutableGameState();
- ClassLibrary1.PieceSquareSpec.BreakSquare((SquareScalar)piece0, out file, out rank);
- gm.AddPieceAt(file, rank, (int)kind.queen + (int)color.white);
- ClassLibrary1.PieceSquareSpec.BreakSquare((SquareScalar)piece1, out file, out rank);
- gm.AddPieceAt(file, rank, (int)kind.rook + (int)color.white);
- ClassLibrary1.PieceSquareSpec.BreakSquare((SquareScalar)piece2, out file, out rank);
- gm.AddPieceAt(file, rank, (int)kind.bishop + (int)color.white);
- ClassLibrary1.PieceSquareSpec.BreakSquare((SquareScalar)piece3, out file, out rank);
- gm.AddPieceAt(file, rank, (int)kind.knight + (int)color.white);
- var gmState = GameState.FromIGameState(gm);
- //var y = new NewGame(gmState);
- //Main.OpenForm(y);
- var frm = new FormBoardEditor(gmState);
- frm.ShowDialog();
- }
- }
- private Status SquaresProblem(Sort bitboardSort, Context x, ref Solver solver, FuncDecl f, FuncDecl pieceRook, FuncDecl pieceQueen, FuncDecl pieceBishop, FuncDecl pieceKnight)
- {
- BitVecExpr p0 = (BitVecExpr)x.MkConst("piece0", bitboardSort);
- BitVecExpr p1 = (BitVecExpr)x.MkConst("piece1", bitboardSort);
- BitVecExpr p2 = (BitVecExpr)x.MkConst("piece2", bitboardSort);
- BitVecExpr p3 = (BitVecExpr)x.MkConst("piece3", bitboardSort);
- // pieces cant overlap
- solver.Assert(x.MkDistinct(p0, p1, p2, p3));
- BitVecExpr p0Attacked = (BitVecExpr)x.MkApp(f, pieceQueen.Apply(), p0);
- BitVecExpr p1Attacked = (BitVecExpr)x.MkApp(f, pieceRook.Apply(), p1);
- BitVecExpr p2Attacked = (BitVecExpr)x.MkApp(f, pieceBishop.Apply(), p2);
- BitVecExpr p3Attacked = (BitVecExpr)x.MkApp(f, pieceKnight.Apply(), p3);
- // pieces must not be 0
- solver.Assert(x.MkNot(x.MkEq(x.MkBV(0, 64), p0)));
- solver.Assert(x.MkNot(x.MkEq(x.MkBV(0, 64), p1)));
- solver.Assert(x.MkNot(x.MkEq(x.MkBV(0, 64), p2)));
- solver.Assert(x.MkNot(x.MkEq(x.MkBV(0, 64), p3)));
- // the set of attacked squares by an arbitrary piece must not equal 0
- solver.Assert(x.MkNot(x.MkEq(x.MkBV(0, 64), p0Attacked)));
- solver.Assert(x.MkNot(x.MkEq(x.MkBV(0, 64), p1Attacked)));
- solver.Assert(x.MkNot(x.MkEq(x.MkBV(0, 64), p2Attacked)));
- solver.Assert(x.MkNot(x.MkEq(x.MkBV(0, 64), p3Attacked)));
- // the piece bitboard must have one and only one bit set
- solver.Assert(x.MkEq(x.MkBV(0, 64), x.MkBVAND(p0, x.MkBVSub(p0, x.MkBV(1, 64)))));
- solver.Assert(x.MkEq(x.MkBV(0, 64), x.MkBVAND(p1, x.MkBVSub(p1, x.MkBV(1, 64)))));
- solver.Assert(x.MkEq(x.MkBV(0, 64), x.MkBVAND(p2, x.MkBVSub(p2, x.MkBV(1, 64)))));
- solver.Assert(x.MkEq(x.MkBV(0, 64), x.MkBVAND(p3, x.MkBVSub(p3, x.MkBV(1, 64)))));
- // pieces and squares cant overlap
- solver.Assert(x.MkEq(x.MkBV(0, 64), x.MkBVAND(
- x.MkBV((ulong)(SquareScalar.E1 | SquareScalar.E5 | SquareScalar.H2), 64),
- x.MkBVOR(x.MkBVOR(x.MkBVOR(p0, p1), p2), p3)
- )));
- // place a rook queen and bishop in such a way that
- // the square a1 is attacked 3 times
- // the square h1 is attacked 2 times
- // the square f4 is attacked 1 time
- //foreach(var square in squaresSpec)
- //{
- //}
- var checkA1_0 = x.MkITE(x.MkEq(x.MkBV((ulong)SquareScalar.E1, 64), x.MkBVAND(p0Attacked, x.MkBV((ulong)SquareScalar.E1, 64))), x.MkInt(1), x.MkInt(0));
- var checkA1_1 = x.MkITE(x.MkEq(x.MkBV((ulong)SquareScalar.E1, 64), x.MkBVAND(p1Attacked, x.MkBV((ulong)SquareScalar.E1, 64))), x.MkInt(1), x.MkInt(0));
- var checkA1_2 = x.MkITE(x.MkEq(x.MkBV((ulong)SquareScalar.E1, 64), x.MkBVAND(p2Attacked, x.MkBV((ulong)SquareScalar.E1, 64))), x.MkInt(1), x.MkInt(0));
- var checkA1_3 = x.MkITE(x.MkEq(x.MkBV((ulong)SquareScalar.E1, 64), x.MkBVAND(p3Attacked, x.MkBV((ulong)SquareScalar.E1, 64))), x.MkInt(1), x.MkInt(0));
- var checkH1_0 = x.MkITE(x.MkEq(x.MkBV((ulong)SquareScalar.E5, 64), x.MkBVAND(p0Attacked, x.MkBV((ulong)SquareScalar.E5, 64))), x.MkInt(1), x.MkInt(0));
- var checkH1_1 = x.MkITE(x.MkEq(x.MkBV((ulong)SquareScalar.E5, 64), x.MkBVAND(p1Attacked, x.MkBV((ulong)SquareScalar.E5, 64))), x.MkInt(1), x.MkInt(0));
- var checkH1_2 = x.MkITE(x.MkEq(x.MkBV((ulong)SquareScalar.E5, 64), x.MkBVAND(p2Attacked, x.MkBV((ulong)SquareScalar.E5, 64))), x.MkInt(1), x.MkInt(0));
- var checkH1_3 = x.MkITE(x.MkEq(x.MkBV((ulong)SquareScalar.E5, 64), x.MkBVAND(p3Attacked, x.MkBV((ulong)SquareScalar.E5, 64))), x.MkInt(1), x.MkInt(0));
- var checkF4_0 = x.MkITE(x.MkEq(x.MkBV((ulong)SquareScalar.H2, 64), x.MkBVAND(p0Attacked, x.MkBV((ulong)SquareScalar.H2, 64))), x.MkInt(1), x.MkInt(0));
- var checkF4_1 = x.MkITE(x.MkEq(x.MkBV((ulong)SquareScalar.H2, 64), x.MkBVAND(p1Attacked, x.MkBV((ulong)SquareScalar.H2, 64))), x.MkInt(1), x.MkInt(0));
- var checkF4_2 = x.MkITE(x.MkEq(x.MkBV((ulong)SquareScalar.H2, 64), x.MkBVAND(p2Attacked, x.MkBV((ulong)SquareScalar.H2, 64))), x.MkInt(1), x.MkInt(0));
- var checkF4_3 = x.MkITE(x.MkEq(x.MkBV((ulong)SquareScalar.H2, 64), x.MkBVAND(p3Attacked, x.MkBV((ulong)SquareScalar.H2, 64))), x.MkInt(1), x.MkInt(0));
- solver.Assert(x.MkEq(x.MkInt(3), x.MkAdd((ArithExpr)checkA1_0, (ArithExpr)checkA1_1, (ArithExpr)checkA1_2, (ArithExpr)checkA1_3)));
- solver.Assert(x.MkEq(x.MkInt(2), x.MkAdd((ArithExpr)checkH1_0, (ArithExpr)checkH1_1, (ArithExpr)checkH1_2, (ArithExpr)checkH1_3)));
- solver.Assert(x.MkEq(x.MkInt(1), x.MkAdd((ArithExpr)checkF4_0, (ArithExpr)checkF4_1, (ArithExpr)checkF4_2, (ArithExpr)checkF4_3)));
- while (true)
- {
- // get next pseudo solution
- var status = solver.Check();
- // None???
- if (status != Status.SATISFIABLE)
- {
- return status;
- }
- UInt64 queen = 0;
- UInt64 rook = 0;
- UInt64 bishop = 0;
- UInt64 knight = 0;
- foreach (var d in solver.Model.Decls)
- {
- if (d.Arity != 0) continue;
- var interpr = solver.Model.ConstInterp(d);
- if (d.Name + "" == "piece0")
- {
- queen = ulong.Parse(interpr.ToString());
- }
- else if (d.Name + "" == "piece1")
- {
- rook = ulong.Parse(interpr.ToString());
- }
- else if (d.Name + "" == "piece2")
- {
- bishop = ulong.Parse(interpr.ToString());
- }
- else if (d.Name + "" == "piece3")
- {
- knight = ulong.Parse(interpr.ToString());
- }
- }
- // get position of queen / rook / bishop
- // get occupancy board
- var occ = queen | rook | bishop | knight;
- // get new attacking bitboards
- var queenRealAttacked = PositionWrapper.AttackedSquares(ClassLibrary3.PieceSpec.Queen, queen, occ);
- var rookRealAttacked = PositionWrapper.AttackedSquares(ClassLibrary3.PieceSpec.Rook, rook, occ);
- var bishopRealAttacked = PositionWrapper.AttackedSquares(ClassLibrary3.PieceSpec.Bishop, bishop, occ);
- var knightRealAttacked = PositionWrapper.AttackedSquares(ClassLibrary3.PieceSpec.Knight, knight, occ);
- // push new context for our tiny test
- solver.Push();
- //{
- BitVecExpr p0AttackedReal = (BitVecExpr)x.MkConst("p0AttackedReal", bitboardSort);
- BitVecExpr p1AttackedReal = (BitVecExpr)x.MkConst("p1AttackedReal", bitboardSort);
- BitVecExpr p2AttackedReal = (BitVecExpr)x.MkConst("p2AttackedReal", bitboardSort);
- BitVecExpr p3AttackedReal = (BitVecExpr)x.MkConst("p3AttackedReal", bitboardSort);
- solver.Assert(x.MkEq(p0AttackedReal, x.MkBV(queenRealAttacked, 64)));
- solver.Assert(x.MkEq(p1AttackedReal, x.MkBV(rookRealAttacked, 64)));
- solver.Assert(x.MkEq(p2AttackedReal, x.MkBV(bishopRealAttacked, 64)));
- solver.Assert(x.MkEq(p3AttackedReal, x.MkBV(knightRealAttacked, 64)));
- ArithExpr checkA1_0_2 = (ArithExpr)x.MkITE(x.MkEq(x.MkBV((ulong)SquareScalar.E1, 64), x.MkBVAND(p0AttackedReal, x.MkBV((ulong)SquareScalar.E1, 64))), x.MkInt(1), x.MkInt(0));
- ArithExpr checkA1_1_2 = (ArithExpr)x.MkITE(x.MkEq(x.MkBV((ulong)SquareScalar.E1, 64), x.MkBVAND(p1AttackedReal, x.MkBV((ulong)SquareScalar.E1, 64))), x.MkInt(1), x.MkInt(0));
- ArithExpr checkA1_2_2 = (ArithExpr)x.MkITE(x.MkEq(x.MkBV((ulong)SquareScalar.E1, 64), x.MkBVAND(p2AttackedReal, x.MkBV((ulong)SquareScalar.E1, 64))), x.MkInt(1), x.MkInt(0));
- ArithExpr checkA1_3_2 = (ArithExpr)x.MkITE(x.MkEq(x.MkBV((ulong)SquareScalar.E1, 64), x.MkBVAND(p3AttackedReal, x.MkBV((ulong)SquareScalar.E1, 64))), x.MkInt(1), x.MkInt(0));
- ArithExpr checkH1_0_2 = (ArithExpr)x.MkITE(x.MkEq(x.MkBV((ulong)SquareScalar.E5, 64), x.MkBVAND(p0AttackedReal, x.MkBV((ulong)SquareScalar.E5, 64))), x.MkInt(1), x.MkInt(0));
- ArithExpr checkH1_1_2 = (ArithExpr)x.MkITE(x.MkEq(x.MkBV((ulong)SquareScalar.E5, 64), x.MkBVAND(p1AttackedReal, x.MkBV((ulong)SquareScalar.E5, 64))), x.MkInt(1), x.MkInt(0));
- ArithExpr checkH1_2_2 = (ArithExpr)x.MkITE(x.MkEq(x.MkBV((ulong)SquareScalar.E5, 64), x.MkBVAND(p2AttackedReal, x.MkBV((ulong)SquareScalar.E5, 64))), x.MkInt(1), x.MkInt(0));
- ArithExpr checkH1_3_2 = (ArithExpr)x.MkITE(x.MkEq(x.MkBV((ulong)SquareScalar.E5, 64), x.MkBVAND(p3AttackedReal, x.MkBV((ulong)SquareScalar.E5, 64))), x.MkInt(1), x.MkInt(0));
- ArithExpr checkF4_0_2 = (ArithExpr)x.MkITE(x.MkEq(x.MkBV((ulong)SquareScalar.H2, 64), x.MkBVAND(p0AttackedReal, x.MkBV((ulong)SquareScalar.H2, 64))), x.MkInt(1), x.MkInt(0));
- ArithExpr checkF4_1_2 = (ArithExpr)x.MkITE(x.MkEq(x.MkBV((ulong)SquareScalar.H2, 64), x.MkBVAND(p1AttackedReal, x.MkBV((ulong)SquareScalar.H2, 64))), x.MkInt(1), x.MkInt(0));
- ArithExpr checkF4_2_2 = (ArithExpr)x.MkITE(x.MkEq(x.MkBV((ulong)SquareScalar.H2, 64), x.MkBVAND(p2AttackedReal, x.MkBV((ulong)SquareScalar.H2, 64))), x.MkInt(1), x.MkInt(0));
- ArithExpr checkF4_3_2 = (ArithExpr)x.MkITE(x.MkEq(x.MkBV((ulong)SquareScalar.H2, 64), x.MkBVAND(p3AttackedReal, x.MkBV((ulong)SquareScalar.H2, 64))), x.MkInt(1), x.MkInt(0));
- solver.Assert(x.MkEq(x.MkInt(3), x.MkAdd(checkA1_0_2, checkA1_1_2, checkA1_2_2, checkA1_3_2)));
- solver.Assert(x.MkEq(x.MkInt(2), x.MkAdd(checkH1_0_2, checkH1_1_2, checkH1_2_2, checkH1_3_2)));
- solver.Assert(x.MkEq(x.MkInt(1), x.MkAdd(checkF4_0_2, checkF4_1_2, checkF4_2_2, checkF4_3_2)));
- // Every piece must be working!
- solver.Assert(x.MkGe(x.MkAdd(checkA1_0_2, checkH1_0_2, checkF4_0_2), x.MkInt(1)));
- solver.Assert(x.MkGe(x.MkAdd(checkA1_1_2, checkH1_1_2, checkF4_1_2), x.MkInt(1)));
- solver.Assert(x.MkGe(x.MkAdd(checkA1_2_2, checkH1_2_2, checkF4_2_2), x.MkInt(1)));
- solver.Assert(x.MkGe(x.MkAdd(checkA1_3_2, checkH1_3_2, checkF4_3_2), x.MkInt(1)));
- //}
- // check if they comply
- status = solver.Check();
- if (status == Status.SATISFIABLE)
- {
- // if it complies, return
- return status;
- }
- // if they do not, push invalid condition, and continue
- // pop out the tiny test
- solver.Pop();
- solver.Assert(x.MkAnd(
- x.MkNot(x.MkEq(p0, x.MkBV(queen, 64))),
- x.MkNot(x.MkEq(p1, x.MkBV(rook, 64))),
- x.MkNot(x.MkEq(p2, x.MkBV(bishop, 64))),
- x.MkNot(x.MkEq(p3, x.MkBV(knight, 64)))));
- }
- return Status.UNKNOWN;
- }
- private void EightQueensProblem(Sort bitboardSort, Context x, Solver solver, FuncDecl f, FuncDecl pieceRook, FuncDecl pieceQueen, FuncDecl pieceBishop)
- {
- var p0 = x.MkConst("piece0", bitboardSort);
- var p1 = x.MkConst("piece1", bitboardSort);
- var p2 = x.MkConst("piece2", bitboardSort);
- var p3 = x.MkConst("piece3", bitboardSort);
- var p4 = x.MkConst("piece4", bitboardSort);
- var p5 = x.MkConst("piece5", bitboardSort);
- var p6 = x.MkConst("piece6", bitboardSort);
- var p7 = x.MkConst("piece7", bitboardSort);
- // pieces cant overlap
- solver.Assert(x.MkDistinct(p0, p1, p2, p3, p4, p5, p6, p7));
- // pieces must not be 0
- solver.Assert(x.MkNot(x.MkEq(x.MkBV(0, 64), p0)));
- solver.Assert(x.MkNot(x.MkEq(x.MkBV(0, 64), p1)));
- solver.Assert(x.MkNot(x.MkEq(x.MkBV(0, 64), p2)));
- solver.Assert(x.MkNot(x.MkEq(x.MkBV(0, 64), p3)));
- solver.Assert(x.MkNot(x.MkEq(x.MkBV(0, 64), p4)));
- solver.Assert(x.MkNot(x.MkEq(x.MkBV(0, 64), p5)));
- solver.Assert(x.MkNot(x.MkEq(x.MkBV(0, 64), p6)));
- solver.Assert(x.MkNot(x.MkEq(x.MkBV(0, 64), p7)));
- // the set of attacked squares by an arbitrary piece must not equal 0
- solver.Assert(x.MkNot(x.MkEq(x.MkBV(0, 64), x.MkApp(f, pieceQueen.Apply(), p0))));
- solver.Assert(x.MkNot(x.MkEq(x.MkBV(0, 64), x.MkApp(f, pieceQueen.Apply(), p1))));
- solver.Assert(x.MkNot(x.MkEq(x.MkBV(0, 64), x.MkApp(f, pieceQueen.Apply(), p2))));
- solver.Assert(x.MkNot(x.MkEq(x.MkBV(0, 64), x.MkApp(f, pieceQueen.Apply(), p3))));
- solver.Assert(x.MkNot(x.MkEq(x.MkBV(0, 64), x.MkApp(f, pieceQueen.Apply(), p4))));
- solver.Assert(x.MkNot(x.MkEq(x.MkBV(0, 64), x.MkApp(f, pieceQueen.Apply(), p5))));
- solver.Assert(x.MkNot(x.MkEq(x.MkBV(0, 64), x.MkApp(f, pieceQueen.Apply(), p6))));
- solver.Assert(x.MkNot(x.MkEq(x.MkBV(0, 64), x.MkApp(f, pieceQueen.Apply(), p7))));
- // the piece bitboard must have one and only one bit set
- solver.Assert(x.MkEq(x.MkBV(0, 64), x.MkBVAND((Microsoft.Z3.BitVecExpr)p0, x.MkBVSub((Microsoft.Z3.BitVecExpr)p0, x.MkBV(1, 64)))));
- solver.Assert(x.MkEq(x.MkBV(0, 64), x.MkBVAND((Microsoft.Z3.BitVecExpr)p1, x.MkBVSub((Microsoft.Z3.BitVecExpr)p1, x.MkBV(1, 64)))));
- solver.Assert(x.MkEq(x.MkBV(0, 64), x.MkBVAND((Microsoft.Z3.BitVecExpr)p2, x.MkBVSub((Microsoft.Z3.BitVecExpr)p2, x.MkBV(1, 64)))));
- solver.Assert(x.MkEq(x.MkBV(0, 64), x.MkBVAND((Microsoft.Z3.BitVecExpr)p3, x.MkBVSub((Microsoft.Z3.BitVecExpr)p3, x.MkBV(1, 64)))));
- solver.Assert(x.MkEq(x.MkBV(0, 64), x.MkBVAND((Microsoft.Z3.BitVecExpr)p4, x.MkBVSub((Microsoft.Z3.BitVecExpr)p4, x.MkBV(1, 64)))));
- solver.Assert(x.MkEq(x.MkBV(0, 64), x.MkBVAND((Microsoft.Z3.BitVecExpr)p5, x.MkBVSub((Microsoft.Z3.BitVecExpr)p5, x.MkBV(1, 64)))));
- solver.Assert(x.MkEq(x.MkBV(0, 64), x.MkBVAND((Microsoft.Z3.BitVecExpr)p6, x.MkBVSub((Microsoft.Z3.BitVecExpr)p6, x.MkBV(1, 64)))));
- solver.Assert(x.MkEq(x.MkBV(0, 64), x.MkBVAND((Microsoft.Z3.BitVecExpr)p7, x.MkBVSub((Microsoft.Z3.BitVecExpr)p7, x.MkBV(1, 64)))));
- Microsoft.Z3.Expr expr;
- Microsoft.Z3.Expr expr1;
- {
- expr = x.MkBVOR(
- (Microsoft.Z3.BitVecExpr)p0,
- (Microsoft.Z3.BitVecExpr)p1);
- expr = x.MkBVOR(
- (Microsoft.Z3.BitVecExpr)expr,
- (Microsoft.Z3.BitVecExpr)p2);
- expr = x.MkBVOR(
- (Microsoft.Z3.BitVecExpr)expr,
- (Microsoft.Z3.BitVecExpr)p3);
- expr = x.MkBVOR(
- (Microsoft.Z3.BitVecExpr)expr,
- (Microsoft.Z3.BitVecExpr)p4);
- expr = x.MkBVOR(
- (Microsoft.Z3.BitVecExpr)expr,
- (Microsoft.Z3.BitVecExpr)p5);
- expr = x.MkBVOR(
- (Microsoft.Z3.BitVecExpr)expr,
- (Microsoft.Z3.BitVecExpr)p6);
- expr = x.MkBVOR(
- (Microsoft.Z3.BitVecExpr)expr,
- (Microsoft.Z3.BitVecExpr)p7);
- }
- {
- expr1 = x.MkBVOR(
- (Microsoft.Z3.BitVecExpr)x.MkApp(f, pieceQueen.Apply(), p0),
- (Microsoft.Z3.BitVecExpr)x.MkApp(f, pieceQueen.Apply(), p1));
- expr1 = x.MkBVOR(
- (Microsoft.Z3.BitVecExpr)expr1,
- (Microsoft.Z3.BitVecExpr)x.MkApp(f, pieceQueen.Apply(), p2));
- expr1 = x.MkBVOR(
- (Microsoft.Z3.BitVecExpr)expr1,
- (Microsoft.Z3.BitVecExpr)x.MkApp(f, pieceQueen.Apply(), p3));
- expr1 = x.MkBVOR(
- (Microsoft.Z3.BitVecExpr)expr1,
- (Microsoft.Z3.BitVecExpr)x.MkApp(f, pieceQueen.Apply(), p4));
- expr1 = x.MkBVOR(
- (Microsoft.Z3.BitVecExpr)expr1,
- (Microsoft.Z3.BitVecExpr)x.MkApp(f, pieceQueen.Apply(), p5));
- expr1 = x.MkBVOR(
- (Microsoft.Z3.BitVecExpr)expr1,
- (Microsoft.Z3.BitVecExpr)x.MkApp(f, pieceQueen.Apply(), p6));
- expr1 = x.MkBVOR(
- (Microsoft.Z3.BitVecExpr)expr1,
- (Microsoft.Z3.BitVecExpr)x.MkApp(f, pieceQueen.Apply(), p7));
- }
- // pieces dont attack one another
- solver.Assert(x.MkEq(x.MkBV(0, 64), x.MkBVAND((Microsoft.Z3.BitVecExpr)expr, (Microsoft.Z3.BitVecExpr)expr1)));
- }
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement