Π‘ΠΏΠΎΡΠ΅Π΄ ΠΌΠΎΠ΅ ΠΌΠΈΡΠ»Π΅ΡΠ΅, Π²ΠΎ ΡΠ΅ΠΊΡΠΎΡΠΎΡ Π½Π° ΠΈΠ½ΡΠ΅ΡΠ½Π΅Ρ Π½Π° ΡΡΡΠΊΠΈ ΡΠ°Π·ΠΈΠΊ, ΡΠ΅ΠΌΠ°ΡΠ° Π·Π° ΡΠΎΡΠΌΠ°Π»Π½Π° Π²Π΅ΡΠΈΡΠΈΠΊΠ°ΡΠΈΡΠ° Π½Π΅ Π΅ Π΄ΠΎΠ²ΠΎΠ»Π½ΠΎ ΠΏΠΎΠΊΡΠΈΠ΅Π½Π°, Π° ΠΎΡΠΎΠ±Π΅Π½ΠΎ Π½Π΅Π΄ΠΎΡΡΠ°ΡΡΠ²Π°Π°Ρ Π΅Π΄Π½ΠΎΡΡΠ°Π²Π½ΠΈ ΠΈ ΡΠ°ΡΠ½ΠΈ ΠΏΡΠΈΠΌΠ΅ΡΠΈ.
ΠΠ΅ Π΄Π°Π΄Π°ΠΌ ΠΏΡΠΈΠΌΠ΅Ρ ΠΎΠ΄ ΡΡΡΠ°Π½ΡΠΊΠΈ ΠΈΠ·Π²ΠΎΡ, ΠΈ ΡΠ΅ Π΄ΠΎΠ΄Π°Π΄Π°ΠΌ ΡΠ²ΠΎΠ΅ ΡΠ΅ΡΠ΅Π½ΠΈΠ΅ Π·Π° ΠΏΠΎΠ·Π½Π°ΡΠΈΠΎΡ ΠΏΡΠΎΠ±Π»Π΅ΠΌ ΡΠΎ ΠΏΡΠ΅ΠΌΠΈΠ½ΡΠ²Π°ΡΠ΅ Π½Π° Π²ΠΎΠ»ΠΊ, ΠΊΠΎΠ·Π° ΠΈ Π·Π΅Π»ΠΊΠ° Π½Π° Π΄ΡΡΠ³Π°ΡΠ° ΡΡΡΠ°Π½Π° Π½Π° ΡΠ΅ΠΊΠ°ΡΠ°.
ΠΠΎ, ΠΏΡΠ²ΠΎ, Π½Π°ΠΊΡΠ°ΡΠΊΠΎ ΡΠ΅ ΠΎΠΏΠΈΡΠ°ΠΌ ΡΡΠΎ Π΅ ΡΠΎΡΠΌΠ°Π»Π½Π° Π²Π΅ΡΠΈΡΠΈΠΊΠ°ΡΠΈΡΠ° ΠΈ Π·ΠΎΡΡΠΎ Π΅ ΠΏΠΎΡΡΠ΅Π±Π½Π°.
Π€ΠΎΡΠΌΠ°Π»Π½Π°ΡΠ° Π²Π΅ΡΠΈΡΠΈΠΊΠ°ΡΠΈΡΠ° ΠΎΠ±ΠΈΡΠ½ΠΎ Π·Π½Π°ΡΠΈ ΠΏΡΠΎΠ²Π΅ΡΠΊΠ° Π½Π° Π΅Π΄Π½Π° ΠΏΡΠΎΠ³ΡΠ°ΠΌΠ° ΠΈΠ»ΠΈ Π°Π»Π³ΠΎΡΠΈΡΠ°ΠΌ ΠΊΠΎΡΠΈΡΡΠ΅ΡΡΠΈ Π΄ΡΡΠ³Π°.
ΠΠ²Π° Π΅ Π½Π΅ΠΎΠΏΡ ΠΎΠ΄Π½ΠΎ Π·Π° Π΄Π° ΡΠ΅ ΠΎΡΠΈΠ³ΡΡΠΈ Π΄Π΅ΠΊΠ° ΠΏΡΠΎΠ³ΡΠ°ΠΌΠ°ΡΠ° ΡΠ΅ ΠΎΠ΄Π½Π΅ΡΡΠ²Π° ΠΊΠ°ΠΊΠΎ ΡΡΠΎ ΡΠ΅ ΠΎΡΠ΅ΠΊΡΠ²Π°, Π° ΠΈΡΡΠΎ ΡΠ°ΠΊΠ° ΠΈ Π·Π° Π΄Π° ΡΠ΅ ΠΎΠ±Π΅Π·Π±Π΅Π΄ΠΈ Π½Π΅ΡΠ·ΠΈΠ½Π°ΡΠ° Π±Π΅Π·Π±Π΅Π΄Π½ΠΎΡΡ.
Π€ΠΎΡΠΌΠ°Π»Π½Π°ΡΠ° Π²Π΅ΡΠΈΡΠΈΠΊΠ°ΡΠΈΡΠ° Π΅ Π½Π°ΡΠΌΠΎΡΠ½ΠΎΡΠΎ ΡΡΠ΅Π΄ΡΡΠ²ΠΎ Π·Π° ΠΏΡΠΎΠ½Π°ΠΎΡΠ°ΡΠ΅ ΠΈ Π΅Π»ΠΈΠΌΠΈΠ½ΠΈΡΠ°ΡΠ΅ Π½Π° ΠΏΡΠΎΠΏΡΡΡΠΈΡΠ΅: Π²ΠΈ ΠΎΠ²ΠΎΠ·ΠΌΠΎΠΆΡΠ²Π° Π΄Π° Π³ΠΈ ΠΏΡΠΎΠ½Π°ΡΠ΄Π΅ΡΠ΅ ΡΠΈΡΠ΅ ΠΏΠΎΡΡΠΎΠ΅ΡΠΊΠΈ Π΄ΡΠΏΠΊΠΈ ΠΈ Π³ΡΠ΅ΡΠΊΠΈ Π²ΠΎ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠ°ΡΠ° ΠΈΠ»ΠΈ Π΄Π° Π΄ΠΎΠΊΠ°ΠΆΠ΅ΡΠ΅ Π΄Π΅ΠΊΠ° ΡΠΈΠ΅ Π½Π΅ ΠΏΠΎΡΡΠΎΡΠ°Ρ.
ΠΡΠ΅Π΄ΠΈ Π΄Π° ΡΠ΅ Π½Π°ΠΏΠΎΠΌΠ΅Π½Π΅ Π΄Π΅ΠΊΠ° Π²ΠΎ Π½Π΅ΠΊΠΎΠΈ ΡΠ»ΡΡΠ°ΠΈ ΡΠΎΠ° Π΅ Π½Π΅Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, ΠΊΠ°ΠΊΠΎ Π½Π° ΠΏΡΠΈΠΌΠ΅Ρ Π²ΠΎ ΠΏΡΠΎΠ±Π»Π΅ΠΌΠΎΡ ΡΠΎ 8 ΠΊΡΠ°Π»ΠΈΡΠΈ ΡΠΎ ΡΠΈΡΠΈΠ½Π° Π½Π° ΡΠ°Π±Π»Π° ΠΎΠ΄ 1000 ΠΊΠ²Π°Π΄ΡΠ°ΡΠΈ: ΡΓ¨ ΡΠ΅ ΡΠ²Π΅Π΄ΡΠ²Π° Π½Π° Π°Π»Π³ΠΎΡΠΈΡΠ°ΠΌΡΠΊΠ° ΡΠ»ΠΎΠΆΠ΅Π½ΠΎΡΡ ΠΈΠ»ΠΈ ΠΏΡΠΎΠ±Π»Π΅ΠΌ ΡΠΎ Π·Π°ΠΏΠΈΡΠ°ΡΠ΅.
Π‘Π΅ΠΏΠ°ΠΊ, Π²ΠΎ ΡΠ΅ΠΊΠΎΡ ΡΠ»ΡΡΠ°Ρ, ΡΠ΅ ΡΠ΅ Π΄ΠΎΠ±ΠΈΠ΅ Π΅Π΄Π΅Π½ ΠΎΠ΄ ΡΡΠΈΡΠ΅ ΠΎΠ΄Π³ΠΎΠ²ΠΎΡΠΈ: ΠΏΡΠΎΠ³ΡΠ°ΠΌΠ°ΡΠ° Π΅ ΡΠΎΡΠ½Π°, Π½Π΅ΡΠΎΡΠ½Π° ΠΈΠ»ΠΈ Π½Π΅ Π±Π΅ΡΠ΅ ΠΌΠΎΠΆΠ½ΠΎ Π΄Π° ΡΠ΅ ΠΏΡΠ΅ΡΠΌΠ΅ΡΠ° ΠΎΠ΄Π³ΠΎΠ²ΠΎΡΠΎΡ.
ΠΠΊΠΎ Π΅ Π½Π΅Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ Π΄Π° ΡΠ΅ Π½Π°ΡΠ΄Π΅ ΠΎΠ΄Π³ΠΎΠ²ΠΎΡ, ΡΠ΅ΡΡΠΎ Π΅ ΠΌΠΎΠΆΠ½ΠΎ Π΄Π° ΡΠ΅ ΠΏΡΠ΅ΡΠ°Π±ΠΎΡΠ°Ρ Π½Π΅ΡΠ°ΡΠ½ΠΈ Π΄Π΅Π»ΠΎΠ²ΠΈ ΠΎΠ΄ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠ°ΡΠ°, Π½Π°ΠΌΠ°Π»ΡΠ²Π°ΡΡΠΈ ΡΠ° Π½ΠΈΠ²Π½Π°ΡΠ° Π°Π»Π³ΠΎΡΠΈΡΠ°ΠΌΡΠΊΠ° ΡΠ»ΠΎΠΆΠ΅Π½ΠΎΡΡ, ΡΠΎ ΡΠ΅Π» Π΄Π° ΡΠ΅ Π΄ΠΎΠ±ΠΈΠ΅ ΠΊΠΎΠ½ΠΊΡΠ΅ΡΠ΅Π½ ΠΎΠ΄Π³ΠΎΠ²ΠΎΡ Π΄Π° ΠΈΠ»ΠΈ Π½Π΅.
Π ΡΠΎΡΠΌΠ°Π»Π½Π°ΡΠ° Π²Π΅ΡΠΈΡΠΈΠΊΠ°ΡΠΈΡΠ° ΡΠ΅ ΠΊΠΎΡΠΈΡΡΠΈ, Π½Π° ΠΏΡΠΈΠΌΠ΅Ρ, Π²ΠΎ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠ²Π½ΠΈΡΠ΅ ΡΠΈΡΡΠ΅ΠΌΠΈ Π½Π° Windows ΠΊΠ΅ΡΠ½Π΅Π»ΠΎΡ ΠΈ Π΄ΡΠΎΠ½ΠΎΠ²ΠΈ Darpa, Π·Π° Π΄Π° ΡΠ΅ ΠΎΠ±Π΅Π·Π±Π΅Π΄ΠΈ ΠΌΠ°ΠΊΡΠΈΠΌΠ°Π»Π½ΠΎ Π½ΠΈΠ²ΠΎ Π½Π° Π·Π°ΡΡΠΈΡΠ°.
ΠΠ΅ ΠΊΠΎΡΠΈΡΡΠΈΠΌΠ΅ 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
Π’ΠΎΠ° Π·Π½Π°ΡΠΈ Π΄Π΅ΠΊΠ° Π½Π°Π²ΠΈΡΡΠΈΠ½Π° Π½Π΅ΠΌΠ° ΡΠ΅ΡΠ΅Π½ΠΈΡΠ°.
Π’Π°ΠΊΠ°, ΠΏΡΠΎΠ³ΡΠ°ΠΌΡΠΊΠΈ ΡΠ° Π΄ΠΎΠΊΠ°ΠΆΠ°Π²ΠΌΠ΅ Π½Π΅ΠΌΠΎΠΆΠ½ΠΎΡΡΠ° Π·Π° Π²ΠΊΡΡΡΡΠ²Π°ΡΠ΅ ΡΠΎ ΡΠ΅ΡΡΠΎΡΠ°Π΄Π΅Π½ Π²ΠΎΠ»ΠΊ Π±Π΅Π· Π·Π°Π³ΡΠ±ΠΈ Π·Π° Π·Π΅ΠΌΡΠΎΠ΄Π΅Π»Π΅ΡΠΎΡ.
ΠΠΊΠΎ ΠΏΡΠ±Π»ΠΈΠΊΠ°ΡΠ° ΡΠ° ΡΠΌΠ΅ΡΠ° ΠΎΠ²Π°Π° ΡΠ΅ΠΌΠ° ΠΈΠ½ΡΠ΅ΡΠ΅ΡΠ½Π°, ΡΠΎΠ³Π°Ρ Π²ΠΎ ΠΈΠ΄Π½ΠΈΡΠ΅ Π½Π°ΠΏΠΈΡΠΈ ΡΠ΅ Π²ΠΈ ΠΊΠ°ΠΆΠ°ΠΌ ΠΊΠ°ΠΊΠΎ Π΄Π° ΡΠ° ΠΏΡΠ΅ΡΠ²ΠΎΡΠΈΡΠ΅ ΠΎΠ±ΠΈΡΠ½Π°ΡΠ° ΠΏΡΠΎΠ³ΡΠ°ΠΌΠ° ΠΈΠ»ΠΈ ΡΡΠ½ΠΊΡΠΈΡΠ° Π²ΠΎ ΡΠ°Π²Π΅Π½ΠΊΠ° ΠΊΠΎΠΌΠΏΠ°ΡΠΈΠ±ΠΈΠ»Π½Π° ΡΠΎ ΡΠΎΡΠΌΠ°Π»Π½ΠΈ ΠΌΠ΅ΡΠΎΠ΄ΠΈ ΠΈ Π΄Π° ΡΠ° ΡΠ΅ΡΠΈΡΠ΅, ΡΠΎ ΡΡΠΎ ΡΠ΅ Π³ΠΈ ΠΎΡΠΊΡΠΈΠ΅ΡΠ΅ ΠΈ ΡΠΈΡΠ΅ Π»Π΅Π³ΠΈΡΠΈΠΌΠ½ΠΈ ΡΡΠ΅Π½Π°ΡΠΈΡΠ° ΠΈ ΡΠ°Π½Π»ΠΈΠ²ΠΎΡΡΠΈ. ΠΡΠ²ΠΎ, Π½Π° ΠΈΡΡΠ°ΡΠ° Π·Π°Π΄Π°ΡΠ°, Π½ΠΎ ΠΏΡΠ΅ΡΡΡΠ°Π²Π΅Π½Π° Π²ΠΎ ΡΠΎΡΠΌΠ° Π½Π° ΠΏΡΠΎΠ³ΡΠ°ΠΌΠ°, Π° ΠΏΠΎΡΠΎΠ° ΠΏΠΎΡΡΠ΅ΠΏΠ΅Π½ΠΎ ΡΠ΅ ΡΡΠ»ΠΎΠΆΠ½ΡΠ²Π° ΠΈ ΠΏΡΠ΅ΠΌΠΈΠ½ΡΠ²Π° Π½Π° Π°ΠΊΡΡΠ΅Π»Π½ΠΈ ΠΏΡΠΈΠΌΠ΅ΡΠΈ ΠΎΠ΄ ΡΠ²Π΅ΡΠΎΡ Π½Π° ΡΠ°Π·Π²ΠΎΡ Π½Π° ΡΠΎΡΡΠ²Π΅Ρ.
Π‘Π»Π΅Π΄Π½Π°ΡΠ° ΡΡΠ°ΡΠΈΡΠ° Π΅ Π²Π΅ΡΠ΅ ΠΏΠΎΠ΄Π³ΠΎΡΠ²Π΅Π½Π°:
ΠΠΎ Π½Π΅Π³ΠΎ ΡΠ΅ ΠΏΡΠ΅ΡΡΠ»Π°ΠΌ ΠΎΠ΄ ΡΠΎΡΠΌΠ°Π»Π½Π° ΠΏΡΠΎΠ²Π΅ΡΠΊΠ° Π½Π° ΠΏΡΠΎΠ±Π»Π΅ΠΌΠΈΡΠ΅ Π½Π° ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΈ ΠΈ ΠΎΠΏΠΈΡΡΠ²Π°ΠΌ
ΠΊΠ°ΠΊΠΎ ΠΌΠΎΠΆΠ΅ Π°Π²ΡΠΎΠΌΠ°ΡΡΠΊΠΈ Π΄Π° ΡΠ΅ ΠΏΡΠ΅ΡΠ²ΠΎΡΠ°Ρ Π²ΠΎ ΡΠΈΡΡΠ΅ΠΌΠΈ Π·Π° ΡΠΎΡΠΌΠ°Π»Π½ΠΈ ΠΏΡΠ°Π²ΠΈΠ»Π°.
ΠΠ·Π²ΠΎΡ: www.habr.com