Formal verification ndeyekusimbisa kwechimwe chirongwa kana algorithm uchishandisa imwe.
Iyi ndiyo imwe yenzira dzakasimba kwazvo dzinokutendera kuti uwane kusagadzikana kwese muchirongwa kana kuratidza kuti havapo.
Tsanangudzo yakadzama yekusimbisa zviri pamutemo inogona kuonekwa mumuenzaniso wekugadzirisa dambudziko re
Muchinyorwa ichi ini ndinosimuka kubva kune yakarongeka yekusimbisa matambudziko kuenda kumapurogiramu uye ndinotsanangura sei
vangashandurwa sei kuva hurongwa hwekutonga huri nyore.
Kuti ndiite izvi, ndakanyora yangu analogue yemuchina chaiwo, ndichishandisa misimboti yekufananidzira.
Inopatsanura kodhi yepurogiramu uye inoishandura kuita system of equations (SMT), iyo inogona kutogadziriswa nehurongwa.
Sezvo ruzivo nezve maverengero ekufananidzira anoratidzwa paInternet pane zvidimbu,
Ndichatsanangura muchidimbu kuti chii.
Symbolic computation inzira yekuita panguva imwe chete chirongwa pane dzakasiyana siyana data uye ndicho chishandiso chikuru chekusimbisa chirongwa.
Semuenzaniso, tinokwanisa kuseta mamiriro ekuisa apo nharo yekutanga inogona kutora chero hunhu hwakanaka, yechipiri isina kunaka, yechitatu zero, uye inobuda nharo, semuenzaniso, 42.
Kuverengera kwechiratidzo mukumhanya kumwe kunozotipa mhinduro yekuti zvinokwanisika here kuti isu tiwane mhedzisiro yatinoda uye muenzaniso weiyo seti yemaparamendi ekuisa akadaro. Kana humbowo hwekuti hakuna maparameter akadaro.
Uyezve, isu tinogona kuseta mapomendi ekuisa kune ese anogoneka, uye tosarudza chete izvo zvinobuda, semuenzaniso, password yemutungamiriri.
Mune ino kesi, isu tichawana kusakwana kwese kwechirongwa kana kuwana humbowo hwekuti password yemutungamiriri yakachengeteka.
Zvinogona kucherechedzwa kuti classical execution yechirongwa ine chaiyo yekupinza data inyaya yakakosha yekuurayiwa kwekufananidzira.
Naizvozvo, hunhu hwangu VM hunogonawo kushanda mukutevedzera modhi yemuchina wakajairwa.
Mune zvakataurwa kuchinyorwa chakapfuura munhu anogona kuwana kutsoropodza kwakaringana kwekusimbisa kwakarongeka nehurukuro yekusasimba kwayo.
Matambudziko makuru ndeaya:
- Combinatorial kuputika, sezvo kusimbiswa kwechokwadi kunozodzika kuP = NP
- Kugadzirisa mafoni kune iyo faira system, network uye kumwe kuchengetedza kwekunze kwakanyanya kunetsa kuratidza
- Mabhugi mune yakatarwa, apo mutengi kana programmer aida chinhu chimwe chete, asi haana kurondedzera icho nemazvo zvakakwana muhunyanzvi hwekutsanangurwa.
Nekuda kweizvozvo, chirongwa ichi chinozosimbiswa uye chinoenderana nezvakatsanangurwa, asi chichaita chimwe chinhu chakasiyana zvachose kubva kune izvo vagadziri vaitarisira kubva kwairi.
Sezvo muchinyorwa chino ini ndiri kunyanya kufunga nezve kushandiswa kwechokwadi kwechokwadi mukuita, ini handisi kuzorovera musoro wangu kumadziro ikozvino, uye ndichasarudza hurongwa uko iyo algorithmic kuoma uye nhamba yekufona kwekunze kushoma.
Sezvo zvibvumirano zvakangwara zvichinyatsoenderana nezvinodiwa izvi, sarudzo yakawira paRIDE zvibvumirano kubva paMafungu papuratifomu: ivo havasi Turing yakakwana, uye kuoma kwavo kwakanyanya kunogumira.
Asi isu tichavafunga ivo chete kubva kudivi rehunyanzvi.
Mukuwedzera, kune chero zvibvumirano zvibvumirano zvakasimbiswa zvichange zvichinyanya kudiwa: kazhinji hazvibviri kugadzirisa kukanganisa kwekontrakiti mushure mokunge yatangwa.
Uye mutengo wezvikanganiso zvakadaro unogona kunge wakakwira zvakanyanya, sezvo mari yakawanda kwazvo inowanzochengetwa pazvibvumirano zvakangwara.
Muchina wangu wekufananidzira wakanyorwa muPHP nePython, uye unoshandisa Z3Prover kubva kuMicrosoft Research kugadzirisa mhedzisiro yeSMT mafomula.
Pakati payo pane simba rekutsvaga kwemarudzi akawanda, iyo
inokutendera iwe kuwana mhinduro kana kusasimba, kunyangwe zvichida akawanda matransaction.
Kunyange the
Asi zvakakosha kucherechedza kuti ether zvibvumirano zvakanyanya kuoma uye Turing yakakwana.
PHP inoshandura iyo kodhi kodhi yeRIDE smart kontrakiti kuita python script, umo chirongwa chinoratidzwa seZ3 SMT-inoenderana system yezvibvumirano nyika uye mamiriro ekuchinja kwavo:
Zvino ini ndichatsanangura zviri kuitika mukati zvakadzama.
Asi chekutanga, mazwi mashoma nezve RIDE smart contract mutauro.
Mutauro unoshanda uye wekutaura-wakavakirwa purogiramu ine usimbe nekugadzira.
RIDE inomhanya yakazvimiririra mukati me blockchain uye inogona kudzoreredza nekunyora ruzivo kubva mudura rakabatana nechikwama chemushandisi.
Iwe unogona kubatanidza RIDE kontrakiti kune yega yega chikwama, uye mhedzisiro yekuurayiwa ichave chete CHOKWADI kana FALSE.
TRUE zvinoreva kuti kondirakiti yakangwara inobvumira kutengeserana, uye FALSE zvinoreva kuti inoirambidza.
Muenzaniso wakapfava: script inogona kurambidza kutamiswa kana chikwama chemari chiri pasi pe100.
Semuenzaniso, ini ndichatora imwechete Wolf, Mbudzi, uye Kabheji, asi yakatoratidzwa nenzira yekontrakiti yakangwara.
Mushandisi haazokwanisi kubvisa mari kubva muchikwama icho chibvumirano chinoiswa kusvikira atumira munhu wese kune rumwe rutivi.
#ΠΠ·Π²Π»Π΅ΠΊΠ°Π΅ΠΌ ΠΏΠΎΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π²ΡΠ΅Ρ
ΠΎΠ±ΡΠ΅ΠΊΡΠΎΠ² ΠΈΠ· Π±Π»ΠΎΠΊΡΠ΅ΠΉΠ½Π°
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 inotanga inobvisa zvese zvakasiyana kubva kune smart kontrakiti mumhando yemakiyi avo uye inoenderana Boolean kutaura kunosiyana.
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 inozovashandura kuita Z3Prover SMT-inoenderana sisitimu tsananguro muPython.
Iyo data yakaputirwa muloop, apo zvigadziriso zvekuchengetedza zvinogamuchira index i, transaction variables index i + 1, uye zvinyorwa zvine mazwi zvinogadzirisa mitemo yekushandura kubva kune imwe nyika kuenda kune inotevera.
Uyu ndiwo moyo chaiwo wemuchina wedu chaiwo, uyo unopa akawanda-transactional yekutsvaga injini.
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] )
Mamiriro acho anorongwa uye anoiswa mune script template yakagadzirirwa kutsanangura iyo SMT system muPython.
template isina chinhu
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()
Kumamiriro ekupedzisira mumaketani ose, mitemo inotsanangurwa muchikamu chekutengesa chekufambisa inoshandiswa.
Izvi zvinoreva kuti Z3Prover ichatsvaga seti chaiyo yemamiriro ezvinhu ayo anozopedzisira abvumira mari kubviswa muchibvumirano.
Nekuda kweizvozvo, isu tinongogashira inoshanda zvizere SMT modhi yekondirakiti yedu.
Iwe unogona kuona kuti yakafanana chaizvo nemuenzaniso kubva kuchinyorwa changu chakapfuura, chandakanyora nemaoko.
Yakapedzwa 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()
Mushure mekutangwa, Z3Prover inogadzirisa kondirakiti yakangwara uye inotipa ketani yekutengeserana inozotibvumidza kubvisa mari:
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
Pamusoro pechibvumirano chechikepe, unogona kuedza nezvibvumirano zvako pachako kana kuedza uyu muenzaniso wakapfava, unogadziriswa mukutengeserana kwe2.
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
}
Sezvo iyi iri iyo yekutanga vhezheni, iyo syntax ishoma uye panogona kunge paine tsikidzi.
Muzvinyorwa zvinotevera, ini ndinoronga kuvhara kuenderera mberi kweVM, uye kuratidza kuti iwe unogona sei kugadzira zvakasimbiswa zvakasimbiswa smart zvibvumirano nerubatsiro rwayo, uye kwete kungozvigadzirisa.
Iyo character virtual muchina inowanikwa pa
Mushure mekuisa iyo kodhi kodhi yechiratidzo VM mukurongeka uye nekuwedzera makomendi ipapo, ndinoronga kuiisa paGitHub yemahara kuwana.
Source: www.habr.com