á á¥á á áµá°á«ášáµ, á á áááášá¥ ášá©áµá« ááá ááá, áá°á á ášáášááá« áááµ á á á ááá³ á áá°ážááá, á¥á á á°ááá ááá á¥á ááᜠáá³ááᜠá¥á¥ášáµ á á.
ášá£ááµ ááá á ááµ áá³á á¥á°á£áá á¥á á°á©á ᣠáášá á¥á áááá áá° ááá áᶠááá»áá ášá«áŽá áááµá á¥ášáá«áá á¢
á ááááªá« áá áá°á á áášááá« áá á¥áá°áá á¥á ááá á¥áá°áá«áµááá á á áá© á¥ááá»ááá¢
áá°á á áášááá« á á¥áááá áá á ááµá áá®áá«á ááá á áááªáá á áá á áá áá áášááᥠáááµ ááá¢
áá ááááá¥á© ášáá á áá á£á ᪠á¥áá²áášá á¥á á°á ááá±á ááášááᥠá áµááá áá.
áá°á á áášááá« áµááá¶áœá áááááµ á¥á áááµáááµ á á£á ááááá ááááµ áá-áááá áá£á ááµáá¶áœ á¥á áµá
á°á¶áœ á áá®áá«á ááµá¥ á¥áá²á«áá ááá á áááá«ážáá á«ášááá£áá¢
á á áá³ááµ ááá³áᜠáá
ášááá»á áááá áᥠáá£á ášááá£á áá, ááá³á á 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
á á¥ááá± ááá áááµááᜠášáá áááµ áá.
áµááá á á áá á¬á áá á«á áªá³á« ášááá á»á á°á©á áá áá»áá ášááá»á áááá á áá®áá«á á ášááá ááá¢
á°á°á¥á³á¢áá¹ áá áá áááµ á áµá°á³áœ áá á«ááᵠᣠášáá« á ááá¥ááµ áá£á¥áᜠááµá¥ á ááµ á°á« áá®áá«á ááá á°áá£á ášáá°á á ááŽáᜠáá áá°ááµáá á¥á©áá³ á¥ááŽáµ á¥áá°áááá© á¥ááááá³áá ᣠá¥á ááá³áµ ᣠá áá á ááá±áá á áá ááá³ááœá á¥á á°ááááá¶áœá á«á³á«á ᢠá ááááªá« ᣠá á°áá³á³á á°áá£á áá ᣠáá á áá®áá«á ááá ááá§á ᣠá¥á ášáá« ááµ á ááµ ááµá¥áµá¥ á¥á ášá¶ááµáá áááµ ááá áá° áá á³á áá³ááᜠááá±á¢
ášááá¥áá áœáá á áµááµá ááá ááá¡-
á á¥á± ááµá¥ ášáœáá®áœá áá°á á áášááá« áá° áá®áá«áᜠá¥ážááá á¥á á¥ááá»áá
á¥ááŽáµ á¥áá±á áá° áá°á á á
áᜠáµáááµ á á«áµ-á°á ááášá á¥áá°ááœáá¢
ááá: hab.com