Tsim kom muaj kev pov thawj tseeb los ntawm kos. Part 1: Cim Virtual Tshuab hauv PHP thiab Python

Kev pov thawj raug cai yog kev txheeb xyuas ntawm ib qho kev pab cuam lossis algorithm siv lwm qhov.

Qhov no yog ib txoj hauv kev muaj zog tshaj plaws uas tso cai rau koj los nrhiav txhua qhov tsis zoo hauv qhov program lossis ua pov thawj tias lawv tsis muaj.

Cov lus piav qhia ntxaws ntxiv ntawm kev txheeb xyuas qhov tseeb tuaj yeem pom hauv qhov piv txwv ntawm kev daws qhov teeb meem ntawm Hma, tshis, thiab Cabbage nyob rau hauv kuv tsab xov xwm dhau los.

Hauv tsab xov xwm no kuv txav los ntawm kev txheeb xyuas cov teeb meem rau cov kev pab cuam thiab piav qhia yuav ua li cas
yuav ua li cas lawv yuav tsum tau hloov dua siab tshiab rau hauv txoj cai txoj cai txiav.

Ua li no, kuv tau sau kuv tus kheej analogue ntawm lub tshuab virtual, siv cov ntsiab lus cim.

Nws parses qhov program code thiab txhais nws mus rau hauv ib qho system ntawm kev sib npaug (SMT), uas tuaj yeem daws tau qhov programmatically.

Txij li cov ntaub ntawv hais txog kev suav cov cim tau nthuav tawm hauv Is Taws Nem es fragmentarily,
Kuv yuav piav luv luv tias nws yog dab tsi.

Symbolic suav yog ib txoj hauv kev ua kom tiav ib qho kev pab cuam ntawm ntau cov ntaub ntawv thiab yog cov cuab yeej tseem ceeb rau kev txheeb xyuas qhov program.

Piv txwv li, peb tuaj yeem teeb tsa cov kev xav tau uas qhov kev sib cav thawj zaug tuaj yeem coj qhov txiaj ntsig zoo, qhov tsis zoo thib ob, qhov thib peb xoom, thiab cov lus sib cav, piv txwv li, 42.

Kev suav cov cim hauv ib qho kev khiav yuav muab cov lus teb rau peb seb puas tuaj yeem ua tau rau peb kom tau txais cov txiaj ntsig xav tau thiab ua piv txwv ntawm cov txheej txheem ntawm cov khoom nkag. Los yog pov thawj tias tsis muaj qhov tsis zoo li no.

Ntxiv mus, peb tuaj yeem teeb tsa cov lus sib cav rau txhua qhov ua tau, thiab xaiv tsuas yog cov khoom tso tawm, piv txwv li, tus thawj tswj hwm tus password.

Hauv qhov no, peb yuav pom tag nrho cov kev pab cuam qhov tsis zoo lossis tau txais pov thawj tias tus thawj tswj hwm tus password muaj kev nyab xeeb.

Nws tuaj yeem raug sau tseg tias qhov kev ua tiav classical ntawm ib qho kev pab cuam nrog cov ntaub ntawv tshwj xeeb yog qhov tshwj xeeb ntawm kev ua tiav cov cim.

Yog li ntawd, kuv tus cwj pwm VM tuaj yeem ua haujlwm hauv emulation hom ntawm tus qauv virtual tshuab.

Nyob rau hauv cov lus rau tsab xov xwm dhau los ib qho tuaj yeem nrhiav kev thuam ncaj ncees ntawm kev lees paub tseeb nrog kev sib tham txog nws qhov tsis muaj zog.

Cov teeb meem tseem ceeb yog:

  1. Combinatorial explosion, txij li thaum cov ntaub ntawv pov thawj thaum kawg los rau P = NP
  2. Kev hu xov tooj mus rau cov ntaub ntawv kaw lus, tes hauj lwm thiab lwm qhov chaw cia sab nraud yog qhov nyuaj dua los txheeb xyuas
  3. Kab laum nyob rau hauv specification, thaum tus neeg muas zaub los yog programmer npaj ib yam, tab sis tsis tau piav qhia kom meej txaus nyob rau hauv kev specification.

Yog li ntawd, qhov kev zov me nyuam yuav raug txheeb xyuas thiab ua raws li qhov tshwj xeeb, tab sis yuav ua ib yam dab tsi txawv kiag li ntawm qhov uas cov neeg tsim khoom xav tau los ntawm nws.

Txij li thaum nyob rau hauv tsab xov xwm no kuv tsuas yog xav txog kev siv cov ntaub ntawv pov thawj hauv kev xyaum, kuv yuav tsis bang kuv lub taub hau tiv thaiv phab ntsa rau tam sim no, thiab yuav xaiv ib qho system uas algorithmic complexity thiab tus xov tooj ntawm sab nraud hu yog tsawg.

Txij li cov ntawv cog lus ntse zoo tshaj plaws haum rau cov kev xav tau no, qhov kev xaiv poob rau RIDE cov ntawv cog lus los ntawm Waves platform: lawv tsis Turing ua tiav, thiab lawv qhov siab tshaj plaws yog kev txwv tsis pub muaj.

Tab sis peb yuav txiav txim siab lawv tsuas yog los ntawm kev sab laj.

Ntxiv rau txhua yam, kev pov thawj raug cai yuav yog qhov tshwj xeeb tshaj yog xav tau rau txhua daim ntawv cog lus: nws feem ntau tsis tuaj yeem kho qhov kev cog lus yuam kev tom qab nws tau pib.
Thiab tus nqi ntawm cov kev ua yuam kev no tuaj yeem siab heev, vim tias cov nyiaj ntau heev feem ntau khaws cia rau ntawm daim ntawv cog lus ntse.

Kuv lub tshuab virtual cim tau sau rau hauv PHP thiab Python, thiab siv Z3Prover los ntawm Microsoft Kev Tshawb Fawb los daws qhov tshwm sim SMT qauv.

Nyob rau hauv nws cov tub ntxhais yog ib tug haib multi-transactional nrhiav, uas
tso cai rau koj los nrhiav kev daws teeb meem lossis qhov tsis zoo, txawm tias nws xav tau ntau yam kev hloov pauv.
Txawm tias lub Mythril, yog ib lub cim tseem ceeb tshaj plaws rau kev nrhiav Ethereum vulnerabilities, tsuas yog ntxiv qhov peev xwm no ob peb lub hlis dhau los.

Tab sis nws tsim nyog sau cia tias daim ntawv cog lus ether yog qhov nyuaj dua thiab Turing ua tiav.

PHP txhais cov cai ntawm RIDE ntse daim ntawv cog lus rau hauv daim ntawv python, nyob rau hauv uas qhov kev pab cuam tau nthuav tawm raws li Z3 SMT-tshaj qhov system ntawm cov ntawv cog lus thiab cov xwm txheej rau lawv cov kev hloov pauv:

Tsim kom muaj kev pov thawj tseeb los ntawm kos. Part 1: Cim Virtual Tshuab hauv PHP thiab Python

Tam sim no kuv yuav piav qhia txog dab tsi tshwm sim sab hauv kom ntxaws ntxiv.

Tab sis ua ntej, ob peb lo lus hais txog RIDE cov lus cog lus ntse.

Nws yog ib qho kev ua haujlwm thiab kev qhia-raws li programming lus uas yog tub nkeeg los ntawm kev tsim.
RIDE khiav hauv kev sib cais hauv blockchain thiab tuaj yeem khaws thiab sau cov ntaub ntawv los ntawm kev khaws cia txuas rau tus neeg siv lub hnab nyiaj.

Koj tuaj yeem xa daim ntawv cog lus RIDE rau txhua lub hnab nyiaj, thiab qhov tshwm sim ntawm kev ua tiav tsuas yog TRUE lossis FALSE.

TRUE txhais tau hais tias daim ntawv cog lus ntse tso cai rau kev sib pauv, thiab FALSE txhais tau tias txwv tsis pub nws.
Ib qho piv txwv yooj yim: ib tsab ntawv tuaj yeem txwv tsis pub hloov pauv yog tias lub hnab nyiaj tshuav tsawg dua 100.

Ua piv txwv, kuv yuav coj tib yam hma, tshis, thiab Cabbage, tab sis twb tau nthuav tawm hauv daim ntawv cog lus ntse.

Tus neeg siv yuav tsis tuaj yeem thim nyiaj los ntawm lub hnab nyiaj uas daim ntawv cog lus tau xa mus txog thaum nws tau xa txhua tus mus rau sab nraud.

#ИзвлСкаСм ΠΏΠΎΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ всСх ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² ΠΈΠ· Π±Π»ΠΎΠΊΡ‡Π΅ΠΉΠ½Π°
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 thawj zaug rho tawm txhua qhov sib txawv los ntawm daim ntawv cog lus ntse nyob rau hauv daim ntawv ntawm lawv cov yuam sij thiab qhov sib thooj Boolean qhia sib txawv.

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 ces hloov lawv mus rau hauv Z3Prover SMT-tshaj kab lus piav qhia hauv Python.
Cov ntaub ntawv tau muab qhwv rau hauv lub voj, qhov chaw khaws cia hloov pauv tau txais index i, hloov pauv hloov pauv index i + 1, thiab cov hloov pauv nrog cov kab lus teeb tsa cov cai hloov pauv ntawm lub xeev dhau los mus rau tom ntej.

Qhov no yog lub plawv ntawm peb lub tshuab virtual, uas muab ntau lub tshuab tshawb nrhiav.

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

Cov xwm txheej raug txheeb xyuas thiab muab tso rau hauv daim ntawv qauv tsim los piav txog SMT system hauv Python.

Cov qauv dawb


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


Rau lub xeev kawg nyob rau hauv tag nrho cov saw, cov kev cai uas tau teev tseg nyob rau hauv cov kev hloov pauv seem yog siv.

Qhov no txhais tau hais tias Z3Prover yuav nrhiav qhov tseeb xws li cov xwm txheej uas yuav tso cai rau cov nyiaj rho tawm ntawm daim ntawv cog lus.

Raws li qhov tshwm sim, peb tau txais qhov ua tau zoo SMT qauv ntawm peb daim ntawv cog lus.
Koj tuaj yeem pom tias nws zoo ib yam li tus qauv los ntawm kuv tsab xov xwm dhau los, uas kuv tau muab sau ua ke.

Ua tiav template


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


Tom qab tso tawm, Z3Prover daws cov ntawv cog lus ntse thiab muab peb cov saw hlau ntawm kev lag luam uas yuav tso cai rau peb rho nyiaj:

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

Ntxiv nrog rau daim ntawv cog lus ferry, koj tuaj yeem sim nrog koj tus kheej cov ntawv cog lus lossis sim ua piv txwv yooj yim no, uas tau daws hauv 2 kev lag luam.

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

}

Txij li qhov no yog thawj version, cov syntax tsawg heev thiab tej zaum yuav muaj kab.
Hauv cov ntawv hauv qab no, kuv npaj yuav npog qhov kev txhim kho ntxiv ntawm VM, thiab qhia seb koj tuaj yeem tsim cov ntawv cog lus ntse uas tau lees paub nrog nws cov kev pab, thiab tsis yog daws lawv xwb.

Lub cim virtual tshuab muaj nyob ntawm http://2.59.42.98/hyperbox/
Tom qab muab lub hauv paus code ntawm lub cim VM nyob rau hauv kev txiav txim thiab ntxiv cov lus nyob rau ntawd, kuv npaj yuav muab tso rau hauv GitHub rau pub dawb.

Tau qhov twg los: www.hab.com

Ntxiv ib saib