Ho theha sistimi ea netefatso ea semmuso ho tloha qalong. Karolo ea 1: Mochini oa Virtual Character ho PHP le Python

Netefatso ea semmuso ke netefatso ea lenaneo le leng kapa algorithm ho sebelisa e 'ngoe.

Ena ke e 'ngoe ea mekhoa e matla ka ho fetisisa e u lumellang ho fumana bofokoli bohle lenaneong kapa ho paka hore ha bo eo.

Tlhaloso e qaqileng haholoanyane ea netefatso ea molao e ka bonoa mohlaleng oa ho rarolla bothata ba Phiri, Phooko le Khabeche sehloohong sa ka se fetileng.

Sehloohong sena ke tloha ho netefatso ea molao ea mathata ho ea ho mananeo le ho hlalosa kamoo
li ka fetoloa joang hore e be litsamaiso tsa molao tse hlophisitsoeng ka bo eona.

Ho etsa sena, ke ile ka ngola analogue ea ka ea mochine oa sebele, ke sebelisa melao-motheo ea tšoantšetso.

E fetisa khoutu ea lenaneo ebe e e fetolela ho system of equations (SMT), e seng e ka rarolloa ka lenaneo.

Kaha tlhahisoleseling mabapi le lipalo tsa tšoantšetso e hlahisoa Marang-rang ka likaroloana,
Ke tla hlalosa ka bokhutšoanyane hore na ke eng.

Symbolic computation ke mokhoa oa ho phethahatsa ka nako e le 'ngoe lenaneo ho mefuta e mengata ea data 'me ke sesebelisoa sa mantlha sa netefatso ea lenaneo.

Ka mohlala, re ka beha maemo a ho kenya moo khang ea pele e ka nkang litekanyetso leha e le life tse ntle, ea bobeli e fosahetseng, ea boraro ea zero, le khang ea tlhahiso, mohlala, 42.

Lipalo tsa tšoantšetso ka lekhetlo le le leng li tla re fa karabo ea hore na ho ka khoneha hore re fumane sephetho se lakatsehang le mohlala oa sete sa litekanyo tse joalo tsa ho kenya. Kapa bopaki ba hore ha ho na li-parameter tse joalo.

Ho feta moo, re ka beha likhang tsa ho kenya ho tsohle tse ka khonehang, 'me re khetha feela tse hlahisoang, mohlala, password ea motsamaisi.

Tabeng ena, re tla fumana bofokoli bohle ba lenaneo kapa re fumane bopaki ba hore phasewete ea molaoli e bolokehile.

Ho ka hlokomeloa hore ts'ebetso ea khale ea lenaneo le nang le lintlha tse khethehileng tsa ho kenya letsoho ke ketsahalo e khethehileng ea ho bolaoa ha tšoantšetso.

Ka hona, sebopeho sa ka sa VM le sona se ka sebetsa ka mokhoa oa ho etsisa mochini o tloaelehileng oa mochini.

Litlhalosong tsa sehlooho se fetileng motho a ka fumana ho nyatsuoa ho nepahetseng ha netefatso ea semmuso ka puisano ea mefokolo ea eona.

Mathata a maholo ke:

  1. Ho phatloha ho kopaneng, kaha netefatso ea semmuso qetellong e theohela ho P = NP
  2. Ho sebetsana le mehala ho sistimi ea faele, marang-rang le polokelo e meng ea kantle ho thata ho netefatsa
  3. Litšitšili ka litlhaloso, ha moreki kapa moqapi oa lenaneo a ne a rerile ntho e le 'ngoe, empa ha aa ka a e hlalosa ka mokhoa o nepahetseng ka ho lekaneng ka litlhaloso tsa tekheniki.

Ka lebaka leo, lenaneo le tla netefatsoa le ho lumellana le tlhaloso, empa le tla etsa ntho e fapaneng ka ho feletseng le seo baetsi ba se lebelletseng ho sona.

Kaha sehloohong sena ke nahana haholo ka tšebeliso ea ho netefatsa ka mokhoa o hlophisitsoeng, nke ke ka otla hlooho ea ka leboteng hona joale, 'me ke tla khetha mokhoa oo ho rarahana ha algorithmic le palo ea mehala e ka ntle e fokolang.

Kaha likonteraka tse bohlale li lumellana hantle le litlhoko tsena, khetho e ile ea oela ho likonteraka tsa RIDE ho tloha sethaleng sa Waves: ha ba Turing ka ho feletseng, 'me ho rarahana ha bona ho lekanyelitsoe ka maiketsetso.

Empa re tla li nahana ka ho khetheha ho tloha lehlakoreng la tekheniki.

Ho phaella ho ntho e 'ngoe le e' ngoe, ho netefatsa hore ho tla ba le tlhokahalo e khethehileng bakeng sa likonteraka leha e le life: hangata ho ke ke ha khoneha ho lokisa phoso ea konteraka ka mor'a hore e thakholoe.
'Me litšenyehelo tsa liphoso tse joalo li ka ba holimo haholo, kaha chelete e ngata haholo e bolokiloe likonteraka tse bohlale.

Mochini oa ka oa tšoantšetso o ngotsoe ka PHP le Python, 'me o sebelisa Z3Prover ho tsoa ho Microsoft Research ho rarolla liforomo tsa SMT tse hlahisoang.

Motheong oa eona ke patlo e matla ea litšebelisano tse ngata, e
e o lumella ho fumana litharollo kapa bofokoli, leha e hloka litšebelisano tse ngata.
Esita le Mythril, e 'ngoe ea mekhoa e matla ka ho fetisisa ea tšoantšetso ea ho fumana bofokoli ba Ethereum, e kentse bokhoni bona likhoeling tse' maloa tse fetileng.

Empa ke habohlokoa ho hlokomela hore likonteraka tsa ether li rarahane haholoanyane 'me Turing e phethehile.

PHP e fetolela khoutu ea mohloli oa konteraka e bohlale ea RIDE ho sengoloa sa python, moo lenaneo le hlahisoang e le sistimi e tsamaellanang le Z3 SMT ea linaha tsa konteraka le maemo bakeng sa liphetoho tsa bona:

Ho theha sistimi ea netefatso ea semmuso ho tloha qalong. Karolo ea 1: Mochini oa Virtual Character ho PHP le Python

Joale ke tla hlalosa se etsahalang ka hare ka botlalo.

Empa pele, mantsoe a seng makae ka puo ea konteraka e bohlale ea RIDE.

Ke puo ea lenaneo e sebetsang le e thehiloeng ho polelo e botsoa ka moralo.
RIDE e sebetsa e le mong ka har'a blockchain mme e khona ho fumana le ho ngola tlhahisoleseling ho tsoa polokelong e hokahantsoeng le sepache sa mosebelisi.

O ka hokela konteraka ea RIDE sepacheng se seng le se seng, 'me sephetho sa ho bolaoa e tla ba feela TRUE kapa FALSE.

TRUE e bolela hore konteraka e bohlale e lumella khoebo, 'me FALSE e bolela hore ea e thibela.
Mohlala o bonolo: sengoloa se ka thibela phetisetso haeba chelete ea sepache e ka tlase ho 100.

E le mohlala, ke tla nka Phiri e tšoanang, Pōli le Cabbage, empa e se e hlahisitsoe ka mokhoa oa konteraka e bohlale.

Mosebelisi a ke ke a khona ho ntša chelete sepacheng seo konteraka e sebelisoang ho sona ho fihlela a rometse bohle ka lehlakoreng le leng.

#Извлекаем положение всех объектов из блокчейна
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

}

PHP e qala ka ho ntša mefuta eohle e fapaneng ho tsoa konteraka e bohlale ka mokhoa oa linotlolo tsa bona le mofuta o lumellanang oa polelo ea Boolean.

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

PHP e ntan'o li fetolela hore e be tlhaloso ea sistimi e lumellanang le Z3Prover SMT ho Python.
Lintlha li phuthetsoe ka loop, moo mefuta ea polokelo e fumanang index i, transaction variables index i + 1, le mefuta e nang le lipolelo e beha melao ea phetoho ho tloha sebakeng se fetileng ho ea ho se latelang.

Ena ke eona pelo ea mochini oa rona oa sebele, o fanang ka mokhoa oa ho batla oa mefuta e mengata.

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

Maemo a hlophisoa ebe a kenngoa ka har'a template ea script e etselitsoeng ho hlalosa tsamaiso ea SMT ho Python.

template e se nang letho


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


Bakeng sa boemo ba ho qetela ba ketane eohle, melao e boletsoeng karolong ea transaction transaction e sebelisoa.

Sena se bolela hore Z3Prover e tla batla maemo a joalo a tla lumella chelete hore e tlosoe konteraka.

Ka lebaka leo, re fumana ka bohona mofuta oa SMT o sebetsang ka botlalo oa konteraka ea rona.
U ka bona hore e tšoana haholo le mohlala oa sehlooho sa ka se fetileng, seo ke se hlophisitseng ka letsoho.

Setšoantšo se phethiloeng


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


Kamora ho qala, Z3Prover e rarolla konteraka e bohlale mme e re fa letoto la litšebelisano tse tla re lumella ho ntša chelete:

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

Ntle le konteraka ea seketsoana, u ka leka likonteraka tsa hau kapa leka mohlala ona o bonolo, o rarolloang ka 2 transactions.

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

}

Kaha ena ke mofuta oa pele, syntax e fokola haholo mme ho ka ba le litšitšili.
Lihloohong tse latelang, ke rera ho koahela tsoelo-pele e tsoelang pele ea VM, le ho bontša kamoo u ka etsang likonteraka tse bohlale tse netefalitsoeng ka molao ka thuso ea eona, eseng feela ho li rarolla.

The character virtual machine e fumaneha ho http://2.59.42.98/hyperbox/
Kamora ho beha khoutu ea mohloli oa VM ea tšoantšetso ka tatellano le ho eketsa maikutlo moo, ke rera ho e beha ho GitHub bakeng sa phihlello ea mahala.

Source: www.habr.com

Eketsa ka tlhaloso