ื™ืฆื™ืจืช ืžืขืจื›ืช ืื™ืžื•ืช ืจืฉืžื™ืช ืžืืคืก. ื—ืœืง 1: ืžื›ื•ื ื” ื•ื™ืจื˜ื•ืืœื™ืช ืฉืœ ื“ืžื•ืช ื‘-PHP ื•-Python

ืื™ืžื•ืช ืคื•ืจืžืœื™ ื”ื•ื ืื™ืžื•ืช ืฉืœ ืชื•ื›ื ื™ืช ืื• ืืœื’ื•ืจื™ืชื ืื—ื“ ื‘ืืžืฆืขื•ืช ืื—ืจ.

ื–ื•ื”ื™ ืื—ืช ื”ืฉื™ื˜ื•ืช ื”ื—ื–ืงื•ืช ื‘ื™ื•ืชืจ ื”ืžืืคืฉืจื•ืช ืœืžืฆื•ื ืืช ื›ืœ ื”ืคื’ื™ืขื•ื™ื•ืช ื‘ืชื•ื›ื ื™ืช ืื• ืœื”ื•ื›ื™ื— ืฉื”ืŸ ืื™ื ืŸ ืงื™ื™ืžื•ืช.

ืชื™ืื•ืจ ืžืคื•ืจื˜ ื™ื•ืชืจ ืฉืœ ืื™ืžื•ืช ืคื•ืจืžืœื™ ื ื™ืชืŸ ืœืจืื•ืช ื‘ื“ื•ื’ืžื” ืฉืœ ืคืชืจื•ืŸ ื”ื‘ืขื™ื” ืฉืœ ื–ืื‘, ืขื– ื•ื›ืจื•ื‘ ื‘ืžืืžืจ ื”ืงื•ื“ื ืฉืœื™.

ื‘ืžืืžืจ ื–ื” ืื ื™ ืขื•ื‘ืจ ืžืื™ืžื•ืช ืคื•ืจืžืœื™ ืฉืœ ื‘ืขื™ื•ืช ืœืชื•ื›ื ื™ื•ืช ื•ืžืชืืจ ื›ื™ืฆื“
ื›ื™ืฆื“ ื ื™ืชืŸ ืœื”ืžื™ืจ ืื•ืชื ืœืžืขืจื›ื•ืช ื›ืœืœื™ื ืคื•ืจืžืœื™ื•ืช ื‘ืื•ืคืŸ ืื•ื˜ื•ืžื˜ื™.

ืœืฉื ื›ืš, ื›ืชื‘ืชื™ ืื ืœื•ื’ื™ ืžืฉืœื™ ืœืžื›ื•ื ื” ื•ื™ืจื˜ื•ืืœื™ืช, ืชื•ืš ืฉื™ืžื•ืฉ ื‘ืขืงืจื•ื ื•ืช ืกืžืœื™ื™ื.

ื”ื•ื ืžื ืชื— ืืช ืงื•ื“ ื”ืชื•ื›ื ื™ืช ื•ืžืชืจื’ื ืื•ืชื• ืœืžืขืจื›ืช ืžืฉื•ื•ืื•ืช (SMT), ืืฉืจ ื›ื‘ืจ ื ื™ืชื ืช ืœืคืชืจื•ืŸ ืคืจื•ื’ืจืžื˜ื™ืช.

ืžื›ื™ื•ื•ืŸ ืฉืžื™ื“ืข ืขืœ ื—ื™ืฉื•ื‘ื™ื ืกืžืœื™ื™ื ืžื•ืฆื’ ื‘ืื™ื ื˜ืจื ื˜ ื‘ืฆื•ืจื” ืžืงื•ื˜ืขืช ืœืžื“ื™,
ืื ื™ ืืชืืจ ื‘ืงืฆืจื” ืžื” ื–ื”.

ื—ื™ืฉื•ื‘ ืกืžืœื™ ื”ื•ื ื“ืจืš ืœื”ืคืขื™ืœ ื‘ื• ื–ืžื ื™ืช ืชื•ื›ื ื™ืช ืขืœ ืžื’ื•ื•ืŸ ืจื—ื‘ ืฉืœ ื ืชื•ื ื™ื ื•ื”ื•ื ื”ื›ืœื™ ื”ืขื™ืงืจื™ ืœืื™ืžื•ืช ืชื•ื›ื ื™ืช ืคื•ืจืžืœื™ืช.

ืœื“ื•ื’ืžื”, ืื ื• ื™ื›ื•ืœื™ื ืœื”ื’ื“ื™ืจ ืชื ืื™ ืงืœื˜ ืฉื‘ื”ื ื”ืืจื’ื•ืžื ื˜ ื”ืจืืฉื•ืŸ ื™ื›ื•ืœ ืœืงื‘ืœ ื›ืœ ืขืจืš ื—ื™ื•ื‘ื™, ื”ืฉื ื™ ื”ืฉืœื™ืœื™, ื”ืฉืœื™ืฉื™ ืืคืก ื•ืืจื’ื•ืžื ื˜ ื”ืคืœื˜, ืœืžืฉืœ, 42.

ื—ื™ืฉื•ื‘ื™ื ืกืžืœื™ื™ื ื‘ืจื™ืฆื” ืื—ืช ื™ืชื ื• ืœื ื• ืืช ื”ืชืฉื•ื‘ื” ื”ืื ื ื™ืชืŸ ืœื ื• ืœื”ืฉื™ื’ ืืช ื”ืชื•ืฆืื” ื”ืจืฆื•ื™ื” ื•ื“ื•ื’ืžื” ืœืกื˜ ืฉืœ ืคืจืžื˜ืจื™ื ืงืœื˜ ื›ืืœื”. ืื• ื”ื•ื›ื—ื” ืฉืื™ืŸ ืคืจืžื˜ืจื™ื ื›ืืœื”.

ื™ืชืจ ืขืœ ื›ืŸ, ืื ื• ื™ื›ื•ืœื™ื ืœื”ื’ื“ื™ืจ ืืช ืืจื’ื•ืžื ื˜ื™ ื”ืงืœื˜ ืœื›ืœ ื”ืืคืฉืจื™ื™ื, ื•ืœื‘ื—ื•ืจ ืจืง ืืช ืืœื” ื”ืคืœื˜, ืœืžืฉืœ, ืกื™ืกืžืช ืžื ื”ืœ ื”ืžืขืจื›ืช.

ื‘ืžืงืจื” ื–ื”, ื ืžืฆื ืืช ื›ืœ ื ืงื•ื“ื•ืช ื”ืชื•ืจืคื” ืฉืœ ื”ืชื•ื›ื ื™ืช ืื• ื ืงื‘ืœ ื”ื•ื›ื—ื” ืฉืกื™ืกืžืช ื”ืžื ื”ืœ ื‘ื˜ื•ื—ื”.

ื ื™ืชืŸ ืœืฆื™ื™ืŸ ืฉื‘ื™ืฆื•ืข ืงืœืืกื™ ืฉืœ ืชื•ื›ื ื™ืช ืขื ื ืชื•ื ื™ ืงืœื˜ ืกืคืฆื™ืคื™ื™ื ื”ื•ื ืžืงืจื” ืžื™ื•ื—ื“ ืฉืœ ื‘ื™ืฆื•ืข ืกื™ืžื‘ื•ืœื™.

ืœื›ืŸ, ื”-VM ืฉืœ ื”ื“ืžื•ืช ืฉืœื™ ื™ื›ื•ืœ ืœืขื‘ื•ื“ ื’ื ื‘ืžืฆื‘ ืืžื•ืœืฆื™ื” ืฉืœ ืžื›ื•ื ื” ื•ื™ืจื˜ื•ืืœื™ืช ืจื’ื™ืœื”.

ื‘ื”ืขืจื•ืช ืœืžืืžืจ ื”ืงื•ื“ื ื ื™ืชืŸ ืœืžืฆื•ื ื‘ื™ืงื•ืจืช ื”ื•ื’ื ืช ืขืœ ืื™ืžื•ืช ืคื•ืจืžืœื™ ืชื•ืš ื“ื™ื•ืŸ ื‘ื—ื•ืœืฉื•ืชื™ื•.

ื”ื‘ืขื™ื•ืช ื”ืขื™ืงืจื™ื•ืช ื”ืŸ:

  1. ืคื™ืฆื•ืฅ ืงื•ืžื‘ื™ื ื˜ื•ืจื™, ืฉื›ืŸ ืื™ืžื•ืช ืคื•ืจืžืœื™ ืžืกืชื›ื ื‘ืกื•ืคื• ืฉืœ ื“ื‘ืจ ื‘-P=NP
  2. ืขื™ื‘ื•ื“ ืฉื™ื—ื•ืช ืœืžืขืจื›ืช ื”ืงื‘ืฆื™ื, ืจืฉืชื•ืช ื•ืื—ืกื•ืŸ ื—ื™ืฆื•ื ื™ ืื—ืจ ืงืฉื” ื™ื•ืชืจ ืœืื™ืžื•ืช
  3. ื‘ืื’ื™ื ื‘ืžืคืจื˜, ื›ืืฉืจ ื”ืœืงื•ื— ืื• ื”ืžืชื›ื ืช ื”ืชื›ื•ื•ื ื• ืœื“ื‘ืจ ืื—ื“, ืืš ืœื ืชื™ืืจื• ืื•ืชื• ืžืกืคื™ืง ืžื“ื•ื™ืง ื‘ืžืคืจื˜ ื”ื˜ื›ื ื™.

ื›ืชื•ืฆืื” ืžื›ืš, ื”ืชื•ื›ื ื™ืช ืชืื•ืžืช ื•ืชืขืžื•ื“ ื‘ืžืคืจื˜, ืืš ืชืขืฉื” ืžืฉื”ื• ืฉื•ื ื” ืœื—ืœื•ื˜ื™ืŸ ืžืžื” ืฉืฆื™ืคื• ืžืžื ื” ื”ื™ื•ืฆืจื™ื.

ืžื›ื™ื•ื•ืŸ ืฉื‘ืžืืžืจ ื–ื” ืื ื™ ืฉื•ืงืœ ื‘ืขื™ืงืจ ืฉื™ืžื•ืฉ ื‘ืื™ืžื•ืช ืคื•ืจืžืœื™ ื‘ืคื•ืขืœ, ืœื ืื“ืคื•ืง ืืช ืจืืฉื™ ื‘ืงื™ืจ ืœืขืช ืขืชื”, ื•ืื‘ื—ืจ ื‘ืžืขืจื›ืช ืฉื‘ื” ื”ืžื•ืจื›ื‘ื•ืช ื”ืืœื’ื•ืจื™ืชืžื™ืช ื•ืžืกืคืจ ื”ืฉื™ื—ื•ืช ื”ื—ื™ืฆื•ื ื™ื•ืช ื”ืŸ ืžื™ื ื™ืžืœื™ื•ืช.

ืžื›ื™ื•ื•ืŸ ืฉื—ื•ื–ื™ื ื—ื›ืžื™ื ืžืชืื™ืžื™ื ื‘ื™ื•ืชืจ ืœื“ืจื™ืฉื•ืช ื”ืœืœื•, ื”ื‘ื—ื™ืจื” ื ืคืœื” ืขืœ ื—ื•ื–ื™ RIDE ืžืคืœื˜ืคื•ืจืžืช Waves: ื”ื ืื™ื ื ืฉืœืžื™ื ืฉืœ Turing, ื•ื”ืžื•ืจื›ื‘ื•ืช ื”ืžืงืกื™ืžืœื™ืช ืฉืœื”ื ืžื•ื’ื‘ืœืช ื‘ืื•ืคืŸ ืžืœืื›ื•ืชื™.

ืื‘ืœ ื ืฉืงื•ืœ ืื•ืชื ืืš ื•ืจืง ืžื”ืฆื“ ื”ื˜ื›ื ื™.

ื‘ื ื•ืกืฃ ืœื›ืœ, ืื™ืžื•ืช ืคื•ืจืžืœื™ ื™ื”ื™ื” ืžื‘ื•ืงืฉ ื‘ืžื™ื•ื—ื“ ืขื‘ื•ืจ ื›ืœ ื—ื•ื–ื™ื: ื‘ื“ืจืš ื›ืœืœ ืื™ โ€‹โ€‹ืืคืฉืจ ืœืชืงืŸ ื˜ืขื•ืช ื‘ื—ื•ื–ื” ืœืื—ืจ ื”ืฉืงืชื•.
ื•ื”ืขืœื•ืช ืฉืœ ื˜ืขื•ื™ื•ืช ื›ืืœื” ื™ื›ื•ืœื” ืœื”ื™ื•ืช ื’ื‘ื•ื”ื” ืžืื•ื“, ืฉื›ืŸ ื›ืžื•ื™ื•ืช ื’ื“ื•ืœื•ืช ืœืžื“ื™ ืฉืœ ื›ืกืคื™ื ืžืื•ื—ืกื ื™ื ืœืขืชื™ื ืงืจื•ื‘ื•ืช ื‘ื—ื•ื–ื™ื ื—ื›ืžื™ื.

ื”ืžื›ื•ื ื” ื”ื•ื™ืจื˜ื•ืืœื™ืช ื”ืกืžืœื™ืช ืฉืœื™ ื›ืชื•ื‘ื” ื‘-PHP ื•-Python, ื•ืžืฉืชืžืฉืช ื‘-Z3Prover ืž-Microsoft Research ื›ื“ื™ ืœืคืชื•ืจ ืืช ื ื•ืกื—ืื•ืช ื”-SMT ืฉื”ืชืงื‘ืœื•.

ื‘ื‘ืกื™ืกื• ื”ื•ื ื—ื™ืคื•ืฉ ืจื‘ ืขืกืงืื•ืช ืจื‘ ืขื•ืฆืžื”, ืืฉืจ
ืžืืคืฉืจ ืœืš ืœืžืฆื•ื ืคืชืจื•ื ื•ืช ืื• ื ืงื•ื“ื•ืช ืชื•ืจืคื”, ื’ื ืื ื–ื” ื“ื•ืจืฉ ืขืกืงืื•ืช ืจื‘ื•ืช.
ืืคื™ืœื• ืžื™ืชืจื™ืœ, ืื—ืช ื”ืžืกื’ืจื•ืช ื”ืกืžืœื™ื•ืช ื”ื—ื–ืงื•ืช ื‘ื™ื•ืชืจ ืœืžืฆื™ืืช ืคื’ื™ืขื•ื™ื•ืช Ethereum, ื”ื•ืกื™ืคื” ื™ื›ื•ืœืช ื–ื• ืจืง ืœืคื ื™ ืžืกืคืจ ื—ื•ื“ืฉื™ื.

ืื‘ืœ ืจืื•ื™ ืœืฆื™ื™ืŸ ืฉื—ื•ื–ื™ ื”ืืชืจ ืžื•ืจื›ื‘ื™ื ื™ื•ืชืจ ื•ื˜ื™ื•ืจื™ื ื’ ืฉืœืžื™ื.

PHP ืžืชืจื’ืžืช ืืช ืงื•ื“ ื”ืžืงื•ืจ ืฉืœ ื”ื—ื•ื–ื” ื”ื—ื›ื RIDE ืœืกืงืจื™ืคื˜ python, ืฉื‘ื• ื”ืชื•ื›ื ื™ืช ืžื•ืฆื’ืช ื›ืžืขืจื›ืช ืชื•ืืžืช Z3 SMT ืฉืœ ืžืฆื‘ื™ ื—ื•ื–ื” ื•ืชื ืื™ื ืœืžืขื‘ืจื™ื ืฉืœื”ื:

ื™ืฆื™ืจืช ืžืขืจื›ืช ืื™ืžื•ืช ืจืฉืžื™ืช ืžืืคืก. ื—ืœืง 1: ืžื›ื•ื ื” ื•ื™ืจื˜ื•ืืœื™ืช ืฉืœ ื“ืžื•ืช ื‘-PHP ื•-Python

ืขื›ืฉื™ื• ืืชืืจ ืืช ื”ืžืชืจื—ืฉ ื‘ืคื ื™ื ื‘ื™ืชืจ ืคื™ืจื•ื˜.

ืื‘ืœ ืงื•ื“ื ื›ืœ, ื›ืžื” ืžื™ืœื™ื ืขืœ ืฉืคืช ื”ื—ื•ื–ื” ื”ื—ื›ื RIDE.

ื–ื•ื”ื™ ืฉืคืช ืชื›ื ื•ืช ืคื•ื ืงืฆื™ื•ื ืœื™ืช ื•ืžื‘ื•ืกืกืช ื‘ื™ื˜ื•ื™ ืฉื”ื™ื ืขืฆืœื ื™ืช ื‘ืขื™ืฆื•ื‘ื”.
RIDE ืคื•ืขืœ ื‘ื‘ื™ื“ื•ื“ ื‘ืชื•ืš ื”ื‘ืœื•ืงืฆ'ื™ื™ืŸ ื•ื™ื›ื•ืœ ืœืื—ื–ืจ ื•ืœื›ืชื•ื‘ ืžื™ื“ืข ืžืื—ืกื•ืŸ ื”ืžืงื•ืฉืจ ืœืืจื ืง ื”ืžืฉืชืžืฉ.

ืืชื” ื™ื›ื•ืœ ืœืฆืจืฃ ื—ื•ื–ื” RIDE ืœื›ืœ ืืจื ืง, ื•ืชื•ืฆืืช ื”ื‘ื™ืฆื•ืข ืชื”ื™ื” ืจืง โ€‹โ€‹TRUE ืื• FALSE.

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 ื‘-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, ื•ืœื”ืจืื•ืช ื›ื™ืฆื“ ื ื™ืชืŸ ืœื™ืฆื•ืจ ื—ื•ื–ื™ื ื—ื›ืžื™ื ืžืื•ืžืชื™ื ืจืฉืžื™ืช ื‘ืขื–ืจืชื•, ื•ืœื ืจืง ืœืคืชื•ืจ ืื•ืชื.

ื”ืžื›ื•ื ื” ื”ื•ื™ืจื˜ื•ืืœื™ืช ืฉืœ ื”ืชื•ื•ื™ื ื–ืžื™ื ื” ื‘ http://2.59.42.98/hyperbox/
ืœืื—ืจ ืฉืกื™ื“ืจืชื™ ืืช ืงื•ื“ ื”ืžืงื•ืจ ืฉืœ ื”-VM ื”ืกืžืœื™ ื•ื”ื•ืกืคืชื™ ืฉื ื”ืขืจื•ืช, ืื ื™ ืžืชื›ื ืŸ ืœืฉื™ื ืื•ืชื• ื‘-GitHub ืœื’ื™ืฉื” ื—ื•ืคืฉื™ืช.

ืžืงื•ืจ: www.habr.com

ื”ื•ืกืคืช ืชื’ื•ื‘ื”