ืืืขืชื, ืืืืืจ ืืจืืกืืช ืฉื ืืืื ืืจื ื, ื ืืฉื ืืืืืืช ืืคืืจืืื ืืื ื ืืืืกื ืืกืคืืง, ืืืขืืงืจ ืืกืจืืช ืืืืืืืช ืคืฉืืืืช ืืืจืืจืืช.
ืืชื ืืืืื ืืืงืืจ ืืจ, ืืืืกืืฃ ืคืชืจืื ืืฉืื ืืืขืื ืืืืืขื ืฉื ืืฆืืืช ืืื, ืขื ืืืจืื ืืฆื ืืฉื ื ืฉื ืื ืืจ.
ืืื ืจืืฉืืช, ืืชืืจ ืืงืฆืจื ืืื ืืืืืช ืคืืจืืื ืืืืืข ืืื ื ืืืฅ.
ืืืืืช ืคืืจืืื ืคืืจืืฉื ืืืจื ืืื ืืืืงืช ืชืืื ืืช ืื ืืืืืจืืชื ืืื ืืืืฆืขืืช ืืืจ.
ืื ืืืจืื ืืื ืืืืืื ืฉืืชืืื ืืช ืชืชื ืื ืืืฆืืคื ืืื ืืื ืืืืืื ืืช ืืืืืชื.
ืืืืืช ืคืืจืืื ืืื ืืืืฆืขื ืืืืง ืืืืชืจ ืืืืชืืจ ืืืืืื ืคืืืขืืืืช: ืืื ืืืคืฉืจ ืื ืืืฆืื ืืช ืื ืืืืจืื ืืืืืืื ืืงืืืืื ืืชืืื ืืช, ืื ืืืืืื ืฉืื ืื ืงืืืืื.
ืจืืื ืืฆืืื ืฉืืืงืจืื ืืกืืืืื ืื ืืืชื ืืคืฉืจื, ืืื ืืืฉื ืืืขืื ืฉื 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
ืื ืืืืจ ืฉืืืืช ืืื ืคืชืจืื ืืช.
ืื, ืืืืื ื ืืืืคื ืชืืื ืืชื ืืช ืืืกืจ ืืืคืฉืจืืช ืืืฆืืช ืขื ืืื ืืืื ืื ืืื ืืคืกืืื ืขืืืจ ืืืงืืื.
ืื ืืงืื ืืืฆื ืืช ืื ืืฉื ืืื ืืขื ืืื, ืื ืืืืืจืื ืืืืื ืื ื ืืืื ืื ืืื ืืืคืื ืชืืื ืืช ืื ืคืื ืงืฆืื ืจืืืื ืืืฉืืืื ืืชืืืืช ืฉืืืืช ืคืืจืืืืืช, ืืืคืชืืจ ืืืชื, ืืืื ืืืฉืืฃ ืืช ืื ืืชืจืืืฉืื ืืืืืืืืืื ืืื ืืช ืืคืืืขืืืืช. ืจืืฉืืช, ืขื ืืืชื ืืฉืืื, ืื ืืืฆืืช ืืฆืืจืช ืชืืื ืืช, ืืืืืจ ืืื ืืกืืืช ืืืชื ืืืืจืื ืืขืืืจืช ืืืืืืืืช ืขืืื ืืืช ืืขืืื ืคืืชืื ืืชืืื ื.
ืืืืืจ ืืื ืืืจ ืืืื:
ืื ืื ื ืขืืืจ ืืืืืืช ืคืืจืืื ืฉื ืืขืืืช ืืชืืื ืืืช, ืืืชืืจ
ืืืฆื ื ืืชื ืืืืืจ ืืืชื ืืืขืจืืืช ืืืืื ืคืืจืืืืืช ืืืืคื ืืืืืืื.
ืืงืืจ: www.habr.com