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