Fa'amaoniga aloaia e fa'aaoga ai le fa'ata'ita'iga o le luko, 'oti ma le fa'afitauli kapisi

I loʻu manatu, i le gagana Rusia-gagana o le Initaneti, o le autu o le faʻamaoniga aloaʻia e leʻo lava le ufiufi, ma e iai lava le leai o ni faʻataʻitaʻiga faigofie ma manino.

O le a ou tuʻuina atu se faʻataʻitaʻiga mai se punaoa mai fafo, ma faʻaopoopo laʻu lava fofo i le faʻafitauli lauiloa o le sopoia o se luko, se 'oti ma se kapisi i le isi itu o le vaitafe.

Ae muamua, o le a ou faʻamatala puupuu pe o le a le faʻamaoniga aloaia ma pe aisea e manaʻomia ai.

O le fa'amaoniga aloa'ia e masani lava o lona uiga o le siakiina o le tasi polokalame po'o le algorithm e fa'aoga ai le isi.

E mana'omia lenei mea ina ia mautinoa ai o le polokalame e amio e pei ona fa'amoemoeina ma ia mautinoa foi lona saogalemu.

O le faʻamaoniga aloaʻia o le auala sili lea ona malosi e suʻe ai ma faʻaumatia faʻafitauli: e faʻatagaina oe e suʻe uma pu ma pusi i totonu o se polokalama, pe faʻamaonia e le o iai.
E taua le maitauina i nisi tulaga e le mafai, e pei o le faʻafitauli o 8 masiofo ma le lautele o le laupapa o 1000 sikuea: e oʻo mai uma i le algorithmic complexity poʻo le faʻalavelave faʻalavelave.

Ae ui i lea, i soʻo se tulaga, o le a maua se tasi o tali e tolu: o le polokalama e saʻo, le saʻo, pe le mafai ona faʻatatauina le tali.

Afai e le mafai ona maua se tali, e masani ona mafai ona toe faʻaogaina vaega le manino o le polokalame, faʻaitiitia ai le lavelave algorithmic, ina ia maua ai se tali ioe pe leai.

Ma faʻaaogaina faʻamaoniga aloaia, mo se faʻataʻitaʻiga, i le Windows kernel ma Darpa drone operating system, e faʻamautinoa ai le maualuga maualuga o le puipuiga.

O le a matou faʻaogaina le Z3Prover, o se meafaigaluega sili ona mamana mo faʻataʻitaʻiga otometi e faʻamaonia ma foia faʻatusatusaga.

E le gata i lea, o le Z3 e foia faʻatusatusaga, ma e le filifilia a latou tau e faʻaaoga ai le malosi.
O lona uiga e mafai ona maua le tali, e oʻo lava i tulaga o loʻo i ai 10^100 tuʻufaʻatasiga o filifiliga faʻaoga.

Ae e na'o le luasefulu ma le lua fa'aupuga o le ituaiga Integer, ma e masani ona fa'afeiloa'i i le fa'atinoga.

Fa'afitauli e uiga i le 8 masiofo (Ave mai le Igilisi tusi lesona).

Fa'amaoniga aloaia e fa'aaoga ai le fa'ata'ita'iga o le luko, 'oti ma le fa'afitauli kapisi

# 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)

Faʻaauau le Z3, matou te maua le fofo:

[Q_5 = 1,
 Q_8 = 7,
 Q_3 = 8,
 Q_2 = 2,
 Q_6 = 3,
 Q_4 = 6,
 Q_7 = 5,
 Q_1 = 4]

O le faʻafitauli o le masiofo e faʻatusalia i se polokalame e faʻaogaina ai faʻamaopoopo a 8 masiofo ma faʻaalia le tali pe sasa e le tasi le isi.

Afai o le a tatou foia sea polokalame e faʻaaoga ai le faʻamaoniga aloaia, ona faʻatusatusa lea i le faʻafitauli, e naʻo le manaʻomia o le toe faia o se isi laasaga i le tulaga o le liua o le polokalame code i se faʻatusatusaga: e foliga mai e tutusa lelei ma tatou ( o le mea moni, pe a saʻo le tusiaina o le polokalame).

Toeitiiti lava o le mea lava e tasi o le a tupu i le tulaga o le suʻeina o faʻafitauli: naʻo le setiina o tulaga o galuega tatou te manaʻomia, mo se faʻataʻitaʻiga, le password admin, suia le puna poʻo le faʻapipiʻiina code i faʻatusatusaga e fetaui ma le faʻamaoniga, ona maua lea o se tali i le mea e mana'omia ona tu'uina atu fa'amaumauga e fai ma sao e 'ausia ai le fa'amoemoe.

I loʻu manatu, o le faʻafitauli e uiga i le luko, le 'oti ma le kapisi e sili atu ona manaia, talu ai o le fofoina ua manaʻomia ai le tele (7) laasaga.

Afai o le faʻafitauli o le masiofo e faʻatusatusa i le tulaga e mafai ai ona e ulu atu i se 'auʻaunaga e faʻaaoga ai se talosaga GET poʻo le POST, ona faʻaalia lea e le luko, 'oti ma kapisi se faʻataʻitaʻiga mai se vaega sili atu ona faigata ma lautele, lea e mafai ai ona ausia le sini. i le tele o talosaga.

E fa'atusa lea, mo se fa'ata'ita'iga, i se fa'ata'ita'iga e te mana'omia e su'e ai se tui SQL, tusi se faila i totonu, ona si'itia lea o au aia tatau ona maua lea o se fa'aupuga.

Tulaga o le faafitauli ma lona fofoE manaʻomia e le faifaatoʻaga le laʻuina o se luko, se 'oti ma kapisi i luga o le vaitafe. E iai le vaa a le faifaatoʻaga e na o le tasi le mea e mafai ona ofi ai, e ese mai i le faifaatoʻaga lava ia. E 'ai e le luko le 'oti ae 'ai e le 'oti le kapisi pe a tuua e le faifaato'aga e aunoa ma se tausiga.

O le fofo o le laasaga 4 e manaʻomia e le faifaatoʻaga ona toe ave le 'oti.
Se'i o tatou amata fo'ia fa'apolokalame.

Se'i o tatou fa'ailoa le faifa'ato'aga, luko, 'oti ma kapisi e 4 fesuiaiga e na'o le 0 po'o le 1 le tau. O le Zero o lona uiga o lo'o i le itu agavale, ma le tasi o lona uiga o lo'o i le itu taumatau.

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

Numera o le numera o laasaga e manaʻomia e foia ai. O laasaga taʻitasi e faʻatusalia ai le tulaga o le vaitafe, le vaʻa ma faʻalapotopotoga uma.

Mo le taimi nei, seʻi o tatou filifili faʻafuaseʻi ma faʻatasi ai ma se pito, ave le 10.

O fa'alapotopotoga ta'itasi o lo'o fa'atusalia i kopi e 10 - o lona taua lea i laasaga ta'itasi e 10.

Ia tatou seti nei tulaga mo le amataga ma le faaiuga.

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 ]

Ona matou setiina lea o tulaga e 'ai ai e le luko le 'oti, poʻo le 'oti e 'ai le kapisi, e pei o faʻalavelave i le faʻatusatusaga.
(I le i ai o se faifaatoʻaga, e le mafai ona osofaʻi)

# 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) ]

Ma le mea mulimuli, o le a tatou faʻamalamalamaina uma gaioiga e mafai e le faifaatoʻaga pe a sopoʻia iina poʻo tua.
E mafai ona ia ave se luko, se 'oti po o se kapisi ma ia, pe le ave se tasi, pe le folau i soo se mea.

Ioe, e leai se tasi e mafai ona laasia e aunoa ma se faifaatoaga.

O lenei mea o le a faʻaalia e le mea moni e faapea o tulaga taʻitasi mulimuli ane o le vaitafe, vaʻa ma faʻalapotopotoga e mafai ona ese mai le muamua i se auala faʻatapulaʻaina.

E le sili atu i le 2 bits, ma le tele o isi tapulaʻa, talu ai e mafai e le faifaatoʻaga ona naʻo le tasi le vaega i le taimi ma e le mafai ona tuʻu uma.

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) ]

Sei o tatou faia le fofo.

solve(Side + Start + Finish + Safe + Travel)

Ma tatou maua le tali!

Na maua e Z3 se seti faifaipea o setete e faʻamalieina tulaga uma.
O se ituaiga fa'ailoga fa'ailoga o avanoa-taimi.

Sei o tatou mafaufau po o le a le mea na tupu.

Matou te vaʻai i le iʻuga na sopoia e tagata uma, naʻo le taimi muamua na filifili ai le matou faifaatoʻaga e malolo, ma i le 2 laasaga muamua na te le aau i se mea.

Human_2 = 0
Human_3 = 0

O loʻo faʻaalia ai o le numera o setete na matou filifilia e sili atu, ma 8 o le a lava.

I lo matou tulaga, na faia e le faifaatoʻaga lenei mea: amata, malolo, malolo, sopoia le 'oti, sopo i tua, sopoia le kapisi, toe foʻi ma le 'oti, sopoia le luko, toe foʻi naʻo ia, toe tuʻuina atu le 'oti.

Ae i le faaiuga na foia le faafitauli.

#Старт.
 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

Ia tatou taumafai la e sui tulaga ma faamaonia e leai ni fofo.

Ina ia faia lenei mea, o le a tatou avatu a tatou luko herbivory, ma o le a ia manao e ai kapisi.
E mafai ona faʻatusatusa lenei mea i le mataupu lea o loʻo i ai la matou sini o le faʻamautuina o le talosaga ma e tatau ona matou mautinoa e leai ni faʻalavelave.

 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) ]

Na tuuina mai e Z3 ia i matou le tali lea:

 no solution

O lona uiga e matua leai lava ni fofo.

O le mea lea, na matou faʻamaonia faʻamaonia le le mafai ona sopoʻia ma se luko omnivorous e aunoa ma se gau mo le faifaatoʻaga.

Afai e fiafia le au maimoa i lenei autu, ona ou taʻuina atu lea i tala o lumanaʻi pe faʻafefea ona liliu se polokalame masani poʻo se galuega i se faʻatusatusaga e fetaui ma metotia aloaʻia, ma foia, ma faʻaalia uma faʻaaliga talafeagai ma faʻafitauli. Muamua, i luga o le galuega lava e tasi, ae o loʻo tuʻuina atu i le tulaga o se polokalame, ona faʻasolosolo malie ai lea ma faʻasolosolo atu i faʻataʻitaʻiga o loʻo i ai nei mai le lalolagi o le atinaʻeina o polokalama.

Ua uma ona saunia le isi mataupu:
Fausiaina o se faiga fa'amaonia aloaia mai le sasa: Tusia o se VM fa'atusa ile PHP ma le Python

I totonu ou te alu ese mai le faamaoniga aloaia o faafitauli i polokalame, ma faamatala
e fa'afefea ona fa'aliliuina i faiga fa'atulafonoina otometi.

puna: www.habr.com

Faaopoopo i ai se faamatalaga