ΠΠ° ΠΌΠΎΠΉ Π²Π·Π³Π»ΡΠ΄, Π² ΡΡΡΡΠΊΠΎΡΠ·ΡΡΠ½ΠΎΠΌ ΡΠ΅ΠΊΡΠΎΡΠ΅ ΠΈΠ½ΡΠ΅ΡΠ½Π΅ΡΠ° ΡΠ΅ΠΌΠ°ΡΠΈΠΊΠ° ΡΠΎΡΠΌΠ°Π»ΡΠ½ΠΎΠΉ Π²Π΅ΡΠΈΡΠΈΠΊΠ°ΡΠΈΠΈ ΠΎΡΠ²Π΅ΡΠ΅Π½Π° Π½Π΅Π΄ΠΎΡΡΠ°ΡΠΎΡΠ½ΠΎ, ΠΈ ΠΎΡΠΎΠ±Π΅Π½Π½ΠΎ Π½Π΅ Ρ Π²Π°ΡΠ°Π΅Ρ ΠΏΡΠΎΡΡΡΡ ΠΈ Π½Π°Π³Π»ΡΠ΄Π½ΡΡ ΠΏΡΠΈΠΌΠ΅ΡΠΎΠ².
Π― ΠΏΡΠΈΠ²Π΅Π΄Ρ ΡΠ°ΠΊΠΎΠΉ ΠΏΡΠΈΠΌΠ΅Ρ ΠΈΠ· Π·Π°ΡΡΠ±Π΅ΠΆΠ½ΠΎΠ³ΠΎ ΠΈΡΡΠΎΡΠ½ΠΈΠΊΠ°, ΠΈ Π΄ΠΎΠΏΠΎΠ»Π½Ρ ΡΠΎΠ±ΡΡΠ²Π΅Π½Π½ΡΠΌ ΡΠ΅ΡΠ΅Π½ΠΈΠ΅ΠΌ ΠΈΠ·Π²Π΅ΡΡΠ½ΠΎΠΉ Π·Π°Π΄Π°ΡΠΈ ΠΎ ΠΏΠ΅ΡΠ΅ΠΏΡΠ°Π²Π΅ Π²ΠΎΠ»ΠΊΠ°, ΠΊΠΎΠ·Ρ ΠΈ ΠΊΠ°ΠΏΡΡΡΡ Π½Π° Π΄ΡΡΠ³ΡΡ ΡΡΠΎΡΠΎΠ½Ρ ΡΠ΅ΠΊΠΈ.
ΠΠΎ Π²Π½Π°ΡΠ°Π»Π΅ Π²ΠΊΡΠ°ΡΡΠ΅ ΠΎΠΏΠΈΡΡ, ΡΡΠΎ ΠΈΠ· ΡΠ΅Π±Ρ ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»ΡΠ΅Ρ ΡΠΎΡΠΌΠ°Π»ΡΠ½Π°Ρ Π²Π΅ΡΠΈΡΠΈΠΊΠ°ΡΠΈΡ ΠΈ Π·Π°ΡΠ΅ΠΌ ΠΎΠ½Π° Π½ΡΠΆΠ½Π°.
ΠΠΎΠ΄ ΡΠΎΡΠΌΠ°Π»ΡΠ½ΠΎΠΉ Π²Π΅ΡΠΈΡΠΈΠΊΠ°ΡΠΈΠ΅ΠΉ ΠΎΠ±ΡΡΠ½ΠΎ ΠΏΠΎΠ½ΠΈΠΌΠ°ΡΡ ΠΏΡΠΎΠ²Π΅ΡΠΊΡ ΠΎΠ΄Π½ΠΎΠΉ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ Π»ΠΈΠ±ΠΎ Π°Π»Π³ΠΎΡΠΈΡΠΌΠ° Ρ ΠΏΠΎΠΌΠΎΡΡΡ Π΄ΡΡΠ³ΠΎΠΉ.
ΠΡΠΎ Π½ΡΠΆΠ½ΠΎ Π΄Π»Ρ ΡΠΎΠ³ΠΎ, ΡΡΠΎΠ±Ρ ΡΠ΄ΠΎΡΡΠΎΠ²Π΅ΡΠΈΡΡΡΡ, ΡΡΠΎ ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΡΠ΅Ρ ΠΎΠΆΠΈΠ΄Π°Π΅ΠΌΠΎΠΌΡ, Π° ΡΠ°ΠΊΠΆΠ΅ ΠΎΠ±Π΅ΡΠΏΠ΅ΡΠΈΡΡ Π΅Ρ Π±Π΅Π·ΠΎΠΏΠ°ΡΠ½ΠΎΡΡΡ.
Π€ΠΎΡΠΌΠ°Π»ΡΠ½Π°Ρ Π²Π΅ΡΠΈΡΠΈΠΊΠ°ΡΠΈΡ ΡΠ²Π»ΡΠ΅ΡΡΡ ΡΠ°ΠΌΡΠΌ ΠΌΠΎΡΠ½ΡΠΌ ΡΡΠ΅Π΄ΡΡΠ²ΠΎΠΌ ΠΏΠΎΠΈΡΠΊΠ° ΠΈ ΡΡΡΡΠ°Π½Π΅Π½ΠΈΡ ΡΡΠ·Π²ΠΈΠΌΠΎΡΡΠ΅ΠΉ: ΠΎΠ½Π° ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ Π½Π°ΠΉΡΠΈ Π²ΡΠ΅ ΡΡΡΠ΅ΡΡΠ²ΡΡΡΠΈΠ΅ Π΄ΡΡΡ ΠΈ Π±Π°Π³ΠΈ Π² ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ΅, Π»ΠΈΠ±ΠΎ ΠΆΠ΅ Π΄ΠΎΠΊΠ°Π·Π°ΡΡ, ΡΡΠΎ ΠΈΡ
Π½Π΅Ρ.
Π‘ΡΠΎΠΈΡ Π·Π°ΠΌΠ΅ΡΠΈΡΡ, ΡΡΠΎ Π² Π½Π΅ΠΊΠΎΡΠΎΡΡΡ
ΡΠ»ΡΡΠ°ΡΡ
ΡΡΠΎ Π±ΡΠ²Π°Π΅Ρ Π½Π΅Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, ΠΊΠ°ΠΊ Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, Π² Π·Π°Π΄Π°ΡΠ΅ ΠΎ 8 ΡΠ΅ΡΠ·ΡΡ
Ρ ΡΠΈΡΠΈΠ½ΠΎΠΉ Π΄ΠΎΡΠΊΠΈ 1000 ΠΊΠ»Π΅ΡΠΎΠΊ: Π²ΡΡ ΡΠΏΠΈΡΠ°Π΅ΡΡΡ Π² Π°Π»Π³ΠΎΡΠΈΡΠΌΠΈΡΠ΅ΡΠΊΡΡ ΡΠ»ΠΎΠΆΠ½ΠΎΡΡΡ Π»ΠΈΠ±ΠΎ ΠΏΡΠΎΠ±Π»Π΅ΠΌΡ ΠΎΡΡΠ°Π½ΠΎΠ²ΠΊΠΈ.
ΠΠ΄Π½Π°ΠΊΠΎ Π² Π»ΡΠ±ΠΎΠΌ ΡΠ»ΡΡΠ°Π΅ Π±ΡΠ΄Π΅Ρ ΠΏΠΎΠ»ΡΡΠ΅Π½ ΠΎΠ΄ΠΈΠ½ ΠΈΠ· ΡΡΡΡ ΠΎΡΠ²Π΅ΡΠΎΠ²: ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ° ΠΊΠΎΡΡΠ΅ΠΊΡΠ½Π°, Π½Π΅ΠΊΠΎΡΡΠ΅ΠΊΡΠ½Π°, ΠΈΠ»ΠΈ ΠΆΠ΅ β Π²ΡΡΠΈΡΠ»ΠΈΡΡ ΠΎΡΠ²Π΅Ρ Π½Π΅ ΡΠ΄Π°Π»ΠΎΡΡ.
Π ΡΠ»ΡΡΠ°Π΅ Π½Π΅Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΠΈ Π½Π°Ρ ΠΎΠΆΠ΄Π΅Π½ΠΈΡ ΠΎΡΠ²Π΅ΡΠ°, Π·Π°ΡΠ°ΡΡΡΡ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠ΅ΡΠ΅ΡΠ°Π±ΠΎΡΠ°ΡΡ Π½Π΅ΡΡΠ½ΡΠ΅ ΠΌΠ΅ΡΡΠ° ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ, ΡΠΌΠ΅Π½ΡΡΠΈΠ² ΠΈΡ Π°Π»Π³ΠΎΡΠΈΡΠΌΠΈΡΠ΅ΡΠΊΡΡ ΡΠ»ΠΎΠΆΠ½ΠΎΡΡΡ, Π΄Π»Ρ ΡΠΎΠ³ΠΎ ΡΡΠΎΠ±Ρ ΠΏΠΎΠ»ΡΡΠΈΡΡ ΠΊΠΎΠ½ΠΊΡΠ΅ΡΠ½ΡΠΉ ΠΎΡΠ²Π΅Ρ Π΄Π° Π»ΠΈΠ±ΠΎ Π½Π΅Ρ.
Π ΠΏΡΠΈΠΌΠ΅Π½ΡΠ΅ΡΡΡ ΡΠΎΡΠΌΠ°Π»ΡΠ½Π°Ρ Π²Π΅ΡΠΈΡΠΈΠΊΠ°ΡΠΈΡ, Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, Π² ΡΠ΄ΡΠ΅ Windows ΠΈ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΎΠ½Π½ΡΡ ΡΠΈΡΡΠ΅ΠΌΠ°Ρ Π±Π΅ΡΠΏΠΈΠ»ΠΎΡΠ½ΠΈΠΊΠΎΠ² Darpa, Π΄Π»Ρ ΠΎΠ±Π΅ΡΠΏΠ΅ΡΠ΅Π½ΠΈΡ ΠΌΠ°ΠΊΡΠΈΠΌΠ°Π»ΡΠ½ΠΎΠ³ΠΎ ΡΡΠΎΠ²Π½Ρ Π·Π°ΡΠΈΡΡ.
ΠΡ Π±ΡΠ΄Π΅ΠΌ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ Z3Prover, ΠΎΡΠ΅Π½Ρ ΠΌΠΎΡΠ½ΡΠΉ ΠΈΠ½ΡΡΡΡΠΌΠ΅Π½Ρ Π΄Π»Ρ Π°Π²ΡΠΎΠΌΠ°ΡΠΈΠ·ΠΈΡΠΎΠ²Π°Π½Π½ΠΎΠ³ΠΎ Π΄ΠΎΠΊΠ°Π·Π°ΡΠ΅Π»ΡΡΡΠ²Π° ΡΠ΅ΠΎΡΠ΅ΠΌ ΠΈ ΡΠ΅ΡΠ΅Π½ΠΈΡ ΡΡΠ°Π²Π½Π΅Π½ΠΈΡ.
ΠΡΠΈΡΡΠΌ Z3 ΠΈΠΌΠ΅Π½Π½ΠΎ ΡΠ΅ΡΠ°Π΅Ρ ΡΡΠ°Π²Π½Π΅Π½ΠΈΡ, Π° Π½Π΅ ΠΏΠΎΠ΄Π±ΠΈΡΠ°Π΅Ρ ΠΈΡ
Π·Π½Π°ΡΠ΅Π½ΠΈΡ Π³ΡΡΠ±ΡΠΌ Π±ΡΡΡΡΠΎΡΡΠΎΠΌ.
ΠΡΠΎ ΠΎΠ·Π½Π°ΡΠ°Π΅Ρ, ΡΡΠΎ ΠΎΠ½ ΡΠΏΠΎΡΠΎΠ±Π΅Π½ Π½Π°Ρ
ΠΎΠ΄ΠΈΡΡ ΠΎΡΠ²Π΅Ρ, Π΄Π°ΠΆΠ΅ Π² ΡΠ»ΡΡΠ°ΡΡ
ΠΊΠΎΠ³Π΄Π° ΠΊΠΎΠΌΠ±ΠΈΠ½Π°ΡΠΈΠΉ Π²Ρ
ΠΎΠ΄Π½ΡΡ
Π²Π°ΡΠΈΠ°Π½ΡΠΎΠ² ΠΈ 10^100.
Π Π²Π΅Π΄Ρ ΡΡΠΎ Π²ΡΠ΅Π³ΠΎ Π»ΠΈΡΡ ΠΎΠΊΠΎΠ»ΠΎ Π΄ΡΠΆΠΈΠ½Ρ Π²Ρ ΠΎΠ΄Π½ΡΡ Π°ΡΠ³ΡΠΌΠ΅Π½ΡΠΎΠ² ΡΠΈΠΏΠ° Integer, ΠΈ ΠΏΠΎΠ΄ΠΎΠ±Π½ΠΎΠ΅ Π·Π°ΡΠ°ΡΡΡΡ Π²ΡΡΡΠ΅ΡΠ°Π΅ΡΡΡ Π½Π° ΠΏΡΠ°ΠΊΡΠΈΠΊΠ΅.
ΠΠ°Π΄Π°ΡΠ° ΠΎ 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
Num β ΡΡΠΎ ΡΠΈΡΠ»ΠΎ ΡΠ°Π³ΠΎΠ² Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΡΡ Π΄Π»Ρ ΡΠ΅ΡΠ΅Π½ΠΈΡ. ΠΠ°ΠΆΠ΄ΡΠΉ ΡΠ°Π³ ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»ΡΠ΅Ρ ΡΠΎΠ±ΠΎΠΉ ΡΠΎΡΡΠΎΡΠ½ΠΈΠ΅ ΡΠ΅ΡΠΊΠΈ, Π»ΠΎΠ΄ΠΊΠΈ ΠΈ Π²ΡΠ΅Ρ ΡΡΡΠ½ΠΎΡΡΠ΅ΠΉ.
ΠΠΎΠΊΠ° ΡΡΠΎ Π²ΡΠ±Π΅ΡΠ΅ΠΌ Π΅Π³ΠΎ Π½Π°ΡΠ³Π°Π΄ ΠΈ Ρ Π·Π°ΠΏΠ°ΡΠΎΠΌ, Π²ΠΎΠ·ΡΠΌΡΠΌ 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
ΠΠ½ ΠΎΠ·Π½Π°ΡΠ°Π΅Ρ, ΡΡΠΎ ΡΠ΅ΡΠ΅Π½ΠΈΠΉ Π΄Π΅ΠΉΡΡΠ²ΠΈΡΠ΅Π»ΡΠ½ΠΎ Π½Π΅Ρ.
Π’Π°ΠΊΠΈΠΌ ΠΎΠ±ΡΠ°Π·ΠΎΠΌ ΠΌΡ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ½ΡΠΌ ΡΠΏΠΎΡΠΎΠ±ΠΎΠΌ Π΄ΠΎΠΊΠ°Π·Π°Π»ΠΈ Π½Π΅Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΡ ΠΏΠ΅ΡΠ΅ΠΏΡΠ°Π²Ρ ΡΠΎ Π²ΡΠ΅ΡΠ΄Π½ΡΠΌ Π²ΠΎΠ»ΠΊΠΎΠΌ, Π±Π΅Π· ΠΏΠΎΡΠ΅ΡΡ Π΄Π»Ρ ΡΠ΅ΡΠΌΠ΅ΡΠ°.
ΠΡΠ»ΠΈ Π°ΡΠ΄ΠΈΡΠΎΡΠΈΡ ΡΠΎΡΡΡΡ ΡΡΡ ΡΠ΅ΠΌΠ°ΡΠΈΠΊΡ ΠΈΠ½ΡΠ΅ΡΠ΅ΡΠ½ΠΎΠΉ, ΡΠΎ Π² Π΄Π°Π»ΡΠ½Π΅ΠΉΡΠΈΡ ΡΡΠ°ΡΡΡΡ Ρ ΡΠ°ΡΡΠΊΠ°ΠΆΡ, ΠΊΠ°ΠΊ ΠΏΡΠ΅Π²ΡΠ°ΡΠΈΡΡ ΠΎΠ±ΡΡΠ½ΡΡ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ ΠΈΠ»ΠΈ ΡΡΠ½ΠΊΡΠΈΡ Π² ΡΠΎΠ²ΠΌΠ΅ΡΡΠΈΠΌΠΎΠ΅ Ρ ΡΠΎΡΠΌΠ°Π»ΡΠ½ΡΠΌΠΈ ΠΌΠ΅ΡΠΎΠ΄Π°ΠΌΠΈ ΡΡΠ°Π²Π½Π΅Π½ΠΈΠ΅, ΠΈ ΡΠ΅ΡΠΈΡΡ Π΅Π³ΠΎ, ΠΎΠ±Π½Π°ΡΡΠΆΠΈΠ² ΡΠ΅ΠΌ ΡΠ°ΠΌΡΠΌ ΠΊΠ°ΠΊ Π²ΡΠ΅ Π»Π΅Π³ΠΈΡΠΈΠΌΠ½ΡΠ΅ ΡΡΠ΅Π½Π°ΡΠΈΠΈ, ΡΠ°ΠΊ ΠΈ ΡΡΠ·Π²ΠΈΠΌΠΎΡΡΠΈ. Π‘Π½Π°ΡΠ°Π»Π° Π½Π° ΡΡΠΎΠΉ ΠΆΠ΅ Π·Π°Π΄Π°ΡΠ΅, Π½ΠΎ ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»Π΅Π½Π½ΠΎΠΉ ΡΠΆΠ΅ Π² Π²ΠΈΠ΄Π΅ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ, Π° Π·Π°ΡΠ΅ΠΌ ΠΏΠΎΡΡΠ΅ΠΏΠ΅Π½Π½ΠΎ ΡΡΠ»ΠΎΠΆΠ½ΡΡ ΠΈ ΠΏΠ΅ΡΠ΅Ρ ΠΎΠ΄Ρ ΠΊ Π°ΠΊΡΡΠ°Π»ΡΠ½ΡΠΌ ΠΏΡΠΈΠΌΠ΅ΡΠ°ΠΌ ΠΈΠ· ΠΌΠΈΡΠ° ΡΠ°Π·ΡΠ°Π±ΠΎΡΠΊΠΈ ΠΠ.
Π‘Π»Π΅Π΄ΡΡΡΠ°Ρ ΡΡΠ°ΡΡΡ ΡΠΆΠ΅ Π³ΠΎΡΠΎΠ²Π°:
Π Π½Π΅ΠΉ Ρ ΠΏΠ΅ΡΠ΅Ρ
ΠΎΠΆΡ ΠΎΡ ΡΠΎΡΠΌΠ°Π»ΡΠ½ΠΎΠΉ Π²Π΅ΡΠΈΡΠΈΠΊΠ°ΡΠΈΠΈ Π·Π°Π΄Π°Ρ, ΠΊ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ°ΠΌ, ΠΈ ΠΎΠΏΠΈΡΡΠ²Π°Ρ,
ΠΊΠ°ΠΊΠΈΠΌ ΠΎΠ±ΡΠ°Π·ΠΎΠΌ ΠΌΠΎΠΆΠ½ΠΎ ΠΊΠΎΠ½Π²Π΅ΡΡΠΈΡΠΎΠ²Π°ΡΡ ΠΈΡ
Π² ΡΠΈΡΡΠ΅ΠΌΡ ΡΠΎΡΠΌΠ°Π»ΡΠ½ΡΡ
ΠΏΡΠ°Π²ΠΈΠ» Π°Π²ΡΠΎΠΌΠ°ΡΠΈΡΠ΅ΡΠΊΠΈ.
ΠΡΡΠΎΡΠ½ΠΈΠΊ: habr.com