ááá¬ážáááºá¡áááºááŒá¯ááŒááºážááá¯áááºááŸá¬ áááá¯ááááºáá áºáᯠááá¯á·ááá¯áẠá¡ááŒá¬ážáá áºáá¯ááá¯á¡áá¯á¶ážááŒá¯á á¡ááºáááá¯áá®áááºááᯠá¡áááºááŒá¯ááŒááºážááŒá áºáááºá
áááºážááẠáááá¯ááááºáá áºáá¯ááœáẠá¡á¬ážáááºážáá»ááºáá»á¬ážá¡á¬ážáá¯á¶ážááᯠááŸá¬ááœá±ááẠááá¯á·ááá¯áẠáááºážááá¯á·áááŸáááŒá±á¬ááºáž áááºáá±ááŒááá¯ááºááá·áº á¡á áœááºážáááºáá¯á¶ážáááºážáááºážáá»á¬ážáá²ááŸáá áºáá¯ááŒá áºáááºá
ááŒá¿áá¬ááá¯ááŒá±ááŸááºážááŒááºážáá¥ááá¬ááœááºááá¬ážáááºá¡áááºááŒá¯ááŒááºážáá¡áá±ážá
áááºáá±á¬áºááŒáá»ááºááá¯ááœá±á·ááá¯ááºáá«áááºá
á€áá±á¬ááºážáá«ážááœáẠááŒá¿áá¬áá»á¬ážááᯠááá¬ážáááºá¡áááºááŒá¯ááŒááºážá០áááá¯ááááºáá»á¬ážáá®ááá¯á· ááŒá±á¬ááºážááœáŸá±á·ááŒá®áž áááºááá¯á·áá±á¬áºááŒáááºáááºážá
ááá¬ážááẠá¡á¯ááºáá»á¯ááºááŸá¯á
áá
áºááá¯á· á¡ááá¯á¡áá»á±á¬áẠáááºááá¯á·ááŒá±á¬ááºážáá²ááá¯ááºáááºáááºážá
áá«ááá¯áá¯ááºááá¯á·á áááºá¹áá±áááá±á¬ááá¬ážááœá±ááá¯áá¯á¶ážááŒá®áž virtual machine áá²á·ááá¯ááºááá¯áẠanalogue ááá¯áá±ážáá²á·áááºá
áááºážááẠáááá¯ááááºáá¯ááºááᯠááœá²ááŒááºážá áááºááŒá¬ááŒá®áž áááá¯ááááºá áá áºááŒáá·áº ááŒá±ááŸááºážááá¯ááºááá·áº áá®áá»áŸááŒááºážá áá Ạ(SMT) á¡ááŒá Ạáá¬áá¬ááŒááºáááºá
áá¯á¶ááá¹áá¬áẠááœááºáá»ááºááŸá¯áá»á¬ážááá¯ááºáᬠá¡áá»ááºá¡áááºáá»á¬ážááᯠá¡ááºáá¬áááºáá±á«áºááœáẠá¡ááá¯ááºážááá¯ááºážááœá²á áááºááŒáá¬ážáá±á¬ááŒá±á¬áá·áºá
á¡á²áá«áá¬áá²ááá¯áᬠá¡ááá¯áá»á¯á¶ážááŒá®áž ááŒá±á¬ááŒáá«áááºá
Symbolic ááœááºáá»ááºááŒááºážááẠáááá¯ááááºáá
áºáá¯á¡á¬áž áá»ááºááŒáá·áºáá±á¬áá±áá¬áá»á¬ážáá±á«áºááœáẠáá
áºááŒáá¯ááºáááºáááºážáá¯ááºáá±á¬ááºááẠáááºážáááºážáá
áºáá¯ááŒá
áºááŒá®áž ááá¬ážáááºáááá¯ááááºá¡áááºááŒá¯ááŒááºážá¡ááœáẠá¡ááááááááá¬ááŒá
áºáááºá
á¥ááá¬á¡á¬ážááŒáá·áºá áááá¡ááŒááºážá¡áá¯á¶ááẠá¡ááŒá¯ááá±á¬áá±á¬ááºááá·áºáááºááá¯ážáá»á¬ážá áá¯áááá¡ááŸá¯ááºá áááááá¯áá ááŸáá·áº á¡ááœááºá¡ááŒááºážá¡áá¯á¶ááᯠá¥ááá¬á¡á¬ážááŒáá·áº 42 áá°ááá¯ááºááá·áº input á¡ááŒá±á¡áá±áá»á¬ážááᯠáááºááŸááºááá¯ááºáááºá
áá áºááŒá±ážáááºážááœáẠáááºá¹áá±áááœááºáá»ááºááŸá¯áá»á¬ážááẠáá»áœááºá¯ááºááá¯á·á¡á¬áž ááá¯áá»ááºáá±á¬ááááºáááŸááááºááŸáá·áº ááá¯áá²á·ááá¯á·áá±á¬ááá·áºááœááºážááŸá¯áá±á¬ááºáá»á¬ážá ááá°áá¬áá áºáá¯á¡ááœáẠááŒá áºááá¯ááºáá»á±ááŸááááŸá á¡ááŒá±ááá¯áá±ážáááá·áºáááºá ááá¯á·ááá¯áẠááá¯ááá¯á·áá±á¬ ááá·áºáááºáá»ááºáá»á¬áž áááŸáááŒá±á¬ááºáž áááºáá±ááŒáá«á
ááá¯á·á¡ááŒááºá áá»áœááºá¯ááºááá¯á·ááẠinput arguments áá»á¬ážááᯠááŒá áºááá¯ááºáá»á±á¡á¬ážáá¯á¶ážááᯠáááºááŸááºááá¯ááºááŒá®ážá á¥ááá¬á administrator password ááá¯áᬠááœá±ážáá»ááºááá¯ááºáááºá
á€ááá á¹á ááœááºá áá»áœááºá¯ááºááá¯á·ááẠáááá¯ááááºá á¡á¬ážáááºážáá»ááºá¡á¬ážáá¯á¶ážááᯠááŸá¬ááœá±á·áááá·áºááẠááá¯á·ááá¯áẠá á®áá¶ááá·áºááœá²áá°á á áá¬ážááŸááºááẠáá¯á¶ááŒá¯á¶ááŒá±á¬ááºáž áááºáá±ááŒáá«áááºá
áááá»áá±á¬ááá·áºááœááºážááŸá¯áá±áá¬áá«ááá·áº áááá¯ááááºáá áºáá¯á ááŸá±ážááá¯ážáá¯ááºáá±á¬ááºááŸá¯ááẠáá¯á¶ááá¹áá¬ááºáá¯ááºáá±á¬ááºááŸá¯á á¡áá°ážááá á¹á áááºááŒá áºááŒá±á¬ááºáž ááŸááºáá¬ážááá¯ááºáá«áááºá
ááá¯á·ááŒá±á¬áá·áºá áá»áœááºá¯ááºááá¬ááºáá±á¬áẠVM ááẠáá¯á¶ááŸáẠvirtual machine áá áºáá¯á á¡áá¯áá°áá¯ááºááœááºáááºáž áá¯ááºáá±á¬ááºááá¯ááºáááºá
ááááºáá±á¬ááºážáá«ážá ááŸááºáá»ááºáá»á¬ážááœáẠáááºážáá¡á¬ážáááºážáá»ááºáá»á¬ážááᯠááœá±ážááœá±ážááŒááºážááŒáá·áº ááá¬ážáááºá¡áááºááŒá¯ááŒááºážá¡áá±á«áº ááá¬ážáá»áŸááá±á¬ áá±áááºááŸá¯ááᯠááœá±á·ááŸáááá¯ááºáááºá
á¡áááááŒá¿áá¬áá»á¬ážááŸá¬-
- ááá¬ážáááºá¡áááºááŒá¯áá»ááºááẠáá±á¬ááºáá¯á¶ážááœáẠP=NP ááá¯á· áááºážáááºáá¬áá±á¬ááŒá±á¬áá·áº áá±á«ááºážá ááºáá±á«ááºááœá²ááŸá¯ááŒá áºáááºá
- ááá¯ááºá áá áºá ááœááºáááºáá»á¬ážááŸáá·áº á¡ááŒá¬ážááŒááºáááá¯ááŸá±á¬ááºááŸá¯ááá¯á· áá±á«áºááá¯ááŸá¯áá»á¬ážááᯠáá¯ááºáá±á¬ááºáá¬ááœáẠá¡áááºááŒá¯ááẠááá¯ááá¯áááºáá²áááºá
- áá±á¬ááºááẠááá¯á·ááá¯áẠáááá¯ááááºáá¬á á¡áá¬áá áºáá¯ááᯠáááºááœááºáá±á¬á¡áá« áááºááŸááºáá»ááºááœáẠá¡ááŸá¬ážá¡ááœááºážáá»á¬áž ááŸááá±á¬áºáááºáž áááºážááᯠáááºážááá¬ááá¯ááºáᬠáááºááŸááºáá»ááºáá»á¬ážááœáẠáááá»á áœá¬ ááá±á¬áºááŒáá²á·áá«á
ááááºá¡áá±ááŒáá·áºá áááá¯ááááºá¡á¬áž á áá á áºááŒá®áž áááºááŸááºáá»ááºáá»á¬ážááŸáá·áºá¡áá® ááá¯ááºáá¬áááºááŒá áºááŒá®ážá ááá¯á·áá±á¬áº áááºáá®ážáá°áá»á¬áž áá»áŸá±á¬áºááá·áºáá¬ážááá·áºá¡áá¬ááŸáá·áº áá¯á¶ážáááœá¬ááŒá¬ážááœá¬ážáááºááŒá áºáááºá
á€áá±á¬ááºážáá«ážááœáẠáá»áœááºá¯ááºááẠáááºááœá±á·ááœáẠááá¬ážáááºá¡áááºááŒá¯ááŒááºážá¡á¬áž á¡áá¯á¶ážááŒá¯ááẠá¡áááá ááºážá á¬ážáá±áá±á¬ááŒá±á¬áá·áº ááá¯á¡áá»áááºááœáẠáá¶áá¶ááᯠáá±á«ááºážáááá¯ááºáá² á¡ááºááá¯áá®áááºááŸá¯ááºááœá±ážááŸá¯ááŸáá·áº ááŒááºááá±á«áºááá¯ááŸá¯á¡áá±á¡ááœááºáááºážáá«ážááá·áºá áá áºááᯠááœá±ážáá»ááºáááºááŒá áºáááºá
á áááºáááºáááá¯ááºáá»á¬ážááẠá€ááá¯á¡ááºáá»ááºáá»á¬ážááŸáá·áº á¡ááá¯ááºáá®áá¯á¶ážááŒá áºáá±á¬ááŒá±á¬áá·áº ááœá±ážáá»ááºááŸá¯ááŸá¬ Waves ááááºáá±á¬ááºážá០RIDE áááºáááá¯ááºáá»á¬ážáá±á«áºááœáẠáá»áááºážááœá¬ážáááº- áááºážááá¯á·ááẠTuring ááœáẠááŒá®ážááŒáá·áºá á¯á¶ááŒááºážáááŸááá±ážáá² áááºážááá¯á·á á¡ááŒáá·áºáá¯á¶ážááŸá¯ááºááœá±ážááŸá¯ááẠá¡áá¯á¡áá±á¬ááºááá·áºáááºáá»ááºááŒá áºáááºá
áá«áá±ááá·áº áá»áœááºáá±á¬áºááá¯á·á á¡á²áá«ááœá±ááᯠáááºážááá¬ááá¯ááºážááá±áá² áá®ážááá·áºá ááºážá á¬ážáááºá
á¡áá¬á¡á¬ážáá¯á¶ážá¡ááŒááºá ááá¬ážáááºá¡áááºááŒá¯áá»ááºááẠá¡áá°ážáááŒáá·áº áááºááá·áºá
á¬áá»á¯ááºáá»á¬ážá¡ááœááºáááᯠááá¯á¡ááºáá»ááºááŒá
áºáááº- á
á¬áá»á¯ááºááá¯á
áááºááŒá®ážáá±á¬ááºááœáẠá¡ááŸá¬ážá¡ááœááºážáá
áºáá¯ááᯠááŒá¯ááŒááºááẠáá»á¬ážáá±á¬á¡á¬ážááŒáá·áº áááŒá
áºááá¯ááºáá±á
áá¶áá¯á¶ááœá±á¡ááŒá±á¬ááºá¡ááŒá¬ážááᯠá
áááºáááºáááá¯ááºáá»á¬ážááœáẠáááŒá¬ááááááºážáááºážáá¬ážáá±á¬ááŒá±á¬áá·áº ááá¯áá²á·ááá¯á·áá±á¬á¡ááŸá¬ážáá»á¬ážááá¯ááºáá»á
ááááºááẠá¡ááœááºááŒáá·áºáá¬ážááá¯ááºáááºá
áá»áœááºá¯ááºá áááºá¹áá±á virtual machine ááᯠPHP ááŸáá·áº Python ááŒáá·áº áá±ážáá¬ážáá¬ážááŒá®áž áááẠSMT áá±á¬áºááŒá°áá¬áá»á¬ážááᯠááŒá±ááŸááºážáááºá¡ááœáẠMicrosoft Research á០Z3Prover ááᯠá¡áá¯á¶ážááŒá¯áá«áááºá
áááºážá á¡á°ááá¯ááºááœáẠá¡á
áœááºážáááºáá±á¬ á¡áá±á¬ááºážá¡áááºáá±á«ááºážá
á¯á¶ ááŸá¬ááœá±ááŸá¯áá
áºáá¯ááŒá
áºáááºá
ááœá±áá±ážááœá±áá°áá»á¬ážá
áœá¬ááá¯á¡ááºáá±á¬áºáááºáž ááŒá±ááŸááºážáá»ááºáá»á¬ážááŸáá·áº á¡á¬ážáááºážáá»ááºáá»á¬ážááᯠááŸá¬ááœá±ááá¯ááºá
á±áá«áááºá
áááº
ááá¯á·áá±á¬áº á¡á®áá¬á á¬áá»á¯ááºáá»á¬ážááẠááá¯áááŸá¯ááºááœá±ážááŒá®áž Turing ááẠááŒá®ážááŒáá·áºá á¯á¶ááŒá±á¬ááºáž áááááŒá¯ááá·áºáááºá
PHP ááẠRIDE á áááºá á¬áá»á¯ááºá áááºážááŒá áºáá¯ááºááᯠpython script á¡ááŒá Ạáá¬áá¬ááŒááºáá±ážáááºá áááºážááœáẠáááá¯ááááºá¡á¬áž áááºážááá¯á·á áá°ážááŒá±á¬ááºážááŸá¯áá»á¬ážá¡ááœáẠá á¬áá»á¯ááºá¡ááŒá±á¡áá±áá»á¬ážááŸáá·áº á¡ááŒá±á¡áá±áá»á¬ážááᯠZ3 SMT-áááá¬áááŒá áºáá±á¬ á áá áºá¡ááŒá ẠáááºááŒáá¬ážáááºá
ááᯠáá»áœááºá¯ááºááẠá¡ááœááºážá ááŒá
áºáá»ááºáá±ááá·áºá¡áá¬áá»á¬ážááᯠááá¯ááá¯á¡áá±ážá
áááºáá±á¬áºááŒáá«áááºá
ááá¯á·áá±á¬áº áŠážá áœá¬á RIDE á áááºá á¬áá»á¯ááºáá¬áá¬á áá¬ážááŸáá·áºáááºáááºáá±á¬ á áá¬ážáá¯á¶ážá¡áááºážáááºá
áááºážááẠáá®ááá¯ááºážááŒáá·áº áá»ááºážáááá±á¬ áá¯ááºáá±á¬ááºáá»ááºááŸáá·áº á
áá¬ážáááºá¡ááŒá±áᶠáááá¯ááááºážáááºážáá¬áá¬á
áá¬ážáá
áºáá¯ááŒá
áºáááºá
RIDE ááẠblockchain á¡ááœááºáž áá®ážááŒá¬ážáá¯ááºáá±á¬ááºááŒá®áž á¡áá¯á¶ážááŒá¯áá°á ááá¯ááºáá¶á¡áááºááŸáá·áº áá»áááºáááºáá¬ážáá±á¬ ááá¯ááŸá±á¬ááºááŸá¯á០á¡áá»ááºá¡áááºáá»á¬ážááᯠááá°ááŒá®áž áá±ážáá¬ážááá¯ááºáááºá
ááá¯ááºáá¶á¡áááºáá áºáá¯á á®ááœáẠRIDE á á¬áá»á¯ááºááᯠááẠáá°ážááœá²ááá¯ááºááŒá®ážá á¡áá±á¬ááºá¡áááºáá±á¬áºááŸá¯áááááºááẠááŸááºáááºááẠááá¯á·ááá¯áẠááŸá¬ážááŒááºážáá¬ááŒá áºáááá·áºáááºá
TRUE ááá¯áááºááŸá¬ á
áááºá
á¬áá»á¯ááºááẠá¡áá±á¬ááºážá¡áááºááŒá¯áá¯ááºááŒááºážááᯠááœáá·áºááŒá¯áá¬ážááŒá®áž FALSE ááá¯áááºááŸá¬ áááºážááᯠáá¬ážááŒá
áºáá¬ážáááºá
ááá¯ážááŸááºážáá±á¬á¥ááá¬- ááá¯ááºáá¶á¡áááºáááºáá»áẠ100 áááºáááºážáá«á script áá
áºáá¯ááẠááœáŸá²ááŒá±á¬ááºážááŒááºážááá¯áá¬ážááŒá
áºááá¯ááºáááºá
á¥ááá¬á¡áá±áá²á·á áá°áá®áá²á· Wolf, Goat, and Cabbage ááá¯áá°áááºá áá«áá±ááá·áº á áááºáá»áá²á· á á¬áá»á¯ááºáá¯á¶á á¶áá²á· áááºááŒáá¬ážááŒá®ážáá¬ážáá«á
áá°ááá¯ááºážááᯠáá áºáááºááá¯á· áááá¯á·ááá»ááºáž áá¯á¶ážá áœá²áá°ááẠá á¬áá»á¯ááºááᯠá¡áá¯á¶ážááŒá¯áá¬ážááá·áº ááá¯ááºáá¶á¡áááºá០ááœá±áá¯ááºáá°ááá¯ááºáááºááá¯ááºáá±á
#ÐзвлекаеЌ пПлПжеМОе вÑеÑ
ПбÑекÑПв Оз блПкÑейМа
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 ááẠáááºážááá¯á·ááá±á¬á·áá»á¬ážáá¯á¶á á¶ááŸáá·áº áááºááá¯ááºáá±á¬ Boolean expression variable á¡ááŒá Ạá áááºá á¬áá»á¯ááºá០variable á¡á¬ážáá¯á¶ážááᯠáá¯ááºáá°áááºá
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 ááẠáááºážááá¯á·á¡á¬áž Python ááŸá Z3Prover SMT-áááá¬áá
áá
áºáá±á¬áºááŒáá»ááºá¡ááŒá
áºááá¯á· ááŒá±á¬ááºážáá²áá±ážáááºá
áá±áá¬ááᯠááá¯ááŸá±á¬ááºááŸá¯ááááºážááŸááºáá»á¬ážááẠá¡ááœáŸááºáž i ááá¯áááŸááááºá ááœá±áá±ážááœá±áá°ááááºážááŸááºáá»á¬áž á¡ááœáŸááºáž i + 1á ááŸáá·áº á
áá¬ážáááºáá»á¬ážáá«áá±á¬ ááááºážááŸááºáá»á¬ážááẠááááºá¡ááŒá±á¡áá±á០áá±á¬ááºáá
áºáá¯ááá¯á· áá°ážááŒá±á¬ááºážááŒááºážá¡ááœáẠá
ááºážáá»ááºážáá»á¬ážááᯠáááºááŸááºáá±ážááá·áº ááœááºážáááºáá
áºáá¯ááœáẠáá±áá¬ááᯠáá¯ááºááá¯ážáá¬ážáááºá
á€á¡áá¬ááẠáá»á¬ážá áœá¬áá±á¬ ááœá±áá±ážááœá±áá° ááŸá¬ááœá±áá±ážá¡ááºáá»ááºááᯠáá¶á·ááá¯ážáá±ážááá·áº áá»áœááºá¯ááºááá¯á·á virtual machine á á¡ááá ááŸáá¯á¶ážáá¬ážááŒá áºáááºá
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] )
á¡ááŒá±á¡áá±áá»á¬ážááᯠPython ááœáẠSMT á áá áºá¡ááŒá±á¬ááºážáá±á¬áºááŒááẠáá®ááá¯ááºážáá¯ááºáá¬ážáá±á¬ script template áá áºáá¯ááœáẠá¡ááŒá±á¡áá±áá»á¬ážááᯠá á®ááœá²ááŒá®áž ááá·áºááœááºážáá¬ážáááºá
ááᬠáá¯á¶á á¶ááœááº
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()
ááœááºážáááºáá áºáá¯áá¯á¶ážááŸá áá±á¬ááºáá¯á¶ážá¡ááŒá±á¡áá±á¡ááœááºá ááœáŸá²ááŒá±á¬ááºážááœá±áá±ážááœá±áá°ááá¹áááœáẠáááºááŸááºáá¬ážááá·áº á ááºážáá»ááºážáá»á¬ážááᯠáá»áá·áºáá¯á¶ážáá«áááºá
ááá¯ááá¯áááºááŸá¬ Z3Prover ááẠáá±á¬ááºáá¯á¶ážááœáẠáááºáá¯á¶ááœá±áá»á¬ážááᯠá á¬áá»á¯ááºá០áá¯ááºáá°ááœáá·áºááŒá¯ááá·áº ááá¯áá²á·ááá¯á·áá±á¬ á¡ááŒá±á¡áá±áá»á¬ážááᯠá¡ááá¡áá» ááŸá¬ááœá±áááá·áºáááºááŒá áºáááºá
ááááºá¡áá±ááŒáá·áº áá»áœááºá¯ááºááá¯á·ááẠáá»áœááºá¯ááºááá¯á·áá
á¬áá»á¯ááºá á¡ááŒáá·áºá¡ááá¯ááºáá±á¬ááºááá¯ááºáá±á¬ SMT áá±á¬áºáááºááᯠá¡ááá¯á¡áá»á±á¬ááºáááŸááááºááŒá
áºáááºá
áá»áœááºá¯ááºááá¯ááºááá¯áẠáá±ážáá¬ážááŒá¯á
á¯áá²á·áá±á¬ áá»áœááºá¯ááºáááááºáá±á¬ááºážáá«ážá០áá±á¬áºáááºááŸáá·áº á¡ááœááºáááºáá°áááºááᯠáááºááœá±á·ááŒááºááá¯ááºáá«áááºá
ááŒá®ážááŒá±á¬ááºáá±á¬áá¯á¶á á¶
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()
á áááºááŒá®ážáá±á¬ááºá Z3Prover ááẠá áááºáá»áá±á¬ á á¬áá»á¯ááºááᯠááŒá±ááŸááºážááŒá®áž áááºáá¯á¶ááœá±áá»á¬ážááᯠáá¯ááºáá°ááá¯ááºá á±ááá·áº á¡áá±á¬ááºážá¡áááºááœááºážáááºáá áºáá¯ááᯠáá±ážáá±á¬ááºáááº-
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
áá°ážááá¯á·á á¬áá»á¯ááºá¡ááŒááºá áááºááẠáááºáááá¯ááºááá¯ááºá á¬áá»á¯ááºáá»á¬ážááᯠá ááºážáááºááá¯ááºááẠááá¯á·ááá¯áẠá¡áá±á¬ááºážá¡áááºááŒá¯áá¯ááºáá¬ááœáẠááŒá±ááŸááºážááá¯ááºááá·áº á€ááá¯ážááŸááºážáá±á¬á¥ááá¬ááᯠá ááºážááŒáá·áºáá«á
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
}
á€áááºááŸá¬ ááááá¯á¶ážáá¬ážááŸááºážááŒá
áºáá±á¬ááŒá±á¬áá·áº syntax ááẠá¡ááœááºá¡ááá·áºá¡áááºááŸáááŒá®áž áá»áœááºááœááºážááŸá¯áá»á¬ážááŸáááá¯ááºáááºá
á¡á±á¬ááºáá«áá±á¬ááºážáá«ážáá»á¬ážááœááºá áá»áœááºá¯ááºááẠVM ááá±á¬ááºáááºááœá¶á·ááŒáá¯ážááá¯ážáááºááŸá¯ááᯠááŒá¯á¶áá¯á¶áááºá
á®á
ááºáá¬ážááŒá®áž áááºážááá¯á·ááá¯ááŒá±ááŸááºážáá¯á¶áááºááá¯ááºáá² áááºážá¡áá°á¡áá®ááŒáá·áº ááá¬ážáááºá¡áááºááŒá¯áá¬ážáá±á¬á
áááºá
á¬áá»á¯ááºáá»á¬ážááᯠáááºáááºáá²á·ááá¯á·áááºáá®ážááá¯ááºáááºááá¯ááŒááááºá
á®á
ááºáá¬ážáááºá
character virtual machine ááŸá¬ áááá¯ááºáá«áááºá
áá¯á¶áá±á¬áẠVM á á¡áááºážá¡ááŒá
áºáá¯ááºááᯠá¡á
á®á¡á
á¥áºááŒá¯áá¯ááºááŒá®áž ááá¯áá±áá¬ááœáẠááŸááºáá»ááºáá»á¬ážááá·áºááŒá®ážáá±á¬ááºá áááºážááᯠGitHub ááœáẠá¡ááá²á·á¡áá¯á¶ážááŒá¯ááœáá·áºáá±ážááẠá
á®á
ááºáá¬ážáá«áááºá
source: www.habr.com