Π€ΠΎΡΠΌΠ°Π»Π½Π° Π²Π΅ΡΠΈΡΠΈΠΊΠ°ΡΠΈΡΠ° Π΅ Π²Π΅ΡΠΈΡΠΈΠΊΠ°ΡΠΈΡΠ° Π½Π° Π΅Π΄Π½Π° ΠΏΡΠΎΠ³ΡΠ°ΠΌΠ° ΠΈΠ»ΠΈ Π°Π»Π³ΠΎΡΠΈΡΠ°ΠΌ ΠΊΠΎΡΠΈΡΡΠ΅ΡΡΠΈ Π΄ΡΡΠ³Π°.
ΠΠ²Π° Π΅ Π΅Π΄Π΅Π½ ΠΎΠ΄ Π½Π°ΡΠΌΠΎΡΠ½ΠΈΡΠ΅ ΠΌΠ΅ΡΠΎΠ΄ΠΈ ΠΊΠΎΡ Π²ΠΈ ΠΎΠ²ΠΎΠ·ΠΌΠΎΠΆΡΠ²Π° Π΄Π° Π³ΠΈ ΠΏΡΠΎΠ½Π°ΡΠ΄Π΅ΡΠ΅ ΡΠΈΡΠ΅ ΠΏΡΠΎΠΏΡΡΡΠΈ Π²ΠΎ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠ°ΡΠ° ΠΈΠ»ΠΈ Π΄Π° Π΄ΠΎΠΊΠ°ΠΆΠ΅ΡΠ΅ Π΄Π΅ΠΊΠ° ΡΠΈΠ΅ Π½Π΅ ΠΏΠΎΡΡΠΎΡΠ°Ρ.
ΠΠΎΠ΄Π΅ΡΠ°Π»Π΅Π½ ΠΎΠΏΠΈΡ Π½Π° ΡΠΎΡΠΌΠ°Π»Π½Π°ΡΠ° Π²Π΅ΡΠΈΡΠΈΠΊΠ°ΡΠΈΡΠ° ΠΌΠΎΠΆΠ΅ Π΄Π° ΡΠ΅ Π²ΠΈΠ΄ΠΈ Π²ΠΎ ΠΏΡΠΈΠΌΠ΅ΡΠΎΡ Π·Π° ΡΠ΅ΡΠ°Π²Π°ΡΠ΅ Π½Π° ΠΏΡΠΎΠ±Π»Π΅ΠΌΠΎΡ Π½Π°
ΠΠΎ ΠΎΠ²Π°Π° ΡΡΠ°ΡΠΈΡΠ° ΡΠ΅ ΠΏΡΠ΅ΡΡΠ»Π°ΠΌ ΠΎΠ΄ ΡΠΎΡΠΌΠ°Π»Π½Π° ΠΏΡΠΎΠ²Π΅ΡΠΊΠ° Π½Π° ΠΏΡΠΎΠ±Π»Π΅ΠΌΠΈΡΠ΅ Π½Π° ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΈ ΠΈ ΠΎΠΏΠΈΡΡΠ²Π°ΠΌ ΠΊΠ°ΠΊΠΎ
ΠΊΠ°ΠΊΠΎ ΠΌΠΎΠΆΠ΅ Π°Π²ΡΠΎΠΌΠ°ΡΡΠΊΠΈ Π΄Π° ΡΠ΅ ΠΏΡΠ΅ΡΠ²ΠΎΡΠ°Ρ Π²ΠΎ ΡΠΈΡΡΠ΅ΠΌΠΈ Π·Π° ΡΠΎΡΠΌΠ°Π»Π½ΠΈ ΠΏΡΠ°Π²ΠΈΠ»Π°.
ΠΠ° Π΄Π° Π³ΠΎ Π½Π°ΠΏΡΠ°Π²Π°ΠΌ ΠΎΠ²Π°, Π½Π°ΠΏΠΈΡΠ°Π² ΡΠ²ΠΎΡ Π°Π½Π°Π»ΠΎΠ³ Π½Π° Π²ΠΈΡΡΡΠ΅Π»Π½Π° ΠΌΠ°ΡΠΈΠ½Π°, ΠΊΠΎΡΠΈΡΡΠ΅ΡΡΠΈ ΡΠΈΠΌΠ±ΠΎΠ»ΠΈΡΠ½ΠΈ ΠΏΡΠΈΠ½ΡΠΈΠΏΠΈ.
ΠΠΎ Π°Π½Π°Π»ΠΈΠ·ΠΈΡΠ° ΠΏΡΠΎΠ³ΡΠ°ΠΌΡΠΊΠΈΠΎΡ ΠΊΠΎΠ΄ ΠΈ Π³ΠΎ ΠΏΡΠ΅Π²Π΅Π΄ΡΠ²Π° Π²ΠΎ ΡΠΈΡΡΠ΅ΠΌ Π½Π° ΡΠ°Π²Π΅Π½ΠΊΠΈ (SMT), ΠΊΠΎΡ Π²Π΅ΡΠ΅ ΠΌΠΎΠΆΠ΅ Π΄Π° ΡΠ΅ ΡΠ΅ΡΠΈ ΠΏΡΠΎΠ³ΡΠ°ΠΌΡΠΊΠΈ.
ΠΠΈΠ΄Π΅ΡΡΠΈ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΠΈΡΠ΅ Π·Π° ΡΠΈΠΌΠ±ΠΎΠ»ΠΈΡΠ½ΠΈΡΠ΅ ΠΏΡΠ΅ΡΠΌΠ΅ΡΠΊΠΈ ΡΠ΅ ΠΏΡΠ΅ΡΡΡΠ°Π²Π΅Π½ΠΈ Π½Π° ΠΠ½ΡΠ΅ΡΠ½Π΅Ρ ΠΏΡΠΈΠ»ΠΈΡΠ½ΠΎ ΡΡΠ°Π³ΠΌΠ΅Π½ΡΠ°ΡΠ½ΠΎ,
ΠΠ°ΠΊΡΠ°ΡΠΊΠΎ ΡΠ΅ ΠΎΠΏΠΈΡΠ°ΠΌ ΡΡΠΎ Π΅ ΡΠΎΠ°.
Π‘ΠΈΠΌΠ±ΠΎΠ»ΠΈΡΠΊΠΎΡΠΎ ΠΏΡΠ΅ΡΠΌΠ΅ΡΡΠ²Π°ΡΠ΅ Π΅ Π½Π°ΡΠΈΠ½ Π·Π° ΠΈΡΡΠΎΠ²ΡΠ΅ΠΌΠ΅Π½ΠΎ ΠΈΠ·Π²ΡΡΡΠ²Π°ΡΠ΅ Π½Π° ΠΏΡΠΎΠ³ΡΠ°ΠΌΠ° Π½Π° ΡΠΈΡΠΎΠΊ ΠΎΠΏΡΠ΅Π³ Π½Π° ΠΏΠΎΠ΄Π°ΡΠΎΡΠΈ ΠΈ Π΅ Π³Π»Π°Π²Π½Π°ΡΠ° Π°Π»Π°ΡΠΊΠ° Π·Π° ΡΠΎΡΠΌΠ°Π»Π½Π° Π²Π΅ΡΠΈΡΠΈΠΊΠ°ΡΠΈΡΠ° Π½Π° ΠΏΡΠΎΠ³ΡΠ°ΠΌΠ°ΡΠ°.
ΠΠ° ΠΏΡΠΈΠΌΠ΅Ρ, ΠΌΠΎΠΆΠ΅ΠΌΠ΅ Π΄Π° ΠΏΠΎΡΡΠ°Π²ΠΈΠΌΠ΅ Π²Π»Π΅Π·Π½ΠΈ ΡΡΠ»ΠΎΠ²ΠΈ ΠΊΠ°Π΄Π΅ ΡΡΠΎ ΠΏΡΠ²ΠΈΠΎΡ Π°ΡΠ³ΡΠΌΠ΅Π½Ρ ΠΌΠΎΠΆΠ΅ Π΄Π° ΠΈΠΌΠ° ΠΏΠΎΠ·ΠΈΡΠΈΠ²Π½ΠΈ Π²ΡΠ΅Π΄Π½ΠΎΡΡΠΈ, Π²ΡΠΎΡΠΈΠΎΡ Π½Π΅Π³Π°ΡΠΈΠ²Π΅Π½, ΡΡΠ΅ΡΠ°ΡΠ° Π½ΡΠ»Π° ΠΈ ΠΈΠ·Π»Π΅Π·Π½ΠΈΠΎΡ Π°ΡΠ³ΡΠΌΠ΅Π½Ρ, Π½Π° ΠΏΡΠΈΠΌΠ΅Ρ, 42.
Π‘ΠΈΠΌΠ±ΠΎΠ»ΠΈΡΠ½ΠΈΡΠ΅ ΠΏΡΠ΅ΡΠΌΠ΅ΡΠΊΠΈ Π²ΠΎ Π΅Π΄Π½ΠΎ Π²ΠΎΠ·Π΅ΡΠ΅ ΡΠ΅ Π½ΠΈ Π΄Π°Π΄Π°Ρ ΠΎΠ΄Π³ΠΎΠ²ΠΎΡ Π΄Π°Π»ΠΈ Π΅ ΠΌΠΎΠΆΠ½ΠΎ Π΄Π° Π³ΠΎ Π΄ΠΎΠ±ΠΈΠ΅ΠΌΠ΅ ΠΏΠΎΡΠ°ΠΊΡΠ²Π°Π½ΠΈΠΎΡ ΡΠ΅Π·ΡΠ»ΡΠ°Ρ ΠΈ ΠΏΡΠΈΠΌΠ΅Ρ Π·Π° ΠΌΠ½ΠΎΠΆΠ΅ΡΡΠ²ΠΎ ΠΎΠ΄ ΡΠ°ΠΊΠ²ΠΈ Π²Π»Π΅Π·Π½ΠΈ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠΈ. ΠΠ»ΠΈ Π΄ΠΎΠΊΠ°Π· Π΄Π΅ΠΊΠ° Π½Π΅ΠΌΠ° ΡΠ°ΠΊΠ²ΠΈ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠΈ.
ΠΠΎΠΊΡΠ°Ρ ΡΠΎΠ°, ΠΌΠΎΠΆΠ΅ΠΌΠ΅ Π΄Π° Π³ΠΈ ΠΏΠΎΡΡΠ°Π²ΠΈΠΌΠ΅ Π²Π»Π΅Π·Π½ΠΈΡΠ΅ Π°ΡΠ³ΡΠΌΠ΅Π½ΡΠΈ Π½Π° ΡΠΈΡΠ΅ ΠΌΠΎΠΆΠ½ΠΈ ΠΈ Π΄Π° Π³ΠΈ ΠΈΠ·Π±Π΅ΡΠ΅ΠΌΠ΅ ΡΠ°ΠΌΠΎ ΠΈΠ·Π»Π΅Π·Π½ΠΈΡΠ΅, Π½Π° ΠΏΡΠΈΠΌΠ΅Ρ, Π°Π΄ΠΌΠΈΠ½ΠΈΡΡΡΠ°ΡΠΎΡΡΠΊΠ°ΡΠ° Π»ΠΎΠ·ΠΈΠ½ΠΊΠ°.
ΠΠΎ ΠΎΠ²ΠΎΡ ΡΠ»ΡΡΠ°Ρ, ΡΠ΅ Π³ΠΈ Π½Π°ΡΠ΄Π΅ΠΌΠ΅ ΡΠΈΡΠ΅ ΠΏΡΠΎΠΏΡΡΡΠΈ Π½Π° ΠΏΡΠΎΠ³ΡΠ°ΠΌΠ°ΡΠ° ΠΈΠ»ΠΈ ΡΠ΅ Π΄ΠΎΠ±ΠΈΠ΅ΠΌΠ΅ Π΄ΠΎΠΊΠ°Π· Π΄Π΅ΠΊΠ° Π»ΠΎΠ·ΠΈΠ½ΠΊΠ°ΡΠ° Π½Π° Π°Π΄ΠΌΠΈΠ½ΠΈΡΡΡΠ°ΡΠΎΡΠΎΡ Π΅ Π±Π΅Π·Π±Π΅Π΄Π½Π°.
ΠΠΎΠΆΠ΅ Π΄Π° ΡΠ΅ Π·Π°Π±Π΅Π»Π΅ΠΆΠΈ Π΄Π΅ΠΊΠ° ΠΊΠ»Π°ΡΠΈΡΠ½ΠΎΡΠΎ ΠΈΠ·Π²ΡΡΡΠ²Π°ΡΠ΅ Π½Π° ΠΏΡΠΎΠ³ΡΠ°ΠΌΠ° ΡΠΎ ΡΠΏΠ΅ΡΠΈΡΠΈΡΠ½ΠΈ Π²Π»Π΅Π·Π½ΠΈ ΠΏΠΎΠ΄Π°ΡΠΎΡΠΈ Π΅ ΠΏΠΎΡΠ΅Π±Π΅Π½ ΡΠ»ΡΡΠ°Ρ Π½Π° ΡΠΈΠΌΠ±ΠΎΠ»ΠΈΡΠ½ΠΎ ΠΈΠ·Π²ΡΡΡΠ²Π°ΡΠ΅.
ΠΠ°ΡΠΎΠ°, ΠΌΠΎΡΠΎΡ Π»ΠΈΠΊ VM ΠΌΠΎΠΆΠ΅ Π΄Π° ΡΠ°Π±ΠΎΡΠΈ ΠΈ Π²ΠΎ ΡΠ΅ΠΆΠΈΠΌ Π½Π° Π΅ΠΌΡΠ»Π°ΡΠΈΡΠ° Π½Π° ΡΡΠ°Π½Π΄Π°ΡΠ΄Π½Π° Π²ΠΈΡΡΡΠ΅Π»Π½Π° ΠΌΠ°ΡΠΈΠ½Π°.
ΠΠΎ ΠΊΠΎΠΌΠ΅Π½ΡΠ°ΡΠΈΡΠ΅ Π½Π° ΠΏΡΠ΅ΡΡ ΠΎΠ΄Π½Π°ΡΠ° ΡΡΠ°ΡΠΈΡΠ° ΠΌΠΎΠΆΠ΅ Π΄Π° ΡΠ΅ Π½Π°ΡΠ΄Π΅ ΡΠ΅Ρ ΠΊΡΠΈΡΠΈΠΊΠ° Π½Π° ΡΠΎΡΠΌΠ°Π»Π½Π°ΡΠ° Π²Π΅ΡΠΈΡΠΈΠΊΠ°ΡΠΈΡΠ° ΡΠΎ Π΄ΠΈΡΠΊΡΡΠΈΡΠ° Π·Π° Π½Π΅ΡΠ·ΠΈΠ½ΠΈΡΠ΅ ΡΠ»Π°Π±ΠΎΡΡΠΈ.
ΠΠ»Π°Π²Π½ΠΈΡΠ΅ ΠΏΡΠΎΠ±Π»Π΅ΠΌΠΈ ΡΠ΅:
- ΠΠΎΠΌΠ±ΠΈΠ½Π°ΡΠΎΡΠ½Π° Π΅ΠΊΡΠΏΠ»ΠΎΠ·ΠΈΡΠ°, Π±ΠΈΠ΄Π΅ΡΡΠΈ ΡΠΎΡΠΌΠ°Π»Π½Π°ΡΠ° Π²Π΅ΡΠΈΡΠΈΠΊΠ°ΡΠΈΡΠ° Π½Π° ΠΊΡΠ°ΡΠΎΡ ΡΠ΅ ΡΠ²Π΅Π΄ΡΠ²Π° Π½Π° P=NP
- ΠΠΎΡΠ΅ΡΠΊΠΎ Π΅ Π΄Π° ΡΠ΅ ΠΏΠΎΡΠ²ΡΠ΄ΠΈ ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΠ°ΡΠ° Π½Π° ΠΏΠΎΠ²ΠΈΡΠΈΡΠ΅ Π΄ΠΎ Π΄Π°ΡΠΎΡΠ΅ΡΠ΅Π½ ΡΠΈΡΡΠ΅ΠΌ, ΠΌΡΠ΅ΠΆΠΈ ΠΈ Π΄ΡΡΠ³Π° Π½Π°Π΄Π²ΠΎΡΠ΅ΡΠ½Π° ΠΌΠ΅ΠΌΠΎΡΠΈΡΠ°
- ΠΡΠ΅ΡΠΊΠΈ Π²ΠΎ ΡΠΏΠ΅ΡΠΈΡΠΈΠΊΠ°ΡΠΈΡΠ°ΡΠ°, ΠΊΠΎΠ³Π° ΠΊΠ»ΠΈΠ΅Π½ΡΠΎΡ ΠΈΠ»ΠΈ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠ΅ΡΠΎΡ ΠΈΠΌΠ°Π» Π½Π°ΠΌΠ΅ΡΠ° Π΅Π΄Π½Π° ΡΠ°Π±ΠΎΡΠ°, Π½ΠΎ Π½Π΅ ΡΠ° ΠΎΠΏΠΈΡΠ°Π» Π΄ΠΎΠ²ΠΎΠ»Π½ΠΎ ΡΠΎΡΠ½ΠΎ Π²ΠΎ ΡΠ΅Ρ Π½ΠΈΡΠΊΠ°ΡΠ° ΡΠΏΠ΅ΡΠΈΡΠΈΠΊΠ°ΡΠΈΡΠ°.
ΠΠ°ΠΊΠΎ ΡΠ΅Π·ΡΠ»ΡΠ°Ρ Π½Π° ΡΠΎΠ°, ΠΏΡΠΎΠ³ΡΠ°ΠΌΠ°ΡΠ° ΡΠ΅ Π±ΠΈΠ΄Π΅ ΠΏΠΎΡΠ²ΡΠ΄Π΅Π½Π° ΠΈ ΡΡΠΎΠ³Π»Π°ΡΠ΅Π½Π° ΡΠΎ ΡΠΏΠ΅ΡΠΈΡΠΈΠΊΠ°ΡΠΈΡΠ°ΡΠ°, Π½ΠΎ ΡΠ΅ Π½Π°ΠΏΡΠ°Π²ΠΈ Π½Π΅ΡΡΠΎ ΡΠΎΡΠ΅ΠΌΠ° ΠΏΠΎΠΈΠ½Π°ΠΊΠ²ΠΎ ΠΎΠ΄ ΠΎΠ½Π° ΡΡΠΎ ΠΊΡΠ΅Π°ΡΠΎΡΠΈΡΠ΅ Π³ΠΎ ΠΎΡΠ΅ΠΊΡΠ²Π°Π° ΠΎΠ΄ Π½Π΅Π°.
ΠΠΈΠ΄Π΅ΡΡΠΈ Π²ΠΎ ΠΎΠ²Π°Π° ΡΡΠ°ΡΠΈΡΠ° Π³Π»Π°Π²Π½ΠΎ ΡΠ°Π·ΠΌΠΈΡΠ»ΡΠ²Π°ΠΌ Π·Π° ΡΠΏΠΎΡΡΠ΅Π±Π° Π½Π° ΡΠΎΡΠΌΠ°Π»Π½Π° Π²Π΅ΡΠΈΡΠΈΠΊΠ°ΡΠΈΡΠ° Π²ΠΎ ΠΏΡΠ°ΠΊΡΠ°, Π·Π°ΡΠ΅Π³Π° Π½Π΅ΠΌΠ° Π΄Π° ΡΠ° ΡΠ΄ΡΠ°ΠΌ Π³Π»Π°Π²Π°ΡΠ° ΠΎΠ΄ ΡΠΈΠ΄ ΠΈ ΡΠ΅ ΠΈΠ·Π±Π΅ΡΠ°ΠΌ ΡΠΈΡΡΠ΅ΠΌ ΠΊΠ°Π΄Π΅ ΡΡΠΎ Π°Π»Π³ΠΎΡΠΈΡΠ°ΠΌΡΠΊΠ°ΡΠ° ΡΠ»ΠΎΠΆΠ΅Π½ΠΎΡΡ ΠΈ Π±ΡΠΎΡΠΎΡ Π½Π° Π½Π°Π΄Π²ΠΎΡΠ΅ΡΠ½ΠΈ ΠΏΠΎΠ²ΠΈΡΠΈ ΡΠ΅ ΠΌΠΈΠ½ΠΈΠΌΠ°Π»Π½ΠΈ.
ΠΠΈΠ΄Π΅ΡΡΠΈ ΠΏΠ°ΠΌΠ΅ΡΠ½ΠΈΡΠ΅ Π΄ΠΎΠ³ΠΎΠ²ΠΎΡΠΈ Π½Π°ΡΠ΄ΠΎΠ±ΡΠΎ ΠΎΠ΄Π³ΠΎΠ²Π°ΡΠ°Π°Ρ Π½Π° ΠΎΠ²ΠΈΠ΅ Π±Π°ΡΠ°ΡΠ°, ΠΈΠ·Π±ΠΎΡΠΎΡ ΠΏΠ°Π΄Π½Π° Π½Π° Π΄ΠΎΠ³ΠΎΠ²ΠΎΡΠΈΡΠ΅ RIDE ΠΎΠ΄ ΠΏΠ»Π°ΡΡΠΎΡΠΌΠ°ΡΠ° Waves: ΡΠΈΠ΅ Π½Π΅ ΡΠ΅ Π·Π°Π²ΡΡΠ΅Π½ΠΈ Π½Π° Π’ΡΡΠΈΠ½Π³ ΠΈ Π½ΠΈΠ²Π½Π°ΡΠ° ΠΌΠ°ΠΊΡΠΈΠΌΠ°Π»Π½Π° ΡΠ»ΠΎΠΆΠ΅Π½ΠΎΡΡ Π΅ Π²Π΅ΡΡΠ°ΡΠΊΠΈ ΠΎΠ³ΡΠ°Π½ΠΈΡΠ΅Π½Π°.
ΠΠΎ, Π½ΠΈΠ΅ ΡΠ΅ Π³ΠΈ ΡΠ°Π·Π³Π»Π΅Π΄Π°ΠΌΠ΅ ΠΈΡΠΊΠ»ΡΡΠΈΠ²ΠΎ ΠΎΠ΄ ΡΠ΅Ρ Π½ΠΈΡΠΊΠ° ΡΡΡΠ°Π½Π°.
ΠΠΎΠΊΡΠ°Ρ ΡΓ¨, ΡΠΎΡΠΌΠ°Π»Π½Π°ΡΠ° Π²Π΅ΡΠΈΡΠΈΠΊΠ°ΡΠΈΡΠ° ΡΠ΅ Π±ΠΈΠ΄Π΅ ΠΎΡΠΎΠ±Π΅Π½ΠΎ Π±Π°ΡΠ°Π½Π° Π·Π° ΠΊΠ°ΠΊΠ²ΠΈ Π±ΠΈΠ»ΠΎ Π΄ΠΎΠ³ΠΎΠ²ΠΎΡΠΈ: ΠΎΠ±ΠΈΡΠ½ΠΎ Π΅ Π½Π΅Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ Π΄Π° ΡΠ΅ ΠΏΠΎΠΏΡΠ°Π²ΠΈ Π³ΡΠ΅ΡΠΊΠ°ΡΠ° Π½Π° Π΄ΠΎΠ³ΠΎΠ²ΠΎΡΠΎΡ ΠΎΡΠΊΠ°ΠΊΠΎ ΡΠ΅ Π±ΠΈΠ΄Π΅ Π»Π°Π½ΡΠΈΡΠ°Π½Π°.
Π ΡΠ΅Π½Π°ΡΠ° Π½Π° ΡΠ°ΠΊΠ²ΠΈΡΠ΅ Π³ΡΠ΅ΡΠΊΠΈ ΠΌΠΎΠΆΠ΅ Π΄Π° Π±ΠΈΠ΄Π΅ ΠΌΠ½ΠΎΠ³Ρ Π²ΠΈΡΠΎΠΊΠ°, Π±ΠΈΠ΄Π΅ΡΡΠΈ Π΄ΠΎΡΡΠ° Π³ΠΎΠ»Π΅ΠΌΠΈ ΠΊΠΎΠ»ΠΈΡΠΈΠ½ΠΈ Π½Π° ΡΡΠ΅Π΄ΡΡΠ²Π° ΡΠ΅ΡΡΠΎ ΡΠ΅ ΡΠΊΠ»Π°Π΄ΠΈΡΠ°Π°Ρ Π½Π° ΠΏΠ°ΠΌΠ΅ΡΠ½ΠΈ Π΄ΠΎΠ³ΠΎΠ²ΠΎΡΠΈ.
ΠΠΎΡΠ°ΡΠ° ΡΠΈΠΌΠ±ΠΎΠ»ΠΈΡΠ½Π° Π²ΠΈΡΡΡΠ΅Π»Π½Π° ΠΌΠ°ΡΠΈΠ½Π° Π΅ Π½Π°ΠΏΠΈΡΠ°Π½Π° Π²ΠΎ PHP ΠΈ Python ΠΈ ΠΊΠΎΡΠΈΡΡΠΈ Z3Prover ΠΎΠ΄ Microsoft Research Π·Π° Π΄Π° Π³ΠΈ ΡΠ΅ΡΠΈ Π΄ΠΎΠ±ΠΈΠ΅Π½ΠΈΡΠ΅ SMT ΡΠΎΡΠΌΡΠ»ΠΈ.
ΠΠΎ Π½Π΅Π³ΠΎΠ²ΠΎΡΠΎ ΡΠ°Π΄ΡΠΎ Π΅ ΠΌΠΎΡΠ½ΠΎΡΠΎ ΠΌΡΠ»ΡΠΈ-ΡΡΠ°Π½ΡΠ°ΠΊΡΠΈΡΠΊΠΎ ΠΏΡΠ΅Π±Π°ΡΡΠ²Π°ΡΠ΅, ΠΊΠΎΠ΅
Π²ΠΈ ΠΎΠ²ΠΎΠ·ΠΌΠΎΠΆΡΠ²Π° Π΄Π° Π½Π°ΡΠ΄Π΅ΡΠ΅ ΡΠ΅ΡΠ΅Π½ΠΈΡΠ° ΠΈΠ»ΠΈ ΠΏΡΠΎΠΏΡΡΡΠΈ, Π΄ΡΡΠΈ ΠΈ Π°ΠΊΠΎ ΡΠΎΠ° Π±Π°ΡΠ° ΠΌΠ½ΠΎΠ³Ρ ΡΡΠ°Π½ΡΠ°ΠΊΡΠΈΠΈ.
ΠΡΡΠΈ ΠΈ
ΠΠΎ, Π²ΡΠ΅Π΄ΠΈ Π΄Π° ΡΠ΅ Π½Π°ΠΏΠΎΠΌΠ΅Π½Π΅ Π΄Π΅ΠΊΠ° Π΅ΡΠ΅ΡΡΠΊΠΈΡΠ΅ Π΄ΠΎΠ³ΠΎΠ²ΠΎΡΠΈ ΡΠ΅ ΠΏΠΎΡΠ»ΠΎΠΆΠ΅Π½ΠΈ, Π° Π’ΡΡΠΈΠ½Π³ Π΅ Π·Π°Π²ΡΡΠ΅Π½.
PHP Π³ΠΎ ΠΏΡΠ΅Π²Π΅Π΄ΡΠ²Π° ΠΈΠ·Π²ΠΎΡΠ½ΠΈΠΎΡ ΠΊΠΎΠ΄ Π½Π° ΠΏΠ°ΠΌΠ΅ΡΠ½ΠΈΠΎΡ Π΄ΠΎΠ³ΠΎΠ²ΠΎΡ RIDE Π²ΠΎ ΡΠΊΡΠΈΠΏΡΠ° Π·Π° ΠΏΠ°ΡΡΠΎΠ½, Π²ΠΎ ΠΊΠΎΡΠ° ΠΏΡΠΎΠ³ΡΠ°ΠΌΠ°ΡΠ° Π΅ ΠΏΡΠ΅ΡΡΡΠ°Π²Π΅Π½Π° ΠΊΠ°ΠΊΠΎ Z3 SMT-ΠΊΠΎΠΌΠΏΠ°ΡΠΈΠ±ΠΈΠ»Π΅Π½ ΡΠΈΡΡΠ΅ΠΌ Π½Π° Π΄ΠΎΠ³ΠΎΠ²ΠΎΡΠ½ΠΈ ΡΠΎΡΡΠΎΡΠ±ΠΈ ΠΈ ΡΡΠ»ΠΎΠ²ΠΈ Π·Π° Π½ΠΈΠ²Π½ΠΈ ΡΡΠ°Π½Π·ΠΈΡΠΈΠΈ:
Π‘Π΅Π³Π° ΡΠ΅ ΠΎΠΏΠΈΡΠ°ΠΌ ΡΡΠΎ ΡΠ΅ ΡΠ»ΡΡΡΠ²Π° Π²Π½Π°ΡΡΠ΅ ΠΏΠΎΠ΄Π΅ΡΠ°Π»Π½ΠΎ.
ΠΠΎ, ΠΏΡΠ²ΠΎ, Π½Π΅ΠΊΠΎΠ»ΠΊΡ Π·Π±ΠΎΡΠΎΠ²ΠΈ Π·Π° ΡΠ°Π·ΠΈΠΊΠΎΡ Π·Π° ΠΏΠ°ΠΌΠ΅ΡΠ½ΠΈ Π΄ΠΎΠ³ΠΎΠ²ΠΎΡΠΈ RIDE.
Π’ΠΎΠ° Π΅ ΡΡΠ½ΠΊΡΠΈΠΎΠ½Π°Π»Π΅Π½ ΠΏΡΠΎΠ³ΡΠ°ΠΌΡΠΊΠΈ ΡΠ°Π·ΠΈΠΊ Π±Π°Π·ΠΈΡΠ°Π½ Π½Π° ΠΈΠ·ΡΠ°Π·ΡΠ²Π°ΡΠ΅ ΠΊΠΎΡ Π΅ ΠΌΡΠ·Π»ΠΈΠ² ΠΏΠΎ Π΄ΠΈΠ·Π°ΡΠ½.
RIDE ΡΠ°Π±ΠΎΡΠΈ ΠΈΠ·ΠΎΠ»ΠΈΡΠ°Π½ΠΎ Π²ΠΎ ΡΠ°ΠΌΠΊΠΈΡΠ΅ Π½Π° Π±Π»ΠΎΠΊΡΠ΅ΡΠ½ΠΎΡ ΠΈ ΠΌΠΎΠΆΠ΅ Π΄Π° ΠΏΠΎΠ²ΡΠ°ΡΠΈ ΠΈ Π·Π°ΠΏΠΈΡΠ΅ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΠΈ ΠΎΠ΄ ΡΠΊΠ»Π°Π΄ΠΈΡΡΠ΅ΡΠΎ ΠΏΠΎΠ²ΡΠ·Π°Π½ΠΎ ΡΠΎ ΠΏΠ°ΡΠΈΡΠ½ΠΈΠΊΠΎΡ Π½Π° ΠΊΠΎΡΠΈΡΠ½ΠΈΠΊΠΎΡ.
ΠΠΎΠΆΠ΅ΡΠ΅ Π΄Π° ΠΏΡΠΈΠΊΠ°ΡΠΈΡΠ΅ Π΄ΠΎΠ³ΠΎΠ²ΠΎΡ Π·Π° RIDE Π½Π° ΡΠ΅ΠΊΠΎΡ ΠΏΠ°ΡΠΈΡΠ½ΠΈΠΊ, Π° ΡΠ΅Π·ΡΠ»ΡΠ°ΡΠΎΡ ΠΎΠ΄ ΠΈΠ·Π²ΡΡΡΠ²Π°ΡΠ΅ΡΠΎ ΡΠ΅ Π±ΠΈΠ΄Π΅ ΡΠ°ΠΌΠΎ Π’ΠΠ§ΠΠ ΠΈΠ»ΠΈ ΠΠΠ’ΠΠ§ΠΠ.
Π’ΠΠ§ΠΠ Π·Π½Π°ΡΠΈ Π΄Π΅ΠΊΠ° ΠΏΠ°ΠΌΠ΅ΡΠ½ΠΈΠΎΡ Π΄ΠΎΠ³ΠΎΠ²ΠΎΡ ΡΠ° Π΄ΠΎΠ·Π²ΠΎΠ»ΡΠ²Π° ΡΡΠ°Π½ΡΠ°ΠΊΡΠΈΡΠ°ΡΠ°, Π° 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 ΠΈ Π΄Π° ΠΏΠΎΠΊΠ°ΠΆΠ°ΠΌ ΠΊΠ°ΠΊΠΎ ΠΌΠΎΠΆΠ΅ΡΠ΅ Π΄Π° ΠΊΡΠ΅ΠΈΡΠ°ΡΠ΅ ΡΠΎΡΠΌΠ°Π»Π½ΠΎ ΠΏΠΎΡΠ²ΡΠ΄Π΅Π½ΠΈ ΠΏΠ°ΠΌΠ΅ΡΠ½ΠΈ Π΄ΠΎΠ³ΠΎΠ²ΠΎΡΠΈ ΡΠΎ Π½Π΅Π³ΠΎΠ²Π° ΠΏΠΎΠΌΠΎΡ, Π° Π½Π΅ ΡΠ°ΠΌΠΎ Π΄Π° Π³ΠΈ ΡΠ΅ΡΠ°Π²Π°ΡΠ΅.
ΠΠΈΠΊΠΎΡ Π½Π° Π²ΠΈΡΡΡΠ΅Π»Π½Π°ΡΠ° ΠΌΠ°ΡΠΈΠ½Π° Π΅ Π΄ΠΎΡΡΠ°ΠΏΠ΅Π½ Π½Π°
ΠΡΠΊΠ°ΠΊΠΎ ΡΠ΅ Π³ΠΎ ΠΏΠΎΠ΄ΡΠ΅Π΄Π°ΠΌ ΠΈΠ·Π²ΠΎΡΠ½ΠΈΠΎΡ ΠΊΠΎΠ΄ Π½Π° ΡΠΈΠΌΠ±ΠΎΠ»ΠΈΡΠ½ΠΎΡΠΎ VM ΠΈ ΡΠ΅ Π΄ΠΎΠ΄Π°Π΄Π°ΠΌ ΠΊΠΎΠΌΠ΅Π½ΡΠ°ΡΠΈ ΡΠ°ΠΌΡ, ΠΏΠ»Π°Π½ΠΈΡΠ°ΠΌ Π΄Π° Π³ΠΎ ΠΎΠ±ΡΠ°Π²Π°ΠΌ Π½Π° GitHub Π·Π° Π±Π΅ΡΠΏΠ»Π°ΡΠ΅Π½ ΠΏΡΠΈΡΡΠ°ΠΏ.
ΠΠ·Π²ΠΎΡ: www.habr.com