ืื™ืžื•ืช ืคื•ืจืžืœื™ ื‘ืืžืฆืขื•ืช ื”ื“ื•ื’ืžื” ืฉืœ ื‘ืขื™ื™ืช ื”ื–ืื‘, ื”ืขื–ื™ื ื•ื”ื›ืจื•ื‘

ืœื“ืขืชื™, ื‘ืžื’ื–ืจ ื”ืจื•ืกื™ืช ืฉืœ ื”ืื™ื ื˜ืจื ื˜, ื ื•ืฉื ื”ืื™ืžื•ืช ื”ืคื•ืจืžืœื™ ืื™ื ื• ืžื›ื•ืกื” ืžืกืคื™ืง, ื•ื‘ืขื™ืงืจ ื—ืกืจื•ืช ื“ื•ื’ืžืื•ืช ืคืฉื•ื˜ื•ืช ื•ื‘ืจื•ืจื•ืช.

ืืชืŸ ื“ื•ื’ืžื” ืžืžืงื•ืจ ื–ืจ, ื•ืื•ืกื™ืฃ ืคืชืจื•ืŸ ืžืฉืœื™ ืœื‘ืขื™ื” ื”ื™ื“ื•ืขื” ืฉืœ ื—ืฆื™ื™ืช ื–ืื‘, ืขื– ื•ื›ืจื•ื‘ ืœืฆื“ ื”ืฉื ื™ ืฉืœ ื”ื ื”ืจ.

ืื‘ืœ ืจืืฉื™ืช, ืืชืืจ ื‘ืงืฆืจื” ืžื”ื• ืื™ืžื•ืช ืคื•ืจืžืœื™ ื•ืžื“ื•ืข ื”ื•ื ื ื—ื•ืฅ.

ืื™ืžื•ืช ืคื•ืจืžืœื™ ืคื™ืจื•ืฉื• ื‘ื“ืจืš ื›ืœืœ ื‘ื“ื™ืงืช ืชื•ื›ื ื™ืช ืื• ืืœื’ื•ืจื™ืชื ืื—ื“ ื‘ืืžืฆืขื•ืช ืื—ืจ.

ื–ื” ื”ื›ืจื—ื™ ื›ื“ื™ ืœื”ื‘ื˜ื™ื— ืฉื”ืชื•ื›ื ื™ืช ืชืชื ื”ื’ ื›ืžืฆื•ืคื” ื•ื’ื ื›ื“ื™ ืœื”ื‘ื˜ื™ื— ืืช ืื‘ื˜ื—ืชื”.

ืื™ืžื•ืช ืคื•ืจืžืœื™ ื”ื•ื ื”ืืžืฆืขื™ ื”ื—ื–ืง ื‘ื™ื•ืชืจ ืœืื™ืชื•ืจ ื•ื‘ื™ื˜ื•ืœ ืคื’ื™ืขื•ื™ื•ืช: ื”ื•ื ืžืืคืฉืจ ืœืš ืœืžืฆื•ื ืืช ื›ืœ ื”ื—ื•ืจื™ื ื•ื”ื‘ืื’ื™ื ื”ืงื™ื™ืžื™ื ื‘ืชื•ื›ื ื™ืช, ืื• ืœื”ื•ื›ื™ื— ืฉื”ื ืœื ืงื™ื™ืžื™ื.
ืจืื•ื™ ืœืฆื™ื™ืŸ ืฉื‘ืžืงืจื™ื ืžืกื•ื™ืžื™ื ื–ื” ื‘ืœืชื™ ืืคืฉืจื™, ื›ืžื• ืœืžืฉืœ ื‘ื‘ืขื™ื” ืฉืœ 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

ืžืกืคืจ ื”ื•ื ืžืกืคืจ ื”ืฉืœื‘ื™ื ื”ื ื“ืจืฉื™ื ืœืคืชืจื•ืŸ. ื›ืœ ืฆืขื“ ืžื™ื™ืฆื’ ืืช ืžืฆื‘ ื”ื ื”ืจ, ื”ืกื™ืจื” ื•ื›ืœ ื”ื™ืฉื•ื™ื•ืช.

ืœืขืช ืขืชื”, ื‘ื•ื ื ื‘ื—ืจ ืื•ืชื• ื‘ืืงืจืื™ ื•ื‘ืฉื•ืœื™ื™ื, ื ื™ืงื— 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

ื”ื•ืกืคืช ืชื’ื•ื‘ื”