Te hanga i tetahi punaha manatoko okawa mai i te wahanga. Wāhanga 1: Pūāhua Miihini Mariko i roto i te PHP me te Python

Ko te manatoko okawa ko te manatoko o tetahi papatono, algorithm ranei ma te whakamahi i tetahi atu.

Koinei tetahi o nga tikanga tino kaha e taea ai e koe te kimi whakaraeraetanga katoa i roto i tetahi kaupapa, ka whakamatau ranei kaore i te noho.

Ka kitea te whakamaaramatanga mo te manatoko okawa i te tauira o te whakaoti rapanga o Wolf, Goat, and Cabbage i roto i taku tuhinga o mua.

I roto i tenei tuhinga ka neke ahau mai i te manatoko okawa o nga raru ki nga kaupapa me te whakaahua me pehea
me pehea te huri aunoa ki nga punaha ture okawa.

Ki te mahi i tenei, i tuhia e ahau taku ake tairitenga o te miihini mariko, ma te whakamahi i nga tikanga tohu.

Ka wetewete i te waehere hotaka, ka whakamaoritia ki te punaha wharite (SMT), ka taea te whakaoti ma te hotaka.

I te mea ko nga korero mo nga tatauranga tohu e whakaatuhia ana i runga i te Ipurangi, engari he iti noa.
Ka whakaahua poto ahau he aha tena.

Ko te tatauranga tohu he huarahi ki te mahi i te wa kotahi i te hotaka i runga i te whānuitanga o nga raraunga me te taputapu matua mo te manatoko o te hotaka.

Hei tauira, ka taea e tatou te whakarite tikanga whakauru ka taea e te tohenga tuatahi te tango i nga uara pai, te tuarua kino, te tuatoru kore, me te tohenga putanga, hei tauira, 42.

Ko nga tatauranga tohu i roto i te oma kotahi ka whakahoki mai ki a tatou mehemea ka taea e tatou te whiwhi i te hua e hiahiatia ana me te tauira o te huinga o aua tawhā whakauru. He tohu ranei kaore he tawhā penei.

I tua atu, ka taea e taatau te whakarite i nga tautohetohe whakauru ki nga mea katoa ka taea, ka kowhiria nga mea whakaputa anake, hei tauira, te kupuhipa kaiwhakahaere.

I tenei keehi, ka kitea e matou nga whakaraeraetanga katoa o te papatono, ka whiwhi tohu ranei kei te haumaru te kupuhipa a te kaiwhakahaere.

Ka taea te tohu ko te mahinga puāwaitanga o te kaupapa me nga raraunga whakauru motuhake he keehi motuhake mo te mahi tohu.

Na reira, ka taea hoki e taku ahua VM te mahi i roto i te aratau tauira o te miihini mariko paerewa.

I roto i nga korero ki te tuhinga o mua ka kitea e tetahi te whakahee tika mo te manatoko okawa me te korerorero mo ona ngoikoretanga.

Ko nga raruraru matua ko:

  1. Pahū pahūtanga, i te mea ko te whakaū ōkawa ka heke ki te P=NP
  2. Ko te tukatuka waea ki te punaha konae, whatunga me etahi atu rokiroki o waho he uaua ake te manatoko
  3. Nga pepeha i roto i nga korero, i te wa i kii ai te kaihoko me te kaihōtaka i tetahi mea, engari kaore i tino whakaahuahia i roto i te waahanga hangarau.

Ko te mutunga, ka manatokohia te hotaka me te u ki nga whakaritenga, engari ka mahia he mea rereke rawa atu i nga mea i tumanakohia e nga kaihanga.

I te mea i roto i tenei tuhinga kei te tino whakaaro ahau ki te whakamahi i te manatokotanga okawa i roto i nga mahi, kaore au e paopao i taku mahunga ki te pakitara mo tenei wa, ka whiriwhiria e au he punaha he iti noa te uaua o te algorithmic me te maha o nga waea o waho.

I te mea ko nga kirimana atamai e tino pai ana ki enei whakaritenga, ka taka te whiringa ki runga i nga kirimana RIDE mai i te papaaa Waves: kaore ano a Turing i oti, a, he iti noa to raatau uaua.

Engari ka whakaarohia e maatau anake mai i te taha hangarau.

I tua atu i nga mea katoa, ko te manatokotanga okawa ka tino hiahiatia mo nga kirimana katoa: ko te nuinga o te waa kaore e taea te whakatika i te hapa kirimana i muri i tana whakarewatanga.
A ko te utu mo enei hapa he nui rawa atu, na te mea he nui nga moni kei te rongoa i runga i nga kirimana atamai.

Ko taku miihini mariko tohu kua tuhia ki te PHP me te Python, me te whakamahi i te Z3Prover mai i Microsoft Research hei whakaoti i nga tauira SMT ka puta.

I tona uho ko te rapu maha-tauwhitinga kaha, e
ka taea e koe te kimi otinga, whakaraeraetanga ranei, ahakoa he maha nga whakawhitinga.
Ahakoa te Mythril, Ko tetahi o nga anga tohu tino kaha mo te rapu whakaraeraetanga Ethereum, i taapiri noa tenei kaha i etahi marama kua hipa.

Engari he mea tika kia mohio ko nga kirimana ether he uaua ake ka oti a Turing.

Ka whakamaoritia e PHP te waehere puna o te kirimana atamai RIDE ki roto i te tuhinga python, ka whakaatuhia te kaupapa hei punaha Z3 SMT-hototahi o nga kawanatanga kirimana me nga tikanga mo o raatau whakawhitinga:

Te hanga i tetahi punaha manatoko okawa mai i te wahanga. Wāhanga 1: Pūāhua Miihini Mariko i roto i te PHP me te Python

Inaianei ka whakamarama au i nga mea e tupu ana i roto.

Engari tuatahi, he kupu torutoru mo te reo kirimana atamai RIDE.

He reo hootaka mahi me te whakaputa korero he mangere ma te hoahoa.
Ka rere mokemoke a RIDE i roto i te poraka ka taea te tiki me te tuhi korero mai i te rokiroki e hono ana ki te putea a te kaiwhakamahi.

Ka taea e koe te taapiri i tetahi kirimana RIDE ki ia putea, a ko te hua o te mahi ka TIKA, he HAPA anake.

Ko te tikanga o te TRUE ka whakaaetia e te kirimana atamai te tauwhitinga, ko te FALSE te tikanga ka aukati.
He tauira ngawari: ka taea e te tuhinga te aukati i te whakawhiti mena he iti ake te toenga putea i te 100.

Hei tauira, ka tangohia e ahau te Wolf, Goat, me te Cabbage, engari kua whakaatuhia i roto i te ahua o te kirimana atamai.

Kaore e taea e te kaiwhakamahi te tango moni mai i te putea i tukuna ai te kirimana kia tukuna ra ano e ia nga tangata katoa ki tera taha.

#Извлекаем положение всех объектов из блокчейна
let contract = tx.sender
let human= extract(getInteger(contract,"human"))
let wolf= extract(getInteger(contract,"wolf"))
let goat= extract(getInteger(contract,"goat"))
let cabbage= extract(getInteger(contract,"cabbage"))

#Это так называемая дата-транзакция, в которой пользователь присылает новые 4 переменные.
#Контракт разрешит её только в случае если все объекты останутся в сохранности.
match tx {
case t:DataTransaction =>
   #Извлекаем будущее положение всех объектов из транзакции
   let newHuman= extract(getInteger(t.data,"human")) 
   let newWolf= extract(getInteger(t.data,"wolf"))
   let newGoat= extract(getInteger(t.data,"goat"))
   let newCabbage= extract(getInteger(t.data,"cabbage"))
   
   #0 обозначает, что объект на левом берегу, а 1 что на правом
   let humanSide= human == 0 || human == 1
   let wolfSide= wolf == 0 || wolf == 1
   let goatSide= goat == 0 || goat == 1
   let cabbageSide= cabbage == 0 || cabbage == 1
   let side= humanSide && wolfSide && goatSide && cabbageSide

   #Будут разрешены только те транзакции, где с козой никого нет в отсутствии фермера.
   let safeAlone= newGoat != newWolf && newGoat != newCabbage
   let safe= safeAlone || newGoat == newHuman
   let humanTravel= human != newHuman 

   #Способы путешествия фермера туда и обратно, с кем-то либо в одиночку.
   let t1= humanTravel && newWolf == wolf + 1 && newGoat == goat && newCabbage == cabbage 
   let t2= humanTravel && newWolf == wolf && newGoat == goat + 1 && newCabbage == cabbage
   let t3= humanTravel && newWolf == wolf && newGoat == goat && newCabbage == cabbage + 1
   let t4= humanTravel && newWolf == wolf - 1 && newGoat == goat && newCabbage == cabbage
   let t5= humanTravel && newWolf == wolf && newGoat == goat - 1 && newCabbage == cabbage
   let t6= humanTravel && newWolf == wolf && newGoat == goat && newCabbage == cabbage - 1
   let t7= humanTravel && newWolf == wolf && newGoat == goat && newCabbage == cabbage
   let objectTravel = t1 || t2 || t3 || t4 || t5 || t6 || t7
   
   #Последняя строка в разделе транзакции описывает разрешающее транзакцию условие.
   #Переменные транзакции должны иметь значения 1 или 0, все объекты должны
   #быть в безопасности, а фермер должен переплывать реку в одиночку 
   #или с кем-то на каждом шагу
   side && safe && humanTravel && objectTravel
case s:TransferTransaction =>
   #Транзакция вывода средств разрешена только в случае если все переплыли на другой берег
   human == 1 && wolf == 1 && goat == 1 && cabbage == 1

#Все прочие типы транзакций запрещены
case _ => false

}

Ka tangohia e PHP i te tuatahi nga taurangi katoa mai i te kirimana atamai i roto i te ahua o o ratou ki me te taurangi kupu Boolean e rite ana.

cabbage: extract ( getInteger ( contract , "cabbage" ) )
goat: extract ( getInteger ( contract , "goat" ) )
human: extract ( getInteger ( contract , "human" ) )
wolf: extract ( getInteger ( contract , "wolf" ) )
fState: human== 1 && wolf== 1 && goat== 1 && cabbage== 1
fState: 
wolf: 
goat: 
cabbage: 
cabbageSide: cabbage== 0 || cabbage== 1
human: extract ( getInteger ( contract , "human" ) )
newGoat: extract ( getInteger ( t.data , "goat" ) )
newHuman: extract ( getInteger ( t.data , "human" ) )
goatSide: goat== 0 || goat== 1
humanSide: human== 0 || human== 1
t7: humanTravel && newWolf== wolf && newGoat== goat && newCabbage== cabbage
t3: humanTravel && newWolf== wolf && newGoat== goat && newCabbage== cabbage + 1
t6: humanTravel && newWolf== wolf && newGoat== goat && newCabbage== cabbage - 1
t2: humanTravel && newWolf== wolf && newGoat== goat + 1 && newCabbage== cabbage
t5: humanTravel && newWolf== wolf && newGoat== goat - 1 && newCabbage== cabbage
t1: humanTravel && newWolf== wolf + 1 && newGoat== goat && newCabbage== cabbage
t4: humanTravel && newWolf== wolf - 1 && newGoat== goat && newCabbage== cabbage
safeAlone: newGoat != newWolf && newGoat != newCabbage
wolfSide: wolf== 0 || wolf== 1
humanTravel: human != newHuman
side: humanSide && wolfSide && goatSide && cabbageSide
safe: safeAlone || newGoat== newHuman
objectTravel: t1 || t2 || t3 || t4 || t5 || t6 || t7

Ka hurihia e PHP ki te Z3Prover SMT-hototahi whakaahuatanga punaha i roto i te Python.
Ka takaihia nga raraunga ki roto i te kohanga, ka whiwhi nga taurangi rokiroki i te taurangi i, taurangi taurangi tauwhitinga i + 1, me nga taurangi me nga korero ka whakatakoto i nga ture mo te whakawhiti mai i te ahua o mua ki tera atu.

Koinei te tino ngakau o to maatau miihini mariko, e whakarato ana i te tikanga rapu maha-tauwhitinga.

fState:  And( And( And( human[Steps]  ==  1 , wolf[Steps]  ==  1 )  , goat[Steps]  ==  1 )  , cabbage[Steps]  ==  1 )  
final:  fState[Steps] 
fState:   
wolf:   
goat:   
cabbage:   
cabbageSide:  Or( cabbage[i]  ==  0 , cabbage[i]  ==  1 )  
goatSide:  Or( goat[i]  ==  0 , goat[i]  ==  1 )  
humanSide:  Or( human[i]  ==  0 , human[i]  ==  1 )  
t7:  And( And( And( humanTravel[i] , wolf  ==  wolf[i] )  , goat[i+1]  ==  goat[i] )  , cabbage  ==  cabbage[i] )  
t3:  And( And( And( humanTravel[i] , wolf  ==  wolf[i] )  , goat[i+1]  ==  goat[i] )  , cabbage  ==  cabbage[i] + 1 )  
t6:  And( And( And( humanTravel[i] , wolf  ==  wolf[i] )  , goat[i+1]  ==  goat[i] )  , cabbage  ==  cabbage[i] - 1 )  
t2:  And( And( And( humanTravel[i] , wolf  ==  wolf[i] )  , goat[i+1]  ==  goat[i] + 1 )  , cabbage  ==  cabbage[i] )  
t5:  And( And( And( humanTravel[i] , wolf  ==  wolf[i] )  , goat[i+1]  ==  goat[i] - 1 )  , cabbage  ==  cabbage[i] )  
t1:  And( And( And( humanTravel[i] , wolf  ==  wolf[i] + 1 )  , goat[i+1]  ==  goat[i] )  , cabbage  ==  cabbage[i] )  
t4:  And( And( And( humanTravel[i] , wolf  ==  wolf[i] - 1 )  , goat[i+1]  ==  goat[i] )  , cabbage  ==  cabbage[i] )  
safeAlone:  And( goat[i+1] != wolf , goat[i+1] != cabbage )  
wolfSide:  Or( wolf[i]  ==  0 , wolf[i]  ==  1 )  
humanTravel:  human[i] != human[i+1] 
side:  And( And( And( humanSide[i] , wolfSide[i] )  , goatSide[i] )  , cabbageSide[i] )  
safe:  Or( safeAlone[i] , goat[i+1]  ==  human[i+1] )  
objectTravel:  Or( Or( Or( Or( Or( Or( t1[i] , t2[i] )  , t3[i] )  , t4[i] )  , t5[i] )  , t6[i] )  , t7[i] )  
data:  And( And( And( side[i] , safe[i] )  , humanTravel[i] )  , objectTravel[i] )  

Ko nga tikanga ka tohua, ka whakauruhia ki roto i te tauira tuhi i hangaia hei whakaahua i te punaha SMT i roto i te Python.

tātauira pātea


import json

from z3 import *

s = Solver()

  
  
    
Steps=7
Num= Steps+1

$code$



#template, only start rest
s.add(data + start)

#template
s.add(final)




ind = 0

f = open("/var/www/html/all/bin/python/log.txt", "a")



while s.check() == sat:
  ind = ind +1
  

  print ind
  m = s.model()
  print m

  print "traversing model..." 
  #for d in m.decls():
	#print "%s = %s" % (d.name(), m[d])

  
 
  f.write(str(m))
  f.write("nn")
  exit()
  #s.add(Or(goat[0] != s.model()[data[0]] )) # prevent next model from using the same assignment as a previous model



print "Total solution number: "
print ind  

f.close()
 


Mo te ahua whakamutunga i roto i te mekameka katoa, ka whakamahia nga ture kua tohua i roto i te waahanga whakawhitinga whakawhitinga.

Ko te tikanga ka rapua e Z3Prover nga momo tikanga ka taea te tango moni mai i te kirimana.

Ko te mutunga, ka whiwhi aunoa matou i tetahi tauira SMT tino mahi o ta matou kirimana.
Ka kite koe he tino rite ki te tauira mai i taku tuhinga o mua, i whakahiatohia e au ma te ringa.

Kua oti te tauira


import json

from z3 import *

s = Solver()

  
  
    
Steps=7
Num= Steps+1

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) ]
nothing= [  And( human[i] == human[i+1], wolf[i] == wolf[i+1], goat[i] == goat[i+1], cabbage[i] == cabbage[i+1] )   for i in range(Num-1) ]


start= [ human[0] == 1, wolf[0] == 0, goat[0] == 1, cabbage[0] == 0 ]

safeAlone= [  And( goat[i+1] != wolf[i+1] , goat[i+1] != cabbage[i+1] )   for i in range(Num-1) ]
safe= [  Or( safeAlone[i] , goat[i+1]  ==  human[i+1] )   for i in range(Num-1) ]
humanTravel= [  human[i] != human[i+1]  for i in range(Num-1) ]
cabbageSide= [  Or( cabbage[i]  ==  0 , cabbage[i]  ==  1 )   for i in range(Num-1) ]
goatSide= [  Or( goat[i]  ==  0 , goat[i]  ==  1 )   for i in range(Num-1) ]
humanSide= [  Or( human[i]  ==  0 , human[i]  ==  1 )   for i in range(Num-1) ]
t7= [  And( And( And( humanTravel[i] , wolf[i+1]  ==  wolf[i] )  , goat[i+1]  ==  goat[i] )  , cabbage[i+1]  ==  cabbage[i] )   for i in range(Num-1) ]
t3= [  And( And( And( humanTravel[i] , wolf[i+1]  ==  wolf[i] )  , goat[i+1]  ==  goat[i] )  , cabbage[i+1]  ==  cabbage[i] + 1 )   for i in range(Num-1) ]
t6= [  And( And( And( humanTravel[i] , wolf[i+1]  ==  wolf[i] )  , goat[i+1]  ==  goat[i] )  , cabbage[i+1]  ==  cabbage[i] - 1 )   for i in range(Num-1) ]
t2= [  And( And( And( humanTravel[i] , wolf[i+1]  ==  wolf[i] )  , goat[i+1]  ==  goat[i] + 1 )  , cabbage[i+1]  ==  cabbage[i] )   for i in range(Num-1) ]
t5= [  And( And( And( humanTravel[i] , wolf[i+1]  ==  wolf[i] )  , goat[i+1]  ==  goat[i] - 1 )  , cabbage[i+1]  ==  cabbage[i] )   for i in range(Num-1) ]
t1= [  And( And( And( humanTravel[i] , wolf[i+1]  ==  wolf[i] + 1 )  , goat[i+1]  ==  goat[i] )  , cabbage[i+1]  ==  cabbage[i] )   for i in range(Num-1) ]
t4= [  And( And( And( humanTravel[i] , wolf[i+1]  ==  wolf[i] - 1 )  , goat[i+1]  ==  goat[i] )  , cabbage[i+1]  ==  cabbage[i] )   for i in range(Num-1) ]
wolfSide= [  Or( wolf[i]  ==  0 , wolf[i]  ==  1 )   for i in range(Num-1) ]
side= [  And( And( And( humanSide[i] , wolfSide[i] )  , goatSide[i] )  , cabbageSide[i] )   for i in range(Num-1) ]
objectTravel= [  Or( Or( Or( Or( Or( Or( t1[i] , t2[i] )  , t3[i] )  , t4[i] )  , t5[i] )  , t6[i] )  , t7[i] )   for i in range(Num-1) ]
data= [ Or(  And( And( And( side[i] , safe[i] )  , humanTravel[i] )  , objectTravel[i] )   , nothing[i]) for i in range(Num-1) ]


fState=  And( And( And( human[Steps]  ==  1 , wolf[Steps]  ==  1 )  , goat[Steps]  ==  1 )  , cabbage[Steps]  ==  1 )  
final=  fState 




#template, only start rest
s.add(data + start)

#template
s.add(final)




ind = 0

f = open("/var/www/html/all/bin/python/log.txt", "a")



while s.check() == sat:
  ind = ind +1
  

  print ind
  m = s.model()
  print m

  print "traversing model..." 
  #for d in m.decls():
	#print "%s = %s" % (d.name(), m[d])

  
 
  f.write(str(m))
  f.write("nn")
  exit()
  #s.add(Or(goat[0] != s.model()[data[0]] )) # prevent next model from using the same assignment as a previous model



print "Total solution number: "
print ind  

f.close()
 


I muri i te whakarewatanga, ka whakatauhia e Z3Prover te kirimana atamai me te whakarato ki a maatau he mekameka o nga whakawhitinga ka taea e matou te tango moni:

Winning transaction chain found:
Data transaction: human= 0, wolf= 0, goat= 1, cabbage= 0
Data transaction: human= 1, wolf= 0, goat= 1, cabbage= 1
Data transaction: human= 0, wolf= 0, goat= 0, cabbage= 1
Data transaction: human= 1, wolf= 1, goat= 0, cabbage= 1
Data transaction: human= 0, wolf= 1, goat= 0, cabbage= 1
Data transaction: human= 1, wolf= 1, goat= 1, cabbage= 1
Data transaction: human= 1, wolf= 1, goat= 1, cabbage= 1
Transfer transaction

I tua atu i te kirimana waka, ka taea e koe te whakamatautau me o ake kirimana, te whakamatau ranei i tenei tauira ngawari, ka whakatauhia i roto i nga whakawhitinga 2.

let contract = tx.sender
let a= extract(getInteger(contract,"a"))
let b= extract(getInteger(contract,"b"))
let c= extract(getInteger(contract,"c"))
let d= extract(getInteger(contract,"d"))

match tx {
case t:DataTransaction =>
let na= extract(getInteger(t.data,"a")) 
let nb= extract(getInteger(t.data,"b"))
let nc= extract(getInteger(t.data,"c"))
let nd= extract(getInteger(t.data,"d"))
   
   nd == 0 || a == 100 - 5
case s:TransferTransaction =>
   ( a + b - c ) * d == 12

case _ => true

}

I te mea koinei te putanga tuatahi, he iti noa te wetereo, a tera pea he pepeke.
I roto i nga tuhinga e whai ake nei, kei te whakamahere ahau ki te hipoki i te whakawhanaketanga ake o te VM, me te whakaatu me pehea e taea ai e koe te hanga kirimana atamai kua whakamanahia me tana awhina, kaua e whakaoti noa.

Kei te waatea te miihini mariko ahua i http://2.59.42.98/hyperbox/
I muri i te whakatakoto i te waehere puna o te VM tohu i roto i te raupapa me te taapiri i nga korero ki reira, ka whakamahere ahau ki te whakauru ki runga ki a GitHub mo te kore utu.

Source: will.com

Tāpiri i te kōrero