เจฌเจ˜เจฟเจ†เฉœ, เจฌเฉฑเจ•เจฐเฉ€ เจ…เจคเฉ‡ เจ—เฉ‹เจญเฉ€ เจธเจฎเฉฑเจธเจฟเจ† เจฆเฉ€ เจ‰เจฆเจพเจนเจฐเจจ เจฆเฉ€ เจตเจฐเจคเฉ‹เจ‚ เจ•เจฐเจ•เฉ‡ เจฐเจธเจฎเฉ€ เจคเจธเจฆเฉ€เจ•

เจฎเฉ‡เจฐเฉ€ เจฐเจพเจ เจตเจฟเฉฑเจš, เจ‡เฉฐเจŸเจฐเจจเฉˆเจŸ เจฆเฉ‡ เจฐเฉ‚เจธเฉ€-เจญเจพเจธเจผเจพ เจฆเฉ‡ เจ–เฉ‡เจคเจฐ เจตเจฟเฉฑเจš, เจฐเจธเจฎเฉ€ เจคเจธเจฆเฉ€เจ• เจฆเจพ เจตเจฟเจธเจผเจพ เจ•เจพเจซเจผเฉ€ เจจเจนเฉ€เจ‚ เจนเฉˆ, เจ…เจคเฉ‡ เจ–เจพเจธ เจคเฉŒเจฐ 'เจคเฉ‡ เจธเจงเจพเจฐเจจ เจ…เจคเฉ‡ เจธเจชเฉฑเจธเจผเจŸ เจ‰เจฆเจพเจนเจฐเจฃเจพเจ‚ เจฆเฉ€ เจ˜เจพเจŸ เจนเฉˆเฅค

เจฎเฉˆเจ‚ เจ‡เฉฑเจ• เจตเจฟเจฆเฉ‡เจธเจผเฉ€ เจธเจฐเฉ‹เจค เจคเฉ‹เจ‚ เจ‡เฉฑเจ• เจ‰เจฆเจพเจนเจฐเจฃ เจฆเฉ‡เจตเจพเจ‚เจ—เจพ, เจ…เจคเฉ‡ เจ‡เฉฑเจ• เจฌเจ˜เจฟเจ†เฉœ, เจ‡เฉฑเจ• เจฌเฉฑเจ•เจฐเฉ€ เจ…เจคเฉ‡ เจ‡เฉฑเจ• เจ—เฉ‹เจญเฉ€ เจจเฉ‚เฉฐ เจฆเจฐเจฟเจ† เจฆเฉ‡ เจฆเฉ‚เจœเฉ‡ เจชเจพเจธเฉ‡ เจชเจพเจฐ เจ•เจฐเจจ เจฆเฉ€ เจœเจพเจฃเฉ€-เจชเจ›เจพเจฃเฉ€ เจธเจฎเฉฑเจธเจฟเจ† เจฆเจพ เจ†เจชเจฃเจพ เจนเฉฑเจฒ เจœเฉ‹เฉœเจพเจ‚เจ—เจพเฅค

เจชเจฐ เจชเจนเจฟเจฒเจพเจ‚, เจฎเฉˆเจ‚ เจธเฉฐเจ–เฉ‡เจช เจตเจฟเฉฑเจš เจตเจฐเจฃเจจ เจ•เจฐเจพเจ‚เจ—เจพ เจ•เจฟ เจฐเจธเจฎเฉ€ เจคเจธเจฆเฉ€เจ• เจ•เฉ€ เจนเฉˆ เจ…เจคเฉ‡ เจ‡เจธเจฆเฉ€ เจฒเฉ‹เฉœ เจ•เจฟเจ‰เจ‚ เจนเฉˆเฅค

เจฐเจธเจฎเฉ€ เจคเจธเจฆเฉ€เจ• เจฆเจพ เจ†เจฎ เจคเฉŒเจฐ 'เจคเฉ‡ เจฎเจคเจฒเจฌ เจนเฉเฉฐเจฆเจพ เจนเฉˆ เจ‡เฉฑเจ• เจชเฉเจฐเฉ‹เจ—เจฐเจพเจฎ เจœเจพเจ‚ เจเจฒเจ—เฉ‹เจฐเจฟเจฆเจฎ เจฆเฉ€ เจฆเฉ‚เจœเฉ‡ เจฆเฉ€ เจตเจฐเจคเฉ‹เจ‚ เจ•เจฐเจ•เฉ‡ เจœเจพเจ‚เจš เจ•เจฐเจจเจพเฅค

เจ‡เจน เจฏเจ•เฉ€เจจเฉ€ เจฌเจฃเจพเจ‰เจฃ เจฒเจˆ เจœเจผเจฐเฉ‚เจฐเฉ€ เจนเฉˆ เจ•เจฟ เจชเฉเจฐเฉ‹เจ—เจฐเจพเจฎ เจ‰เจฎเฉ€เจฆ เจ…เจจเฉเจธเจพเจฐ เจตเจฟเจตเจนเจพเจฐ เจ•เจฐเฉ‡ เจ…เจคเฉ‡ เจ‡เจธเจฆเฉ€ เจธเฉเจฐเฉฑเจ–เจฟเจ† เจจเฉ‚เฉฐ เจตเฉ€ เจฏเจ•เฉ€เจจเฉ€ เจฌเจฃเจพเจ‡เจ† เจœเจพเจตเฉ‡เฅค

เจฐเจธเจฎเฉ€ เจคเจธเจฆเฉ€เจ• เจ•เจฎเจœเจผเฉ‹เจฐเฉ€เจ†เจ‚ เจจเฉ‚เฉฐ เจฒเฉฑเจญเจฃ เจ…เจคเฉ‡ เจ–เจผเจคเจฎ เจ•เจฐเจจ เจฆเจพ เจธเจญ เจคเฉ‹เจ‚ เจธเจผเจ•เจคเฉ€เจธเจผเจพเจฒเฉ€ เจธเจพเจงเจจ เจนเฉˆ: เจ‡เจน เจคเฉเจนเจพเจจเฉ‚เฉฐ เจชเฉเจฐเฉ‹เจ—เจฐเจพเจฎ เจตเจฟเฉฑเจš เจฎเฉŒเจœเฉ‚เจฆ เจธเจพเจฐเฉ‡ เจ›เฉ‡เจ• เจ…เจคเฉ‡ เจฌเฉฑเจ— เจฒเฉฑเจญเจฃ, เจœเจพเจ‚ เจ‡เจน เจธเจพเจฌเจค เจ•เจฐเจจ เจฆเฉ€ เจ‡เจœเจพเจœเจผเจค เจฆเจฟเฉฐเจฆเจพ เจนเฉˆ เจ•เจฟ เจ‰เจน เจฎเฉŒเจœเฉ‚เจฆ เจจเจนเฉ€เจ‚ เจนเจจเฅค
เจ‡เจน เจงเจฟเจ†เจจ เจฆเฉ‡เจฃ เจฏเฉ‹เจ— เจนเฉˆ เจ•เจฟ เจ•เฉเจ เจฎเจพเจฎเจฒเจฟเจ†เจ‚ เจตเจฟเฉฑเจš เจ‡เจน เจ…เจธเฉฐเจญเจต เจนเฉˆ, เจœเจฟเจตเฉ‡เจ‚ เจ•เจฟ 8 เจตเจฐเจ— เจฆเฉ‡ เจ‡เฉฑเจ• เจฌเฉ‹เจฐเจก เจฆเฉ€ เจšเฉŒเฉœเจพเจˆ เจฆเฉ‡ เจจเจพเจฒ 1000 เจฐเจพเจฃเฉ€เจ†เจ‚ เจฆเฉ€ เจธเจฎเฉฑเจธเจฟเจ† เจตเจฟเฉฑเจš: เจ‡เจน เจธเจญ เจ…เจฒเจ—เฉ‹เจฐเจฟเจฆเจฎเจฟเจ• เจ—เฉเฉฐเจเจฒเจคเจพ เจœเจพเจ‚ เจฐเฉ‹เจ•เจฃ เจฆเฉ€ เจธเจฎเฉฑเจธเจฟเจ† เจตเจฟเฉฑเจš เจ†เจ‰เจ‚เจฆเจพ เจนเฉˆเฅค

เจนเจพเจฒเจพเจ‚เจ•เจฟ, เจ•เจฟเจธเฉ‡ เจตเฉ€ เจธเจฅเจฟเจคเฉ€ เจตเจฟเฉฑเจš, เจคเจฟเฉฐเจจ เจตเจฟเฉฑเจšเฉ‹เจ‚ เจ‡เฉฑเจ• เจœเจตเจพเจฌ เจชเฉเจฐเจพเจชเจค เจ•เฉ€เจคเจพ เจœเจพเจตเฉ‡เจ—เจพ: เจชเฉเจฐเฉ‹เจ—เจฐเจพเจฎ เจธเจนเฉ€ เจนเฉˆ, เจ—เจฒเจค เจนเฉˆ, เจœเจพเจ‚ เจœเจตเจพเจฌ เจฆเฉ€ เจ—เจฃเจจเจพ เจ•เจฐเจจเจพ เจธเฉฐเจญเจต เจจเจนเฉ€เจ‚ เจธเฉ€เฅค

เจœเฉ‡เจ•เจฐ เจ•เฉ‹เจˆ เจœเจตเจพเจฌ เจฒเฉฑเจญเจฃเจพ เจ…เจธเฉฐเจญเจต เจนเฉˆ, เจคเจพเจ‚ เจชเฉเจฐเฉ‹เจ—เจฐเจพเจฎ เจฆเฉ‡ เจ…เจธเจชเจธเจผเจŸ เจนเจฟเฉฑเจธเจฟเจ†เจ‚ เจจเฉ‚เฉฐ เจฆเฉเจฌเจพเจฐเจพ เจ•เฉฐเจฎ เจ•เจฐเจจเจพ, เจ‰เจนเจจเจพเจ‚ เจฆเฉ€ เจเจฒเจ—เฉ‹เจฐเจฟเจฆเจฎเจฟเจ• เจ—เฉเฉฐเจเจฒเจคเจพ เจจเฉ‚เฉฐ เจ˜เจŸเจพเจ‰เจ‚เจฆเฉ‡ เจนเฉ‹เจ, เจ‡เฉฑเจ• เจ–เจพเจธ เจนเจพเจ‚ เจœเจพเจ‚ เจจเจนเฉ€เจ‚ เจœเจตเจพเจฌ เจชเฉเจฐเจพเจชเจค เจ•เจฐเจจ เจฒเจˆ เจ…เจ•เจธเจฐ เจธเฉฐเจญเจต เจนเฉเฉฐเจฆเจพ เจนเฉˆเฅค

เจ…เจคเฉ‡ เจฐเจธเจฎเฉ€ เจคเจธเจฆเฉ€เจ• เจฆเฉ€ เจตเจฐเจคเฉ‹เจ‚ เจ•เฉ€เจคเฉ€ เจœเจพเจ‚เจฆเฉ€ เจนเฉˆ, เจ‰เจฆเจพเจนเจฐเจจ เจฒเจˆ, เจตเจฟเฉฐเจกเฉ‹เจœเจผ เจ•เจฐเจจเจฒ เจ…เจคเฉ‡ เจกเจพเจฐเจชเจพ เจกเจฐเฉ‹เจจ เจ“เจชเจฐเฉ‡เจŸเจฟเฉฐเจ— เจธเจฟเจธเจŸเจฎเจพเจ‚ เจตเจฟเฉฑเจš, เจธเฉเจฐเฉฑเจ–เจฟเจ† เจฆเฉ‡ เจตเฉฑเจง เจคเฉ‹เจ‚ เจตเฉฑเจง เจชเฉฑเจงเจฐ เจจเฉ‚เฉฐ เจฏเจ•เฉ€เจจเฉ€ เจฌเจฃเจพเจ‰เจฃ เจฒเจˆเฅค

เจ…เจธเฉ€เจ‚ 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 เจฌเฉ‡เจจเจคเฉ€ เจฆเฉ€ เจตเจฐเจคเฉ‹เจ‚ เจ•เจฐเจฆเฉ‡ เจนเฉ‹เจ เจธเจฐเจตเจฐ เจตเจฟเฉฑเจš เจฆเจพเจ–เจฒ เจนเฉ‹ เจธเจ•เจฆเฉ‡ เจนเฉ‹, เจคเจพเจ‚ เจฌเจ˜เจฟเจ†เฉœ, เจฌเฉฑเจ•เจฐเฉ€ เจ…เจคเฉ‡ เจ—เฉ‹เจญเฉ€ เจ‡เฉฑเจ• เจฌเจนเฉเจค เจœเจผเจฟเจ†เจฆเจพ เจ—เฉเฉฐเจเจฒเจฆเจพเจฐ เจ…เจคเฉ‡ เจตเจฟเจ†เจชเจ• เจธเจผเฉเจฐเฉ‡เจฃเฉ€ เจคเฉ‹เจ‚ เจ‡เฉฑเจ• เจ‰เจฆเจพเจนเจฐเจจ เจชเฉเจฐเจฆเจฐเจธเจผเจฟเจค เจ•เจฐเจฆเฉ‡ เจนเจจ, เจœเจฟเจธ เจตเจฟเฉฑเจš เจธเจฟเจฐเจซ เจŸเฉ€เจšเจพ เจชเฉเจฐเจพเจชเจค เจ•เฉ€เจคเจพ เจœเจพ เจธเจ•เจฆเจพ เจนเฉˆ. เจ•เจˆ เจฌเฉ‡เจจเจคเฉ€เจ†เจ‚ เจฆเฉเจ†เจฐเจพ.

เจ‡เจน เจคเฉเจฒเจจเจพเจฏเฉ‹เจ— เจนเฉˆ, เจ‰เจฆเจพเจนเจฐเจจ เจฒเจˆ, เจ‡เฉฑเจ• เจฆเฉเจฐเจฟเจธเจผ เจจเจพเจฒ เจœเจฟเฉฑเจฅเฉ‡ เจคเฉเจนเจพเจจเฉ‚เฉฐ เจ‡เฉฑเจ• SQL เจ‡เฉฐเจœเฉˆเจ•เจธเจผเจจ เจฒเฉฑเจญเจฃ เจฆเฉ€ เจฒเฉ‹เฉœ เจนเฉˆ, เจ‡เจธ เจฐเจพเจนเฉ€เจ‚ เจ‡เฉฑเจ• เจซเจพเจˆเจฒ เจฒเจฟเจ–เจฃ เจฆเฉ€ เจฒเฉ‹เฉœ เจนเฉˆ, เจซเจฟเจฐ เจ†เจชเจฃเฉ‡ เจ…เจงเจฟเจ•เจพเจฐเจพเจ‚ เจจเฉ‚เฉฐ เจ‰เฉฑเจšเจพ เจ•เจฐเฉ‹ เจ…เจคเฉ‡ เจ•เฉ‡เจตเจฒ เจคเจฆ เจนเฉ€ เจ‡เฉฑเจ• เจชเจพเจธเจตเจฐเจก เจชเฉเจฐเจพเจชเจค เจ•เจฐเฉ‹เฅค

เจธเจฎเฉฑเจธเจฟเจ† เจฆเฉ‡ เจนเจพเจฒเจพเจค เจ…เจคเฉ‡ เจ‡เจธ เจฆเจพ เจนเฉฑเจฒเจ•เจฟเจธเจพเจจ เจจเฉ‚เฉฐ เจ‡เฉฑเจ• เจฌเจ˜เจฟเจ†เฉœ, เจ‡เฉฑเจ• เจฌเฉฑเจ•เจฐเฉ€ เจ…เจคเฉ‡ เจ—เฉ‹เจญเฉ€ เจจเฉ‚เฉฐ เจฆเจฐเจฟเจ† เจฆเฉ‡ เจชเจพเจฐ เจฒเจฟเจœเจพเจฃ เจฆเฉ€ เจฒเฉ‹เฉœ เจนเฉเฉฐเจฆเฉ€ เจนเฉˆเฅค เจ•เจฟเจธเจพเจจ เจ•เฉ‹เจฒ เจ‡เฉฑเจ• เจ•เจฟเจธเจผเจคเฉ€ เจนเฉˆ เจœเจฟเจธ เจตเจฟเฉฑเจš เจ•เจฟเจธเจพเจจ เจ–เฉเจฆ เจคเฉ‹เจ‚ เจ‡เจฒเจพเจตเจพ เจธเจฟเจฐเจซ เจ‡เฉฑเจ• เจตเจธเจคเฉ‚ เจจเฉ‚เฉฐ เจ…เจจเฉเจ•เฉ‚เจฒเจฟเจค เจ•เจฐ เจธเจ•เจฆเจพ เจนเฉˆเฅค เจฌเจ˜เจฟเจ†เฉœ เจฌเฉฑเจ•เจฐเฉ€ เจจเฉ‚เฉฐ เจ–เจพ เจœเจพเจตเฉ‡เจ—เจพ เจ…เจคเฉ‡ เจฌเฉฑเจ•เจฐเฉ€ เจ—เฉ‹เจญเฉ€ เจจเฉ‚เฉฐ เจ–เจพ เจœเจพเจตเฉ‡เจ—เฉ€ เจœเฉ‡เจ•เจฐ เจ•เจฟเจธเจพเจจ เจ‰เจจเฉเจนเจพเจ‚ เจจเฉ‚เฉฐ เจฌเจฟเจจเจพเจ‚ เจตเจœเฉเจนเจพ เจ›เฉฑเจก เจฆเฉ‡เจตเฉ‡เฅค

เจนเฉฑเจฒ เจ‡เจน เจนเฉˆ เจ•เจฟ เจ•เจฆเจฎ 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

เจ‡เจธเจฆเจพ เจฎเจคเจฒเจฌ เจนเฉˆ เจ•เจฟ เจ…เจธเจฒ เจตเจฟเฉฑเจš เจ•เฉ‹เจˆ เจนเฉฑเจฒ เจจเจนเฉ€เจ‚ เจนเจจ.

เจ‡เจธ เจคเจฐเฉเจนเจพเจ‚, เจ…เจธเฉ€เจ‚ เจชเฉเจฐเฉ‹เจ—เฉเจฐเจพเจฎเจฟเจ• เจคเฉŒเจฐ 'เจคเฉ‡ เจ•เจฟเจธเจพเจจ เจฒเจˆ เจจเฉเจ•เจธเจพเจจ เจคเฉ‹เจ‚ เจฌเจฟเจจเจพเจ‚ เจธเจฐเจตเจญเฉ‹เจ—เฉ€ เจฌเจ˜เจฟเจ†เฉœ เจจเจพเจฒ เจชเจพเจฐ เจ•เจฐเจจ เจฆเฉ€ เจ…เจธเฉฐเจญเจตเจคเจพ เจจเฉ‚เฉฐ เจธเจพเจฌเจค เจ•เฉ€เจคเจพ เจนเฉˆเฅค

เจœเฉ‡เจ•เจฐ เจฆเจฐเจธเจผเจ•เจพเจ‚ เจจเฉ‚เฉฐ เจ‡เจน เจตเจฟเจธเจผเจพ เจฆเจฟเจฒเจšเจธเจช เจฒเฉฑเจ—เจฆเจพ เจนเฉˆ, เจคเจพเจ‚ เจญเจตเจฟเฉฑเจ– เจฆเฉ‡ เจฒเฉ‡เจ–เจพเจ‚ เจตเจฟเฉฑเจš เจฎเฉˆเจ‚ เจคเฉเจนเจพเจจเฉ‚เฉฐ เจฆเฉฑเจธเจพเจ‚เจ—เจพ เจ•เจฟ เจ•เจฟเจตเฉ‡เจ‚ เจ‡เฉฑเจ• เจ†เจฎ เจชเฉเจฐเฉ‹เจ—เจฐเจพเจฎ เจœเจพเจ‚ เจซเฉฐเจ•เจธเจผเจจ เจจเฉ‚เฉฐ เจฐเจธเจฎเฉ€ เจคเจฐเฉ€เจ•เจฟเจ†เจ‚ เจฆเฉ‡ เจ…เจจเฉเจ•เฉ‚เจฒ เจ‡เฉฑเจ• เจธเจฎเฉ€เจ•เจฐเจจ เจตเจฟเฉฑเจš เจฌเจฆเจฒเจฃเจพ เจนเฉˆ, เจ…เจคเฉ‡ เจ‡เจธเจจเฉ‚เฉฐ เจนเฉฑเจฒ เจ•เจฐเจจเจพ เจนเฉˆ, เจœเจฟเจธ เจจเจพเจฒ เจธเจพเจฐเฉ‡ เจœเจพเจ‡เจœเจผ เจฆเฉเจฐเจฟเจธเจผเจพเจ‚ เจ…เจคเฉ‡ เจ•เจฎเจœเจผเฉ‹เจฐเฉ€เจ†เจ‚ เจฆเฉ‹เจตเจพเจ‚ เจจเฉ‚เฉฐ เจชเฉเจฐเจ—เจŸ เจ•เฉ€เจคเจพ เจœเจพเจตเฉ‡เจ—เจพเฅค เจชเจนเจฟเจฒเจพเจ‚, เจ‰เจธเฉ‡ เจ•เฉฐเจฎ 'เจคเฉ‡, เจชเจฐ เจ‡เฉฑเจ• เจชเฉเจฐเฉ‹เจ—เจฐเจพเจฎ เจฆเฉ‡ เจฐเฉ‚เจช เจตเจฟเฉฑเจš เจชเฉ‡เจธเจผ เจ•เฉ€เจคเจพ เจ—เจฟเจ†, เจ…เจคเฉ‡ เจซเจฟเจฐ เจนเฉŒเจฒเฉ€-เจนเฉŒเจฒเฉ€ เจ‡เจธเจจเฉ‚เฉฐ เจ—เฉเฉฐเจเจฒเจฆเจพเจฐ เจฌเจฃเจพเจ‰เจฃเจพ เจ…เจคเฉ‡ เจธเจพเจซเจŸเจตเฉ‡เจ…เจฐ เจตเจฟเจ•เจพเจธ เจฆเฉ€ เจฆเฉเจจเฉ€เจ† เจคเฉ‹เจ‚ เจฎเฉŒเจœเฉ‚เจฆเจพ เจ‰เจฆเจพเจนเจฐเจฃเจพเจ‚ เจตเฉฑเจฒ เจตเจงเจฃเจพ.

เจ…เจ—เจฒเจพ เจฒเฉ‡เจ– เจชเจนเจฟเจฒเจพเจ‚ เจนเฉ€ เจคเจฟเจ†เจฐ เจนเฉˆ:
เจธเจผเฉเจฐเฉ‚ เจคเฉ‹เจ‚ เจ‡เฉฑเจ• เจฐเจธเจฎเฉ€ เจคเจธเจฆเฉ€เจ• เจธเจฟเจธเจŸเจฎ เจฌเจฃเจพเจ‰เจฃเจพ: PHP เจ…เจคเฉ‡ เจชเจพเจˆเจฅเจจ เจตเจฟเฉฑเจš เจ‡เฉฑเจ• เจชเฉเจฐเจคเฉ€เจ• VM เจฒเจฟเจ–เจฃเจพ

เจ‡เจธ เจตเจฟเฉฑเจš เจฎเฉˆเจ‚ เจธเจฎเฉฑเจธเจฟเจ†เจตเจพเจ‚ เจฆเฉ€ เจฐเจธเจฎเฉ€ เจคเจธเจฆเฉ€เจ• เจคเฉ‹เจ‚ เจชเฉเจฐเฉ‹เจ—เจฐเจพเจฎเจพเจ‚ เจคเฉฑเจ• เจœเจพเจ‚เจฆเจพ เจนเจพเจ‚, เจ…เจคเฉ‡ เจตเจฐเจฃเจจ เจ•เจฐเจฆเจพ เจนเจพเจ‚
เจ‰เจนเจจเจพเจ‚ เจจเฉ‚เฉฐ เจ†เจชเจฃเฉ‡ เจ†เจช เจฐเจธเจฎเฉ€ เจจเจฟเจฏเจฎ เจชเฉเจฐเจฃเจพเจฒเฉ€เจ†เจ‚ เจตเจฟเฉฑเจš เจ•เจฟเจตเฉ‡เจ‚ เจฌเจฆเจฒเจฟเจ† เจœเจพ เจธเจ•เจฆเจพ เจนเฉˆเฅค

เจธเจฐเฉ‹เจค: www.habr.com

เจ‡เฉฑเจ• เจŸเจฟเฉฑเจชเจฃเฉ€ เจœเฉ‹เฉœเฉ‹