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