ืคืึธืจืžืึทืœ ื•ื•ืขืจืึทืคืึทืงื™ื™ืฉืึทืŸ ื ื™ืฆืŸ ื“ืขื ื‘ื™ื™ึทืฉืคึผื™ืœ ืคื•ืŸ ื“ื™ ื•ื•ืึธืœืฃ, ืฆื™ื’ ืื•ืŸ ืงืจื•ื™ื˜ ืคึผืจืึธื‘ืœืขื

ืื™ืŸ ืžื™ื™ืŸ ืžื™ื™ื ื•ื ื’, ืื™ืŸ ื“ื™ ืจื•ืกื™ืฉ-ืฉืคึผืจืึทืš ืกืขืงื˜ืึธืจ ืคื•ืŸ ื“ืขืจ ืื™ื ื˜ืขืจื ืขืฅ, ื“ื™ ื˜ืขืžืข ืคื•ืŸ โ€‹โ€‹ืคืึธืจืžืึทืœ ื•ื•ืขืจืึทืคืึทืงื™ื™ืฉืึทืŸ ืื™ื– ื ื™ืฉื˜ ื’ืขื ื•ื’ ื‘ืื“ืขืงื˜, ืื•ืŸ ืขืก ืื™ื– ืกืคึผืขืฆื™ืขืœ ืึท ืคืขืœืŸ ืคื•ืŸ ืคึผืฉื•ื˜ ืื•ืŸ ืงืœืึธืจ ื‘ื™ื™ืฉืคื™ืœืŸ.

ืื™ืš ื•ื•ืขืœ ื’ืขื‘ืŸ ืึท ื‘ื™ื™ืฉืคึผื™ืœ ืคื•ืŸ ืึท ืคืจืขืžื“ืŸ ืžืงื•ืจ, ืื•ืŸ ืฆื•ื’ืขื‘ืŸ ืžื™ื™ืŸ ืื™ื™ื’ืขื ืข ืœื™ื™ื–ื•ื ื’ ืฆื• ื“ืขืจ ื‘ืืงืื ื˜ืขืจ ืคึผืจืึธื‘ืœืขื ืคื•ืŸ ืึทืจื™ื‘ืขืจื’ื™ื™ืŸ ืึท ื•ื•ืึธืœืฃ, ืึท ืฆื™ื’ ืื•ืŸ ืึท ืงืจื•ื™ื˜ ืื•ื™ืฃ ื“ืขืจ ืึทื ื“ืขืจืขืจ ื–ื™ื™ื˜ ื˜ื™ื™ืš.

ืื‘ืขืจ ืขืจืฉื˜ืขืจ, ืื™ืš ื•ื•ืขืœ ื‘ืขืงื™ืฆืขืจ ื‘ืึทืฉืจื™ื™ึทื‘ืŸ ื•ื•ืึธืก ืคืึธืจืžืึทืœ ื•ื•ืขืจืึทืคืึทืงื™ื™ืฉืึทืŸ ืื™ื– ืื•ืŸ ื•ื•ืึธืก ืขืก ืื™ื– ื“ืืจืฃ.

ืคืึธืจืžืึทืœ ื•ื•ืขืจืึทืคืึทืงื™ื™ืฉืึทืŸ ื™ื•ื–ืฉืึทื•ื•ืึทืœื™ ืžื™ื˜ืœ ืงืึธื ื˜ืจืึธืœื™ืจื•ื ื’ ืื™ื™ืŸ ืคึผืจืึธื’ืจืึทื ืึธื“ืขืจ ืึทืœื’ืขืจื™ื“ืึทื ื ื™ืฆืŸ ืื ื“ืขืจืŸ.

ื“ืึธืก ืื™ื– ื ื™ื™ื˜ื™ืง ืฆื• ืขื ืฉื•ืจ ืึทื– ื“ื™ ืคึผืจืึธื’ืจืึทื ื‘ื™ื›ื™ื™ื•ื•ื– ื•ื•ื™ ื“ืขืจื•ื•ืึทืจื˜ ืื•ืŸ ืื•ื™ืš ืฆื• ืขื ืฉื•ืจ ื–ื™ื™ึทืŸ ื–ื™ื›ืขืจื”ื™ื™ื˜.

ืคืึธืจืžืึทืœ ื•ื•ืขืจืึทืคืึทืงื™ื™ืฉืึทืŸ ืื™ื– ื“ื™ ืžืขืจืกื˜ ืฉื˜ืึทืจืง ืžื™ื˜ืœ ืฆื• ื’ืขืคึฟื™ื ืขืŸ ืื•ืŸ ืขืœื™ืžื™ื ื™ืจืŸ ื•ื•ืึทืœื ืขืจืึทื‘ื™ืœื™ื˜ื™ื–: ืขืก ืึทืœืึทื•ื– ืื™ืจ ืฆื• ื’ืขืคึฟื™ื ืขืŸ ืึทืœืข ื™ื’ื–ื™ืกื˜ื™ื ื’ ื”ืึธืœืขืก ืื•ืŸ ื‘ืึทื’ื– ืื™ืŸ ืึท ืคึผืจืึธื’ืจืึทื, ืึธื“ืขืจ ื‘ืึทื•ื•ื™ื™ึทื–ืŸ ืึทื– ื–ื™ื™ ื˜ืึธืŸ ื ื™ื˜ ืขืงืกื™ืกื˜ื™ืจืŸ.
ืขืก ืื™ื– ื›ื“ืื™ ืฆื• ื‘ืืžืขืจืงืŸ ืึทื– ืื™ืŸ ืขื˜ืœืขื›ืข ืงืึทืกืขืก ื“ืึธืก ืื™ื– ืื•ืžืžืขื’ืœืขืš, ืึทื–ืึท ื•ื•ื™ ืื™ืŸ ื“ื™ ืคึผืจืึธื‘ืœืขื ืคื•ืŸ 8 ืงื•ื•ื™ื ืก ืžื™ื˜ ืึท ื‘ืจืขื˜ ื‘ืจื™ื™ื˜ ืคื•ืŸ 1000 ืกืงื•ื•ืขืจื–: ืขืก ืึทืœืข ืงื•ืžื˜ ืึทืจืึธืคึผ ืฆื• ืึทืœื’ืขืจื™ื“ืึทื ืงืึทืžืคึผืœืขืงืกื™ื˜ื™ ืึธื“ืขืจ ืกื˜ืึธืคึผืคึผื™ื ื’ ืคึผืจืึธื‘ืœืขื.

ืึธื‘ืขืจ, ืื™ืŸ ืงื™ื™ืŸ ืคืึทืœ, ืื™ื™ื ืขืจ ืคื•ืŸ ื“ืจื™ื™ึท ืขื ื˜ืคึฟืขืจืก ื•ื•ืขื˜ ื–ื™ื™ืŸ ื‘ืืงื•ืžืขืŸ: ื“ื™ ืคึผืจืึธื’ืจืึทื ืื™ื– ืจื™ื›ื˜ื™ืง, ืคืึทืœืฉ, ืึธื“ืขืจ ืขืก ืื™ื– ื ื™ื˜ ืžืขื’ืœืขืš ืฆื• ืจืขื›ืขื ืขืŸ ื“ื™ ืขื ื˜ืคืขืจ.

ืื•ื™ื‘ ืขืก ืื™ื– ืื•ืžืžืขื’ืœืขืš ืฆื• ื’ืขืคึฟื™ื ืขืŸ ืึทืŸ ืขื ื˜ืคืขืจ, ืขืก ืื™ื– ืึธืคื˜ ืžืขื’ืœืขืš ืฆื• ืจื™ื•ื•ืขืจืง ื•ืžืงืœืึธืจ ืคึผืึทืจืฅ ืคื•ืŸ ื“ื™ ืคึผืจืึธื’ืจืึทื, ืจื™ื“ื•ืกื™ื ื’ ื–ื™ื™ืขืจ ืึทืœื’ืขืจื™ื“ืึทืžื™ืง ืงืึทืžืคึผืœืขืงืกื™ื˜ื™, ืฆื• ื‘ืึทืงื•ืžืขืŸ ืึท ืกืคึผืขืฆื™ืคื™ืฉ ื™ืึธ ืึธื“ืขืจ ืงื™ื™ืŸ ืขื ื˜ืคืขืจ.

ืื•ืŸ ืคืึธืจืžืึทืœ ื•ื•ืขืจืึทืคืึทืงื™ื™ืฉืึทืŸ ืื™ื– ื’ืขื ื™ืฆื˜, ืœืžืฉืœ, ืื™ืŸ ื“ื™ Windows ืงืขืจืŸ ืื•ืŸ ื“ืึทืจืคึผืึท ื“ืจืึธื•ืŸ ืึธืคึผืขืจื™ื™ื˜ื™ื ื’ ืกื™ืกื˜ืขืžืขืŸ, ืฆื• ืขื ืฉื•ืจ ื“ื™ ืžืึทืงืกื™ืžื•ื ืฉื•ืฅ ืžื“ืจื’ื”.

ืžื™ืจ ื•ื•ืขืœืŸ ื ื•ืฆืŸ Z3Prover, ืึท ื–ื™ื™ืขืจ ืฉื˜ืึทืจืง ื’ืขืฆื™ื™ึทื’ ืคึฟืึทืจ ืึธื˜ืึทืžื™ื™ื˜ื™ื“ ื˜ืขืึธืจืขื ืคึผืจืึธื•ื•ืขืŸ ืื•ืŸ ื™ืงื•ื•ื™ื™ื–ืฉืึทืŸ ืกืึทืœื•ื•ื™ื ื’.

ื“ืขืจืฆื•, Z3 ืกืึทืœื•ื•ื– ื™ืงื•ื•ื™ื™ื–ืฉืึทื ื– ืื•ืŸ ืกืึทืœืขืงืฅ ื ื™ืฉื˜ ื–ื™ื™ืขืจ ื•ื•ืึทืœื•ืขืก ืžื™ื˜ ื‘ืจื•ื˜ ืงืจืึทืคื˜.
ื“ืขื ืžื™ื˜ืœ ืึทื– ืขืก ืื™ื– ื‘ื™ื›ื•ืœืช ืฆื• ื’ืขืคึฟื™ื ืขืŸ ื“ื™ ืขื ื˜ืคืขืจ, ืืคื™ืœื• ืื™ืŸ ืงืึทืกืขืก ื•ื•ื• ืขืก ื–ืขื ืขืŸ 10 ^ 100 ืงืึทืžื‘ืึทื ื™ื™ืฉืึทื ื– ืคื•ืŸ ืึทืจื™ื™ึทื ืฉืจื™ื™ึทื‘ ืึธืคึผืฆื™ืขืก.

ืึธื‘ืขืจ ื“ืึธืก ืื™ื– ื‘ืœื•ื™ื– ื•ื•ืขื’ืŸ ืึท ื˜ื•ืฅ ืึทืจื™ื™ึทื ืฉืจื™ื™ึทื‘ ืึทืจื’ื•ืžืขื ื˜ืŸ ืคื•ืŸ ื˜ื™ืคึผ ื™ื ื˜ืขื’ืขืจ, ืื•ืŸ ื“ืึธืก ืื™ื– ืึธืคื˜ ื’ืขืคึผืœืึธื ื˜ืขืจื˜ ืื™ืŸ ืคื™ืจ.

ืคึผืจืึธื‘ืœืขื ื•ื•ืขื’ืŸ 8 ืงื•ื•ื™ื ืก (ื’ืขื ื•ืžืขืŸ ืคื•ืŸ ืขื ื’ืœื™ืฉ ืžืึทื ื•ืึทืœ).

ืคืึธืจืžืึทืœ ื•ื•ืขืจืึทืคืึทืงื™ื™ืฉืึทืŸ ื ื™ืฆืŸ ื“ืขื ื‘ื™ื™ึทืฉืคึผื™ืœ ืคื•ืŸ ื“ื™ ื•ื•ืึธืœืฃ, ืฆื™ื’ ืื•ืŸ ืงืจื•ื™ื˜ ืคึผืจืึธื‘ืœืขื

# We know each queen must be in a different row.
# So, we represent each queen by a single integer: the column position
Q = [ Int('Q_%i' % (i + 1)) for i in range(8) ]

# Each queen is in a column {1, ... 8 }
val_c = [ And(1 <= Q[i], Q[i] <= 8) for i in range(8) ]

# At most one queen per column
col_c = [ Distinct(Q) ]

# Diagonal constraint
diag_c = [ If(i == j,
              True,
              And(Q[i] - Q[j] != i - j, Q[i] - Q[j] != j - i))
           for i in range(8) for j in range(i) ]

solve(val_c + col_c + diag_c)

ืžื™ื˜ Z3, ืžื™ืจ ื‘ืึทืงื•ืžืขืŸ ื“ื™ ืœื™ื™ื–ื•ื ื’:

[Q_5 = 1,
 Q_8 = 7,
 Q_3 = 8,
 Q_2 = 2,
 Q_6 = 3,
 Q_4 = 6,
 Q_7 = 5,
 Q_1 = 4]

ื“ื™ ืžืœื›ึผื” ืคึผืจืึธื‘ืœืขื ืื™ื– ืคืึทืจื’ืœื™ื™ึทื›ืœืขืš ืฆื• ืึท ืคึผืจืึธื’ืจืึทื ื•ื•ืึธืก ื ืขืžื˜ ื•ื•ื™ ืึทืจื™ื™ึทื ืฉืจื™ื™ึทื‘ ื“ื™ ืงืึธื•ืึธืจื“ืึทื ืึทืฅ ืคื•ืŸ 8 ืงื•ื•ื™ื ืก ืื•ืŸ ืึทื•ื˜ืคึผื•ืฅ ื“ื™ ืขื ื˜ืคืขืจ ืฆื™ ื“ื™ ืงื•ื•ื™ื ืก ืฉืœืึธื’ืŸ ื™ืขื“ืขืจ ืื ื“ืขืจืขืจ.

ืื•ื™ื‘ ืžื™ืจ ื•ื•ืึธืœื˜ ืกืึธืœื•ื•ืข ืึทื–ืึท ืึท ืคึผืจืึธื’ืจืึทื ื ื™ืฆืŸ ืคืึธืจืžืึทืœ ื•ื•ืขืจืึทืคืึทืงื™ื™ืฉืึทืŸ, ืงืึทืžืคึผืขืจื“ ืžื™ื˜ ื“ืขื ืคึผืจืึธื‘ืœืขื, ืžื™ืจ ื•ื•ืึธืœื˜ ื ืึธืจ ื“ืึทืจืคึฟืŸ ืฆื• ื ืขืžืขืŸ ื ืึธืš ืื™ื™ืŸ ืฉืจื™ื˜ ืื™ืŸ ื“ื™ ืคืึธืจืขื ืคื•ืŸ ืงืึทื ื•ื•ืขืจื˜ื™ื ื’ ื“ื™ ืคึผืจืึธื’ืจืึทื ืงืึธื“ ืื™ืŸ ืึทืŸ ื™ืงื•ื•ื™ื™ื–ืฉืึทืŸ: ืขืก ื•ื•ืึธืœื˜ ื–ื™ื™ืŸ ื™ืกืขื ืฉืึทืœื™ ื™ื™ื“ืขื ื™ืงืึทืœ ืฆื• ืื•ื ื“ื–ืขืจ ( ืคื•ืŸ ืงื•ืจืก, ืื•ื™ื‘ ื“ื™ ืคึผืจืึธื’ืจืึทื ืื™ื– ื’ืขืฉืจื™ื‘ืŸ ืจื™ื›ื˜ื™ืง).

ื›ึผืžืขื˜ ื“ื™ ื–ืขืœื‘ืข ื–ืึทืš ื•ื•ืขื˜ ืคึผืึทืกื™ืจืŸ ืื™ืŸ ื“ืขื ืคืึทืœ ืคื•ืŸ ื–ื•ื›ืŸ ืคึฟืึทืจ ื•ื•ืึทืœื ืขืจืึทื‘ื™ืœื™ื˜ื™ื–: ืžื™ืจ ื ืึธืจ ืฉื˜ืขืœืŸ ื“ื™ ืจืขื–ื•ืœื˜ืึทื˜ ื˜ื ืึธื™ื ื•ื•ืึธืก ืžื™ืจ ื“ืึทืจืคึฟืŸ, ืœืžืฉืœ, ื“ื™ ืึทื“ืžื™ื ื™ืกื˜ืจืึทื˜ืึธืจ ืคึผืึทืจืึธืœ, ื™ื‘ืขืจืžืึทื›ืŸ ื“ื™ ืžืงื•ืจ ืึธื“ืขืจ ื“ื™ืงืึทืžืคึผื™ื™ืœื“ ืงืึธื“ ืื™ืŸ ื™ืงื•ื•ื™ื™ื–ืฉืึทื ื– ืงืึทืžืคึผืึทื˜ืึทื‘ืึทืœ ืžื™ื˜ ื•ื•ืขืจืึทืคืึทืงื™ื™ืฉืึทืŸ, ืื•ืŸ ื“ืขืจื ืึธืš ื‘ืึทืงื•ืžืขืŸ ืึทืŸ ืขื ื˜ืคืขืจ ืฆื• ื•ื•ืึธืก. ื“ืึทื˜ืŸ ื“ืึทืจืฃ ื–ื™ื™ืŸ ืกืึทืคึผืœื™ื™ื“ ื•ื•ื™ ืึทืจื™ื™ึทื ืฉืจื™ื™ึทื‘ ืฆื• ื“ืขืจื’ืจื™ื™ื›ืŸ ื“ืขื ืฆื™ืœ.

ืื™ืŸ ืžื™ื™ืŸ ืžื™ื™ื ื•ื ื’, ื“ื™ ืคึผืจืึธื‘ืœืขื ื•ื•ืขื’ืŸ ื“ื™ ื•ื•ืึธืœืฃ, ื“ื™ ืฆื™ื’ ืื•ืŸ ื“ื™ ืงืจื•ื™ื˜ ืื™ื– ืืคื™ืœื• ืžืขืจ ื˜ืฉื™ืงืึทื•ื•ืข, ื•ื•ื™ื™ึทืœ ืกืึทืœื•ื•ื™ื ื’ ืขืก ืฉื•ื™ืŸ ืจื™ืงื•ื•ื™ื™ืขืจื– ืคื™ืœืข (7) ื˜ืจื™ื˜.

ืื•ื™ื‘ ื“ื™ ืžืœื›ึผื” ืคึผืจืึธื‘ืœืขื ืื™ื– ืคืึทืจื’ืœื™ื™ึทื›ืœืขืš ืฆื• ื“ืขื ืคืึทืœ ื•ื•ืขืŸ ืื™ืจ ืงืขื ืขืŸ ื“ื•ืจื›ื ืขืžืขืŸ ืึท ืกืขืจื•ื•ืขืจ ืžื™ื˜ ืึท ืื™ื™ืŸ GET ืึธื“ืขืจ POST ื‘ืขื˜ืŸ, ื“ืขืจ ื•ื•ืึธืœืฃ, ืฆื™ื’ ืื•ืŸ ืงืจื•ื™ื˜ ื“ืขืžืึทื ืกื˜ืจื™ื™ืฅ ืึท ื‘ื™ื™ืฉืคึผื™ืœ ืคื•ืŸ ืึท ืคื™ืœ ืžืขืจ ืงืึธืžืคึผืœื™ืฆื™ืจื˜ ืื•ืŸ ื•ื•ื™ื™ื“ืกืคึผืจืขื“ ืงืึทื˜ืขื’ืึธืจื™ืข, ืื™ืŸ ื•ื•ืึธืก ื“ืขืจ ืฆื™ืœ ืงืขื ืขืŸ ื–ื™ื™ืŸ ืึทื˜ืฉื™ื•ื•ื“ ื‘ืœื•ื™ื– ื“ื•ืจืš ืขื˜ืœืขื›ืข ืจื™ืงื•ื•ืขืก.

ื“ืึธืก ืื™ื– ืคืึทืจื’ืœื™ื™ึทื›ืœืขืš, ืœืžืฉืœ, ืฆื• ืึท ืกืฆืขื ืึทืจ ื•ื•ื• ืื™ืจ ื“ืึทืจืคึฟืŸ ืฆื• ื’ืขืคึฟื™ื ืขืŸ ืึท ืกืงืœ ื™ื ื“ื–ืฉืขืงืฉืึทืŸ, ืฉืจื™ื™ึทื‘ืŸ ืึท ื˜ืขืงืข ื“ื•ืจืš ืขืก, ืื•ืŸ ื•ืคื”ื™ื™ื‘ืŸ ื“ื™ื™ืŸ ืจืขื›ื˜ ืื•ืŸ ื‘ืœื•ื™ื– ื“ืขืžืึธืœื˜ ื‘ืึทืงื•ืžืขืŸ ืึท ืคึผืึทืจืึธืœ.

ืงืึธื ื“ื™ื˜ื™ืึธื ืก ืคื•ืŸ ื“ื™ ืคึผืจืึธื‘ืœืขื ืื•ืŸ ื–ื™ื™ึทืŸ ืœื™ื™ื–ื•ื ื’ื“ืขืจ ืคึผื•ื™ืขืจ ื“ืึทืจืฃ ืึทืจื™ื‘ืขืจืคื™ืจืŸ ืึท ื•ื•ืึธืœืฃ, ืึท ืฆื™ื’ ืื•ืŸ ืงืจื•ื™ื˜ ืึทืจื™ื‘ืขืจ ื“ื™ ื˜ื™ื™ึทืš. ื“ืขืจ ืคึผื•ื™ืขืจ ื”ืึธื˜ ืึท ืฉื™ืคืœ, ื•ื•ืึธืก ืงืขืŸ ื ืึธืจ ืึทืงืึทืžืึทื“ื™ื™ื˜ ืื™ื™ืŸ ื›ื™ื™ืคืขืฅ, ืึทื—ื•ืฅ ื“ืขื ืคึผื•ื™ืขืจ ื–ื™ืš. ื“ืขืจ ื•ื•ืืœืฃ ื•ื•ืขื˜ ืขืกืŸ ื“ื™ ืฆื™ื’ ืื•ืŸ ื“ื™ ืฆื™ื’ ื•ื•ืขื˜ ืขืกืŸ ื“ื™ ืงืจื•ื™ื˜ ืื•ื™ื‘ ื“ืขืจ ืคึผื•ื™ืขืจ ืœืึธื–ื˜ ื–ื™ื™ ืึธืŸ ืื›ื˜ื•ื ื’.

ื“ื™ ืœื™ื™ื–ื•ื ื’ ืื™ื– ืึทื– ืื™ืŸ ืฉืจื™ื˜ 4 ื“ืขืจ ืคึผื•ื™ืขืจ ื•ื•ืขื˜ ื“ืึทืจืคึฟืŸ ืฆื• ื ืขืžืขืŸ ื“ื™ ืฆื™ื’ ืฆื•ืจื™ืง.
ืื™ืฆื˜ ืœืึธื–ืŸ ืก ืึธื ื”ื™ื™ื‘ืŸ ืกืึธืœื•ื•ืข ืขืก ืคึผืจืึธื’ืจืึทืžืžืึทื˜ื™ืงืึทืœืœื™.

ืœืึธืžื™ืจ ื‘ืึทืฆื™ื™ื›ืขื ืขืŸ ื“ืขื ืคึผื•ื™ืขืจ, ื•ื•ืึธืœืฃ, ืฆื™ื’ ืื•ืŸ ืงืจื•ื™ื˜ ื•ื•ื™ 4 ื•ื•ืขืจื™ืึทื‘ืึทืœื– ื•ื•ืึธืก ื ืขืžืขืŸ ื“ื™ ื•ื•ืขืจื˜ ื‘ืœื•ื™ื– 0 ืึธื“ืขืจ 1. ื ื•ืœ ืžื™ื˜ืœ ืึทื– ื–ื™ื™ ื–ืขื ืขืŸ ืื•ื™ืฃ ื“ื™ ืœื™ื ืงืก ื‘ืจืขื’, ืื•ืŸ ืื™ื™ื ืขืจ ืžื™ื˜ืœ ืึทื– ื–ื™ื™ ื–ืขื ืขืŸ ืื•ื™ืฃ ื“ื™ ืจืขื›ื˜.

import json
from z3 import *
s = Solver()
Num= 8

Human = [ Int('Human_%i' % (i + 1)) for i in range(Num) ]
Wolf = [ Int('Wolf_%i' % (i + 1)) for i in range(Num) ]
Goat = [ Int('Goat_%i' % (i + 1)) for i in range(Num) ]
Cabbage = [ Int('Cabbage_%i' % (i + 1)) for i in range(Num) ]

# Each creature can be only on left (0) or right side (1) on every state
HumanSide = [ Or(Human[i] == 0, Human[i] == 1) for i in range(Num) ]
WolfSide = [ Or(Wolf[i] == 0, Wolf[i] == 1) for i in range(Num) ]
GoatSide = [ Or(Goat[i] == 0, Goat[i] == 1) for i in range(Num) ]
CabbageSide = [ Or(Cabbage[i] == 0, Cabbage[i] == 1) for i in range(Num) ]
Side = HumanSide+WolfSide+GoatSide+CabbageSide

ื ื•ืžืขืจ ืื™ื– ื“ื™ ื ื•ืžืขืจ ืคื•ืŸ ืกื˜ืขืคึผืก ืคืืจืœืื ื’ื˜ ืฆื• ืกืึธืœื•ื•ืข. ื™ืขื“ืขืจ ืฉืจื™ื˜ ืจืขืคึผืจืึทื–ืขื ืฅ ื“ื™ ืฉื˜ืึทื˜ ืคื•ืŸ ื“ื™ ื˜ื™ื™ึทืš, ื“ื™ ืฉื™ืคืœ ืื•ืŸ ืึทืœืข ืขื ื˜ื™ื˜ื™ื–.

ืื™ืฆื˜, ืœืึธื–ืŸ ืก ืงืœื™ื™ึทื‘ืŸ ืขืก ืจืึทื ื“ืึธื ืื•ืŸ ืžื™ื˜ ืึท ื’ืจืขื ืขืฅ, ื ืขืžืขืŸ 10.

ื™ืขื“ืขืจ ืขื ื˜ื™ื˜ื™ ืื™ื– ืจืขืคึผืจื™ื–ืขื ื˜ื™ื“ ืื™ืŸ 10 ืขืงื–ืขืžืคืœืืจืŸ - ื“ืึธืก ืื™ื– ื–ื™ื™ึทืŸ ื•ื•ืขืจื˜ ืื™ืŸ ื™ืขื“ืขืจ ืคื•ืŸ ื“ื™ 10 ืกื˜ืขืคึผืก.

ืื™ืฆื˜ ืœืึธื–ืŸ ืก ืฉื˜ืขืœืŸ ื“ื™ ื‘ืื“ื™ื ื’ื•ื ื’ืขืŸ ืคึฟืึทืจ ื“ื™ ืึธื ื”ื™ื™ื‘ ืื•ืŸ ืขื ื“ื™ืงืŸ.

Start = [ Human[0] == 0, Wolf[0] == 0, Goat[0] == 0, Cabbage[0] == 0 ]
Finish = [ Human[9] == 1, Wolf[9] == 1, Goat[9] == 1, Cabbage[9] == 1 ]

ื“ืขืจื ืึธืš ืžื™ืจ ืฉื˜ืขืœืŸ ื“ื™ ื‘ืื“ื™ื ื’ื•ื ื’ืขืŸ ื•ื•ื• ื“ืขืจ ื•ื•ืึธืœืฃ ืขืกื˜ ื“ื™ ืฆื™ื’, ืึธื“ืขืจ ื“ื™ ืฆื™ื’ ืขืกื˜ ื“ื™ ืงืจื•ื™ื˜, ื•ื•ื™ ืงืึทื ืกื˜ืจื™ื™ื ืฅ ืื™ืŸ ื“ื™ ื™ืงื•ื•ื™ื™ื–ืฉืึทืŸ.
(ืื™ืŸ ื“ืขื ื‘ื™ื™ึทื–ื™ื™ึทืŸ ืคื•ืŸ ืึท ืคึผื•ื™ืขืจ, ืึธื ืคืึทืœ ืื™ื– ืื•ืžืžืขื’ืœืขืš)

# Wolf cant stand with goat, and goat with cabbage without human. Not 2, not 0 which means that they are one the same side
Safe = [ And( Or(Wolf[i] != Goat[i], Wolf[i] == Human[i]), Or(Goat[i] != Cabbage[i], Goat[i] == Human[i])) for i in range(Num) ]

ืื•ืŸ ืฆื•ื ืกื•ืฃ, ืžื™ืจ ื•ื•ืขืœืŸ ื“ืขืคื™ื ื™ืจืŸ ืึทืœืข ืžืขื’ืœืขืš ืึทืงืฉืึทื ื– ืคื•ืŸ ื“ื™ ืคึผื•ื™ืขืจ ื•ื•ืขืŸ ืึทืจื™ื‘ืขืจ ืึทื”ื™ืŸ ืึธื“ืขืจ ืฆื•ืจื™ืง.
ืขืจ ืงืึธืŸ ืึธื“ืขืจ ื ืขืžืขืŸ ืžื™ื˜ ื–ื™ืš ืึท ืฐืึธืœืฃ, ืึท ืฆื™ื’ ืึธื“ืขืจ ืึท ืงืจื•ื™ื˜, ืึธื“ืขืจ ืงืฒื ืขื ื ื™ืฉื˜ ื ืขืžืขืŸ, ืึธื“ืขืจ ื’ืึธืจ ื ื™ืฉื˜ ืคึฟืึธืจืŸ ืขืจื’ืขืฅ.

ืคึฟืึทืจืฉื˜ื™ื™ื˜ ื–ื™ืš, ืึทื– ืึธืŸ ืึท ืคึผื•ื™ืขืจ ืงืึธืŸ ืงื™ื™ื ืขืจ ื ื™ืฉื˜ ืึทืจื™ื‘ืขืจื’ื™ื™ืŸ.

ื“ืึธืก ื•ื•ืขื˜ ื–ื™ื™ืŸ ืื•ื™ืกื’ืขื“ืจื™ืงื˜ ื“ื•ืจืš ื“ื™ ืคืึทืงื˜ ืึทื– ื™ืขื“ืขืจ ืกืึทื‘ืกืึทืงื•ื•ืึทื ื˜ ืฉื˜ืึทื˜ ืคื•ืŸ ื“ื™ ื˜ื™ื™ึทืš, ืฉื™ืคืœ ืื•ืŸ ืขื ื˜ื™ื˜ื™ื– ืงืขื ืขืŸ ื–ื™ื™ืŸ ืึทื ื“ืขืจืฉ ืคื•ืŸ ื“ื™ ืคืจื™ืขืจื“ื™ืงืข ื‘ืœื•ื™ื– ืื™ืŸ ืึท ืฉื˜ืจืขื ื’ ืœื™ืžื™ื˜ืขื“ ื•ื•ืขื’.

ื ื™ื˜ ืžืขืจ ื•ื•ื™ 2 ื‘ื™ื˜ืŸ, ืื•ืŸ ืžื™ื˜ ืคื™ืœืข ืื ื“ืขืจืข ืœื™ืžืึทืฅ, ื•ื•ื™ื™ึทืœ ื“ืขืจ ืคึผื•ื™ืขืจ ืงืขื ืขืŸ ื‘ืœื•ื™ื– ืึทืจื™ื‘ืขืจืคื™ืจืŸ ืื™ื™ืŸ ืขื ื˜ื™ื˜ื™ ืื™ืŸ ืึท ืฆื™ื™ึทื˜ ืื•ืŸ ื ื™ื˜ ืึทืœืข ืงืขื ืขืŸ ื–ื™ื™ืŸ ืœื™ื ืงืก ืฆื•ื–ืึทืžืขืŸ.

Travel = [ Or(
And(Human[i] == Human[i+1] + 1, Wolf[i] == Wolf[i+1] + 1, Goat[i] == Goat[i+1], Cabbage[i] == Cabbage[i+1]),
And(Human[i] == Human[i+1] + 1, Goat[i] == Goat[i+1] + 1, Wolf[i] == Wolf[i+1], Cabbage[i] == Cabbage[i+1]),
And(Human[i] == Human[i+1] + 1, Cabbage[i] == Cabbage[i+1] + 1, Wolf[i] == Wolf[i+1], Goat[i] == Goat[i+1]),
And(Human[i] == Human[i+1] - 1, Wolf[i] == Wolf[i+1] - 1, Goat[i] == Goat[i+1], Cabbage[i] == Cabbage[i+1]),
And(Human[i] == Human[i+1] - 1, Goat[i] == Goat[i+1] - 1, Wolf[i] == Wolf[i+1], Cabbage[i] == Cabbage[i+1]),
And(Human[i] == Human[i+1] - 1, Cabbage[i] == Cabbage[i+1] - 1, Wolf[i] == Wolf[i+1], Goat[i] == Goat[i+1]),
And(Wolf[i] == Wolf[i+1], Goat[i] == Goat[i+1], Cabbage[i] == Cabbage[i+1])) for i in range(Num-1) ]

ื–ืืœ ืก ืœื•ื™ืคืŸ ื“ื™ ืœื™ื™ื–ื•ื ื’.

solve(Side + Start + Finish + Safe + Travel)

ืื•ืŸ ืžื™ืจ ื‘ืึทืงื•ืžืขืŸ ื“ื™ ืขื ื˜ืคืขืจ!

Z3 ื’ืขืคื•ื ืขืŸ ืึท ืงืึธื ืกื™ืกื˜ืขื ื˜ ื’ืึทื ื’ ืคื•ืŸ ืฉื˜ืึทื˜ืŸ ื•ื•ืึธืก ืกืึทื˜ื™ืกืคื™ื™ื– ืึทืœืข ื‘ืื“ื™ื ื’ื•ื ื’ืขืŸ.
ื ืžื™ืŸ ืคื™ืจ-ื“ื™ืžืขื ืฉืึทื ืึทืœ ื’ืขืฉื˜ืึทืœื˜ ืคื•ืŸ ืคึผืœืึทืฅ-ืฆื™ื™ื˜.

ืœืืžื™ืจ ืื•ื™ืกืจืขื›ืขื ืขืŸ ื•ื•ืืก ืื™ื– ื’ืขืฉืขืŸ.

ืžื™ ืจ ื–ืขืขืŸ , ื ื– ืื™ ืŸ ืกื• ืฃ ื–ืขื ืข ืŸ ืืœ ืข ืืจื™ื‘ืขืจ , ื ื ืจ ืื ื”ืฒ ื‘ ื”ื ื˜ ืื•ื ื“ื–ืข ืจ ืคื•ื™ืข ืจ ื‘ืืฉืœืืก ืŸ ื–ื™ ืš ืฆ ื• ืจื•ืขืŸ , ืื• ืŸ ืื™ ืŸ ื“ ื™ ืขืจืฉื˜ ืข 2 ื˜ืจื™ื˜ ืฉื•ื•ื™ืž ื˜ ืข ืจ ื ื™ืฉ ื˜ ืขืจื’ืขืฅ .

Human_2 = 0
Human_3 = 0

ื“ืึธืก ืกืึทื’ื“ื–ืฉืขืกืฅ ืึทื– ื“ื™ ื ื•ืžืขืจ ืคื•ืŸ ืฉื˜ืึทื˜ืŸ ืžื™ืจ ืื•ื™ืกื“ืขืจื•ื•ื™ื™ืœื˜ ืื™ื– ื™ื‘ืขืจื™ืง, ืื•ืŸ 8 ื•ื•ืขื˜ ื–ื™ื™ืŸ ื’ืึทื ืฅ ื’ืขื ื•ื’.

ืื™ ืŸ ืื•ื ื“ื–ืข ืจ ืคืืœ , ื”ื ื˜ ื“ืข ืจ ืคื•ื™ืข ืจ ื“ื ืก ื’ืขื˜ื ืŸ : ืื ื”ื•ื™ื‘ ืŸ , ืจื• , ืจื•ื” , ืืจื™ื‘ืขืจืฆื•ื’ืฒ ืŸ ื“ ื™ ืฆื™ื’ , ืืจื™ื‘ืขืจืฆื•ืจืฒืก ืŸ ื“ ื™ ืงืจื•ื™ื˜ , ืฆื•ืจื™ืงืงื•ืžืข ืŸ ืžื™ ื˜ ื“ืข ืจ ืฆื™ื’ , ืืจื™ื‘ืขืจ ึพ ื˜ืจืื’ ืŸ ื“ืข ื ืฐืืœืฃ , ื–ื™ ืš ืฆื•ืจื™ืง , ืืœืฒืŸ , ืื™ื‘ืขืจื’ืขื’ืขื‘ ืŸ ื“ ื™ ืฆื™ื’ .

ืื‘ืขืจ ืื™ืŸ ื“ื™ ืกื•ืฃ ื“ื™ ืคึผืจืึธื‘ืœืขื ืื™ื– ืกืึทืœื•ื•ื“.

#ะกั‚ะฐั€ั‚.
 Human_1 = 0
 Wolf_1 = 0
 Goat_1 = 0
 Cabbage_1 = 0
 
 #ะคะตั€ะผะตั€ ะพั‚ะดั‹ั…ะฐะตั‚.
 Human_2 = 0
 Wolf_2 = 0
 Goat_2 = 0
 Cabbage_2 = 0
 
 #ะคะตั€ะผะตั€ ะพั‚ะดั‹ั…ะฐะตั‚.
 Human_3 = 0
 Wolf_3 = 0
 Goat_3 = 0
 Cabbage_3 = 0
 
 #ะคะตั€ะผะตั€ ะพั‚ะฒะพะทะธั‚ ะบะพะทัƒ ะฝะฐ ะฝัƒะถะฝั‹ะน ะฑะตั€ะตะณ.
 Human_4 = 1
 Wolf_4 = 0
 Goat_4 = 1
 Cabbage_4 = 0
 
 #ะคะตั€ะผะตั€ ะฒะพะทะฒั€ะฐั‰ะฐะตั‚ัั.
 Human_5 = 0
 Wolf_5 = 0
 Goat_5 = 1
 Cabbage_5 = 0
 
 #ะคะตั€ะผะตั€ ะพั‚ะฒะพะทะธั‚ ะบะฐะฟัƒัั‚ัƒ ะฝะฐ ะฝัƒะถะฝั‹ะน ะฑะตั€ะตะณ.
 Human_6 = 1
 Wolf_6 = 0
 Cabbage_6 = 1
 Goat_6 = 1
 
 #ะšะปัŽั‡ะตะฒะฐั ั‡ะฐัั‚ัŒ ะพะฟะตั€ะฐั†ะธะธ: ั„ะตั€ะผะตั€ ะฒะพะทะฒั€ะฐั‰ะฐะตั‚ ะบะพะทัƒ ะพะฑั€ะฐั‚ะฝะพ.
 Human_7 = 0
 Wolf_7 = 0
 Goat_7 = 0
 Cabbage_7 = 1
 
 #ะคะตั€ะผะตั€ ะพั‚ะฒะพะทะธั‚ ะฒะพะปะบะฐ ะฝะฐ ะดั€ัƒะณะพะน ะฑะตั€ะตะณ, ะณะดะต ะพะฝ ั‚ะตะฟะตั€ัŒ ะฝะฐั…ะพะดะธั‚ัั ะฒะผะตัั‚ะต ั ะบะฐะฟัƒัั‚ะพะน.
 Human_8 = 1
 Wolf_8 = 1
 Goat_8 = 0
 Cabbage_8 = 1
 
 #ะคะตั€ะผะตั€ ะฒะพะทะฒั€ะฐั‰ะฐะตั‚ัั ะทะฐ ะบะพะทะพะน.
 Human_9 = 0
 Wolf_9 = 1
 Goat_9 = 0
 Cabbage_9 = 1
 
 #ะคะตั€ะผะตั€ ะฟะพะฒั‚ะพั€ะฝะพ ะดะพัั‚ะฐะฒะปัะตั‚ ะบะพะทัƒ ะฝะฐ ะฝัƒะถะฝั‹ะน ะฑะตั€ะตะณ ะธ ะทะฐะฒะตั€ัˆะฐัŽั‚ ะฟะตั€ะตะฟั€ะฐะฒัƒ.
 Human_10 = 1
 Wolf_10 = 1
 Goat_10 = 1
 Cabbage_10 = 1

ืื™ืฆื˜ ืœืึธืžื™ืจ ืคึผืจื•ื‘ื™ืจืŸ ืฆื• ื˜ื•ื™ืฉืŸ ื“ื™ ื‘ืื“ื™ื ื’ื•ื ื’ืขืŸ ืื•ืŸ ื‘ืึทื•ื•ื™ื™ึทื–ืŸ ืึทื– ืขืก ื–ืขื ืขืŸ ืงื™ื™ืŸ ืกืึทืœื•ืฉืึทื ื–.

ืฆื• ื˜ืึธืŸ ื“ืึธืก, ืžื™ืจ ื•ื•ืขืœืŸ ื’ืขื‘ืŸ ืื•ื ื“ื–ืขืจ ื•ื•ืึธืœืฃ ื›ืขืจื‘ื™ื•ื•ืึธืจื™, ืื•ืŸ ืขืจ ื•ื•ืขื˜ ื•ื•ืขืœืŸ ืฆื• ืขืกืŸ ืงืจื•ื™ื˜.
ื“ืึธืก ืงืขืŸ ื–ื™ื™ืŸ ืงืึทืžืคึผืขืจื“ ืžื™ื˜ ื“ืขื ืคืึทืœ ืื™ืŸ ื•ื•ืึธืก ืื•ื ื“ื–ืขืจ ืฆื™ืœ ืื™ื– ืฆื• ื‘ืึทื•ื•ืึธืจืขื ืขืŸ ื“ื™ ืึทืคึผืœืึทืงื™ื™ืฉืึทืŸ ืื•ืŸ ืžื™ืจ ื“ืึทืจืคึฟืŸ ืฆื• ืžืึทื›ืŸ ื–ื™ื›ืขืจ ืึทื– ืขืก ื–ืขื ืขืŸ ืงื™ื™ืŸ ืœื•ืคึผื›ืึธื•ืœื–.

 Safe = [ And( Or(Wolf[i] != Goat[i], Wolf[i] == Human[i]), Or(Goat[i] != Cabbage[i], Goat[i] == Human[i]), Or(Wolf[i] != Cabbage[i], Goat[i] == Human[i])) for i in range(Num) ]

Z3 ื”ืื˜ ืื•ื ื“ื– ื“ื™ ืคืืœื’ืขื ื“ืข ืขื ื˜ืคืขืจ:

 no solution

ืขืก ืžื™ื˜ืœ ืึทื– ืขืก ื˜ืึทืงืข ื–ืขื ืขืŸ ืงื™ื™ืŸ ืกืึทืœื•ืฉืึทื ื–.

ืื–ื• ื™ ื”ืื‘ ืŸ ืžื™ ืจ ืคืจืื’ืจืืžืื˜ื™ืฉ ืข ื‘ืืฐื™ื–ืŸ , ื“ ื™ ืื•ืžืžืขื’ืœืขื›ืงืฒื˜ ืŸ ืฆ ื• ืืจื™ื‘ืขืจืฆื•ื’ืฒ ืŸ ืžื™ ื˜ ื ืŸ ืื•ืžื ื™ืฐืขืจ ืŸ ืฐืืœืฃ , ื ืŸ ืคืืจืœื•ืกื˜ ืŸ ืคื ืจ ื“ืข ื ืคื•ื™ืขืจ .

ืื•ื™ื‘ ื“ื™ ื•ื™ืœืขื ื’ืขืคื™ื ื˜ ื“ืขื ื˜ืขืžืข ื˜ืฉื™ืงืึทื•ื•ืข, ืื™ืŸ ืฆื•ืงื•ื ืคึฟื˜ ืึทืจื˜ื™ืงืœืขืŸ ืื™ืš ื•ื•ืขื˜ ื–ืึธื’ืŸ ืื™ืจ ื•ื•ื™ ืฆื• ื•ื•ืขื ื“ืŸ ืึท ืคึผืจืึธืกื˜ ืคึผืจืึธื’ืจืึทื ืึธื“ืขืจ ืคื•ื ืงืฆื™ืข ืื™ืŸ ืึท ื™ืงื•ื•ื™ื™ื–ืฉืึทืŸ ืงืึทืžืคึผืึทื˜ืึทื‘ืึทืœ ืžื™ื˜ ืคืึธืจืžืึทืœ ืžืขื˜ื”ืึธื“ืก, ืื•ืŸ ืกืึธืœื•ื•ืข ืขืก, ืื•ืŸ ื“ืขืจืžื™ื˜ ืึทื ื˜ื“ืขืงืŸ ืึทืœืข ืœืึทื“ื–ืฉื™ื˜ืึทืžืึทื˜ ืกื™ื ืขืจื™ืึธื•ื– ืื•ืŸ ื•ื•ืึทืœื ืขืจืึทื‘ื™ืœื™ื˜ื™ื–. ืขืจืฉื˜ืขืจ, ืื•ื™ืฃ ื“ืขืจ ื–ืขืœื‘ื™ืงืขืจ ืึทืจื‘ืขื˜, ืึธื‘ืขืจ ื“ืขืจืœืื ื’ื˜ ืื™ืŸ ื“ื™ ืคืึธืจืขื ืคื•ืŸ ืึท ืคึผืจืึธื’ืจืึทื, ืื•ืŸ ื“ืขืžืึธืœื˜ ื‘ื™ืกืœืขื›ื•ื•ื™ื™ึทื– ืงืึทืžืคึผืœืึทืงื™ื™ื˜ื™ื ื’ ืขืก ืื•ืŸ ืžืึทืš ืื•ื™ืฃ ืฆื• ื“ื™ ืงืจืึทื ื˜ ื‘ื™ื™ืฉืคื™ืœืŸ ืคื•ืŸ ื“ืขืจ ื•ื•ืขืœื˜ ืคื•ืŸ ื•ื•ื™ื™ื›ื•ื•ืืจื’ ืึทื ื˜ื•ื•ื™ืงืœื•ื ื’.

ื“ืขืจ ื•ื•ื™ื™ึทื˜ืขืจ ืึทืจื˜ื™ืงืœ ืื™ื– ืฉื•ื™ืŸ ื’ืจื™ื™ื˜:
ืฉืึทืคึฟืŸ ืึท ืคืึธืจืžืึทืœ ื•ื•ืขืจืึทืคืึทืงื™ื™ืฉืึทืŸ ืกื™ืกื˜ืขื ืคึฟื•ืŸ ืงืจืึทืฆืŸ: ืฉืจื™ื™ื‘ืŸ ืึท ืกื™ืžื‘ืึธืœื™ืฉ VM ืื™ืŸ PHP ืื•ืŸ Python

ืื™ืŸ ืขืก ืื™ืš ืžืึทืš ืคื•ืŸ ืคืึธืจืžืึทืœ ื•ื•ืขืจืึทืคืึทืงื™ื™ืฉืึทืŸ ืคื•ืŸ ืคึผืจืึธื‘ืœืขืžืก ืฆื• ืžื’ื™ืœื”, ืื•ืŸ ื‘ืึทืฉืจื™ื™ึทื‘ืŸ
ื•ื•ื™ ืงืขื ืขืŸ ื–ื™ื™ ืื•ื™ื˜ืึธืžืึทื˜ื™ืฉ ืงืึธื ื•ื•ืขืจื˜ืขื“ ืื™ืŸ ืคืึธืจืžืึทืœ ื”ืขืจืฉืŸ ืกื™ืกื˜ืขืžืขืŸ.

ืžืงื•ืจ: www.habr.com

ืœื™ื™ื’ืŸ ืึท ื‘ืึทืžืขืจืงื•ื ื’