ααΆααααααααααΆααααΆααααΌαααΆαααΊααΆααΆααααααααααΆαααααααα·ααΈαα½α α¬αααα½ααααααααΆααααααααΎαααααα·ααΈααααααααα
αααααΊααΆαα·ααΈααΆαααααααααΆαα₯αααα·αααααα»ααα½α αααα’αα»ααααΆαα±ααα’ααααααααααααΆαααΆααααααααααΆααα’αααα αααα»ααααααα·ααΈ α¬αααα αΆαααΆααΆαα·αααΆαα
ααΆααα·αααααΆαααα’α·ααααααααααααααΆααααααααααΆααααΆααααΌαααΆαα’αΆα
ααΎαααΎααα
αααα»αα§ααΆα αααααααΆααααααααΆααααα αΆαα
αα
αααα»αα’αααααααααααα»αααααΆααααααΌαααΈααΆααααααααααΆααααΆααααΌαααΆααααααα αΆαα
ααΆαααααα·ααΈ α αΎααα·αααααΆα’αααΈαααα
ααΎαα½αααα’αΆα
ααααααααα
ααΆααααααααα
αααΆααααααΌαααΆααααααααααααααααααΆααααααααααΆα
ααΎααααΈααααΎααΌα ααααααα»αααΆαααααα analogue ααααΆαααααα½ααααααααα»ααααααΆαααΈααα·αααα·ααααααααΎαααααΆααααα·αα·ααααααααΆα
ααΆαααααΌααααααα·ααΈ α αΎαααααααααΆαα ααΆαααααααααααΈααΆα (SMT) αααα’αΆα ααααΌαααΆααααααααΆαααΆααααααα·ααΈαα½α α αΎαα
αααααΆαααααααΆαα’αααΈααΆαααααΆαα·αα·ααααααααΆααααΌαααΆααααα αΆααα
ααΎα’ααΈαααΊαα·αααΆααααααα
αααα»αααΉααααααΆαααααααααααααΆααΆααΆα’αααΈα
ααΆαααααΆαα·αα·ααααααααΆααΊααΆαα·ααΈαα½αααΎααααΈααααΎαααΆααααααα·ααΈαααα»ααααααααΆαααααΆαα
ααΎαα½ααα·ααααααααααααΌααΆα αα·αααΆα§αααααα
αααααααααΆααααΆααααααααααΆαααααααα·ααΈααααΌαααΆαα
α§ααΆα ααα ααΎαα’αΆα ααααααααααααααααα αΌα αααα’αΆαα»αααααααΈαα½αα’αΆα ααααααααα·αααααΆαααΆαα½α α’αα·αααααΆαααΈααΈα ααΌαααααΈααΈ αα·αα’αΆαα»ααααααααααα α§ααΆα ααα 42α
ααΆαααααΆαα·αα·ααααααααΆαα αααα»αααΆαααααα½αααΉααααααα±ααααΎαααΌαα ααααΎαααΆααΎααΆα’αΆα αα αα½α αααααΆααααΎαααΎααααΈααα½αααΆααααααααααα ααααΆααα·αα§ααΆα ααααααααα»ααααααΆαααΆαααααααααα αΌαααααααα α¬ααααα»ααΆαααΆαα·αααΆααααΆαααΆααααααααααααααα
ααΎαβααΈβαααβαα βααα ααΎαβα’αΆα βαααααβα’αΆαα»αααααβαααα αΌαβαα βαααααβα’αααΈβαααβα’αΆα βααααΎβααΆα α αΎαβααααΎαβααβααβααΆαα»βααααααβααα»ααααα α§ααΆα ααα ααΆαααβαααααΆααβα’αααβαααααααααα
αααα»αααααΈααα ααΎαααΉαααααΎαααΆαααΆαααααααααααααααααα·ααΈααΆααα’αα α¬ααα½αααΆαααααα»ααΆαααΆααΆααααααααΆααααααα’ααααααααααααααΆααα»ααααα·ααΆαα
ααΆα’αΆα ααααΌαααΆαααααααααΆααααΆααΆαααααα·ααααα·αα»ααΆααααααααα·ααΈαααααΆααα·αααααααααα αΌαααΆααααΆααααΊααΆααααΈαα·αααααααΆαααααα·ααααα·αα·αα·ααααααααΆα
ααΌα αααα VM αα½α’αααααααααααα»αααα’αΆα ααααΎαααΆααααα»αααααααααΆααααΆααααΆαααΈααα·αααα·ααααααααΆααααααα
αα αααα»αααα·ααααααα α’ααααααα»α ααα’αΆα ααααΎαααΆααα·ααααααααα»αααα·αααααααΆααααααααααΆααααΆααααΌαααΆαααΆαα½αααΉαααΆααα·ααΆααααΆα’αααΈααΆαααααααααααααααΆα
αααα αΆα ααααααΊα
- ααΆααααα»ααα½αααααΆα αΆααααΆααααΈααΆααααααααααΆααααΆααααΌαααΆααα ααΈαααα»αααΆαααααΆααα α»αααα P=NP
- ααΆαααααΎαααΆαααΆαα α αα ααΆααααααααααα―αααΆα αααααΆα αα·ααααααααααα»αααΆααααα ααααααααααΊαα·ααΆααααα»αααΆααααααααααΆαα
- ααα α»ααα αααα»αααΆααααααΆαα αα ααααααα’αα·αα·αα α¬α’αααααααααααααα·ααΈααΆαααααα’αααΈαα½α ααα»αααααα·αααΆααα·αααααΆααΆα±ααααααΉαααααΌααααααααααΆαααα αααα»ααααααααα αα ααααααααααα
ααΆαααααα αααααα·ααΈααΉαααααΌαααΆααααααααααΆαα αα·αα’αα»αααααΆαααΆααααααΆαα ααα»ααααααΉαααααΎα’αααΈαα½ααα»αααΈα’αααΈαααα’ααααααααΎαααααΉααα»αααΈααΆα
αααααΆααα αααα»αα’αααααααααααα»ααααα»ααα·α αΆαααΆααΆα ααααααΎααΆαααααΎααααΆααααΆααααααααααΆααααΆααααΌαααΆααααα»αααΆαα’αα»αααα αααα»αααΉααα·αααΆαααααΆααααα»ααααααΉααααααΆαααααααΆαααααααααα α αΎαααΉαααααΎαααΎααααααααααααααΆααααα»αααααΆααααααα½ααααααααΆα αα·αα ααα½αααααΆαα α ααΆααααα ααΆααα·α αα½α αααα»αα
αααααΆααα·α αα αααααΆααααΆααααααααα·αααααα»αααΉααααααΌαααΆαααΆααααα αααααΎαααΆαααααΆααααΎαα·α αα αααααΆ RIDE ααΈαααα·ααΆ Wavesα αα½ααααα·αααΆααααα αα Turing α αΎαααΆααααα»αααααΆαα’αα·ααααΆαααααα½αααααααΌαααΆααααααααααα·ααααα·αααα·αα
ααα»ααααααΎαααΉααα·α αΆαααΆαα½αααΆααΆαααααα»αααΈααααααα αα αααααα
ααααααααΈααΎα’αααΈαααΆααα’αα ααΆααααααααααΆααααΆααααΌαααΆαααΉαααΆααααααΌαααΆαααΆαα·ααααααααΆαααα·α
αα
αααααΆααΆαα½αα ααΆααααααΆααΆαα·αα’αΆα
αα
αα½α
αααααα»αααΆαααααα α»ααα·α
αα
αααααΆαααααΆααααΈααΆααααΌαααΆαααΆααα±ααααααΎαααΆαα
α αΎααααααααααα α»αααααααα’αΆα
αααααααΆαα αααααααΆα
ααα½αααΉαααααΆααααα
αααΎαααααΌαααΆααααααΆαα»ααα
ααΎαα·α
αα
αααααΆααααΆαααα
αααΆαααΈααα·αααα·ααα·αααα·ααααααααα»αααααΌαααΆααααααααΆ PHP αα·α Python α αΎαααααΎ Z3Prover ααΈ Microsoft Research ααΎααααΈαααααααΆαααΌααααα SMT ααααααα
αα
ααααΌαααααααΆααΊααΆαααααααααα α»ααααα·ααααα·ααΆαααααΆαα₯αααα·αα, ααα
α’αα»ααααΆαα±ααα’αααααααααααααααααααΆα α¬ααΆαααΆαααααααα αααααΈααΆααΆααααΌαααΆαααααα·ααααα·ααΆαααΆα
αααΎααααααα
ααΌααααΈαα
ααα»ααααααΆαα½αα±ααααααααααΆααααΆαα·α αα αααααΆα’αααΎαααΊαααα»αααααΆαααΆαα αΎα Turing ααΆααααα ααα
PHP ααααααααΌαααααααααα·α αα αααααΆααααΆααα RIDE αα ααΆααααααΈα python ααααααα»αααααααααα·ααΈααααΌαααΆααααα αΆαααΆαααααααα Z3 SMT-compatible αααα·α αα αααααΆ αα·ααααααααααααααΆααααΆαααααΆααααααΌααααααα½αααα
α₯α‘αΌαααααααα»αααΉααααααΆααα’αααΈα’αααΈααααααα»αααΎαα‘αΎααα
ααΆααααα»ααααΆααααα’α·ααααααααααα
ααα»ααααααΆααααΌα ααΆαααααΈαααΈα’αααΈααΆααΆαα·α αα αααααΆααααΆααα RIDE α
ααΆααΆααΆααΆααααααααααα·ααΈαααααΆααα»αααΆα αα·αααΆααααα
ααααα· ααααααα·αααΆαααΆααα
ααΆα
RIDE ααααΎαααΆααααα»αααΆαα―αααα
αααα»α blockchain α αΎαα’αΆα
ααΆααα αα·ααααααααααααΆαααΈααΆααααα»ααααααααΆαααα
ααΉαααΆααΌαααααα’αααααααΎα
α’αααα’αΆα ααααΆαααα·α αα αααααΆ RIDE αα ααΉαααΆααΌαααΈαα½αα α αΎαααααααααααΆαααααα·ααααα·ααΉαααααΆααααααΆααΆααα·α α¬αα·ααα·αααα»αααααα
TRUE ααΆααααααΆαα·α
αα
αααααΆααααΆαααα’αα»ααααΆαα±ααααααΎααααα·ααααα·ααΆα α αΎα FALSE ααΆααααααΆααΆα αΆαααΆααααΆα
α§ααΆα αααααΆααααα ααααααΈαα’αΆα
α αΆαααΆααααΆαααααα ααααα·αααΎαααα»αααααΆααΌαααΆααα·α
ααΆα 100α
ααΆα§ααΆα ααα αααα»αααΉαααα α α ααα αα·ααααααααααααΌα ααααΆ ααα»ααααααΆααααα αΆααα½α α αΎααααα»ααααααααα·α αα αααααΆααααααΆαααα
α’αααααααΎααααΆααααΉααα·αα’αΆα ααααααΆααααΈααΆααΌαααααα·α αα αααααΆααααΌαααΆαααΆαααααααΆαααΆααα αα αΌαααΆααααααΆααααΆααααααΌαα’ααααααααααααΆαα ααααΆααααα
#ΠΠ·Π²Π»Π΅ΠΊΠ°Π΅ΠΌ ΠΏΠΎΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π²ΡΠ΅Ρ
ΠΎΠ±ΡΠ΅ΠΊΡΠΎΠ² ΠΈΠ· Π±Π»ΠΎΠΊΡΠ΅ΠΉΠ½Π°
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 ααααΌαααΆαααα’αααααΆααα’ααα ααααΈαα·α αα αααααΆααααΆααααααα»αααααααααΆααΌααααααααα½ααα αα·αα’ααααααααααααΌααΈααααααααΌαααααΆα
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 ααααααααα½αααΆαα
ααΆ Z3Prover SMT-compatible system description αα
αααα»α Pythonα
αα·ααααααααααΌαααΆααα»ααα
αααα»αααααα·ααα»ααααα’ααααααα»αααα½αααΆαααααααααα i αααααααααααααα·ααααα·ααΆαα’ααα i + 1 αα·αα’ααααααααΆααααααααααααα
αααΆαααααααΆααααΆαααααΆααααααΌαααΈαααααα»ααα
αααααααααΆααα
αααααΊααΆαααααΌααααααΆαααΈααα·αααα·αααααααΎα ααααααααααΌααααΆαααΈαααααααααα α»ααααα·ααααα·ααΆαα
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] )
ααααααααααααΌαααΆααααααα αα·ααααα αΌααα αααα»αααααΌααααααΈααααααααΌαααΆααα ααΆα‘αΎαααΎααααΈαα·αααααΆα’αααΈαααααααα SMT αα αααα»α Python α
ααααΌααα
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
ααααααααΈααΎαα·α αα αααααΆααΆα‘αΆα α’αααα’αΆα αα·αααααααΆαα½ααα·α αα αααααΆααααΆαααααα½αααααα’ααα α¬ααΆαααααα§ααΆα αααααΆααααααα αααααααΌαααΆααααααααΆαααΆ 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
}
αααααΆααααααΊααΆααααααααΌααααα»α ααΆαααααααααααααΆαααααα·αααααΆαα α αΎαα’αΆα
ααΆαααα α»αα
αα
αααα»αα’αααααααΆαααααα αααα»αααΆαααααααααααααααααααΆαα’αα·ααααααααααααααα VM αα·ααααα αΆαααΈαααααααα’αααα’αΆα
αααααΎααα·α
αα
αααααΆααααΆααααααααααΌαααΆααααααααααΆααααΆααααΌαααΆαααΆαα½αααΉααααα½αααααααΆ α αΎααα·αααααΉααααααααααΆαααΆααα»αααααααα
αααΆαααΈααα·αααα·ααα½α’ααααααΆααα
αααααΆααααΈααΆααααΌαααααααααα·αα·ααααααααΆ VM ααΆαααααΆααααααα αα·αααααααααα·ααααααα
ααΈααα αααα»αααΆαααααααααΆααααΆαα
ααΎ GitHub αααα₯ααα·αααααα
ααααα: www.habr.com