БоздавањС Ρ„ΠΎΡ€ΠΌΠ°Π»Π΅Π½ систСм Π·Π° Π²Π΅Ρ€ΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΡ˜Π° ΠΎΠ΄ Π½ΡƒΠ»Π°. Π”Π΅Π» 1: Π’ΠΈΡ€Ρ‚ΡƒΠ΅Π»Π½Π° машина со ΠΊΠ°Ρ€Π°ΠΊΡ‚Π΅Ρ€ΠΈ Π²ΠΎ PHP ΠΈ Python

Π€ΠΎΡ€ΠΌΠ°Π»Π½Π° Π²Π΅Ρ€ΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΡ˜Π° Π΅ Π²Π΅Ρ€ΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΡ˜Π° Π½Π° Π΅Π΄Π½Π° ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠ° ΠΈΠ»ΠΈ Π°Π»Π³ΠΎΡ€ΠΈΡ‚Π°ΠΌ ΠΊΠΎΡ€ΠΈΡΡ‚Π΅Ρ˜ΡœΠΈ Π΄Ρ€ΡƒΠ³Π°.

Ова Π΅ Π΅Π΄Π΅Π½ ΠΎΠ΄ Π½Π°Ρ˜ΠΌΠΎΡœΠ½ΠΈΡ‚Π΅ ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΈ кој Π²ΠΈ ΠΎΠ²ΠΎΠ·ΠΌΠΎΠΆΡƒΠ²Π° Π΄Π° Π³ΠΈ ΠΏΡ€ΠΎΠ½Π°Ρ˜Π΄Π΅Ρ‚Π΅ ситС пропусти Π²ΠΎ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠ°Ρ‚Π° ΠΈΠ»ΠΈ Π΄Π° Π΄ΠΎΠΊΠ°ΠΆΠ΅Ρ‚Π΅ Π΄Π΅ΠΊΠ° Ρ‚ΠΈΠ΅ Π½Π΅ ΠΏΠΎΡΡ‚ΠΎΡ˜Π°Ρ‚.

ΠŸΠΎΠ΄Π΅Ρ‚Π°Π»Π΅Π½ опис Π½Π° Ρ„ΠΎΡ€ΠΌΠ°Π»Π½Π°Ρ‚Π° Π²Π΅Ρ€ΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΡ˜Π° ΠΌΠΎΠΆΠ΅ Π΄Π° сС Π²ΠΈΠ΄ΠΈ Π²ΠΎ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ΠΎΡ‚ Π·Π° Ρ€Π΅ΡˆΠ°Π²Π°ΡšΠ΅ Π½Π° ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠΎΡ‚ Π½Π° Π’ΠΎΠ»ΠΊ, ΠΊΠΎΠ·Π° ΠΈ Π·Π΅Π»ΠΊΠ° Π²ΠΎ ΠΌΠΎΡ˜Π°Ρ‚Π° ΠΏΡ€Π΅Ρ‚Ρ…ΠΎΠ΄Π½Π° ΡΡ‚Π°Ρ‚ΠΈΡ˜Π°.

Π’ΠΎ ΠΎΠ²Π°Π° ΡΡ‚Π°Ρ‚ΠΈΡ˜Π° сС ΠΏΡ€Π΅Ρ„Ρ€Π»Π°ΠΌ ΠΎΠ΄ Ρ„ΠΎΡ€ΠΌΠ°Π»Π½Π° ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° Π½Π° ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠΈΡ‚Π΅ Π½Π° ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΈ ΠΈ ΠΎΠΏΠΈΡˆΡƒΠ²Π°ΠΌ ΠΊΠ°ΠΊΠΎ
ΠΊΠ°ΠΊΠΎ ΠΌΠΎΠΆΠ΅ автоматски Π΄Π° сС ΠΏΡ€Π΅Ρ‚Π²ΠΎΡ€Π°Ρ‚ Π²ΠΎ систСми Π·Π° Ρ„ΠΎΡ€ΠΌΠ°Π»Π½ΠΈ ΠΏΡ€Π°Π²ΠΈΠ»Π°.

Π—Π° Π΄Π° Π³ΠΎ Π½Π°ΠΏΡ€Π°Π²Π°ΠΌ ΠΎΠ²Π°, напишав свој Π°Π½Π°Π»ΠΎΠ³ Π½Π° Π²ΠΈΡ€Ρ‚ΡƒΠ΅Π»Π½Π° машина, ΠΊΠΎΡ€ΠΈΡΡ‚Π΅Ρ˜ΡœΠΈ симболични ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏΠΈ.

Π“ΠΎ Π°Π½Π°Π»ΠΈΠ·ΠΈΡ€Π° програмскиот ΠΊΠΎΠ΄ ΠΈ Π³ΠΎ ΠΏΡ€Π΅Π²Π΅Π΄ΡƒΠ²Π° Π²ΠΎ систСм Π½Π° Ρ€Π°Π²Π΅Π½ΠΊΠΈ (SMT), кој вСќС ΠΌΠΎΠΆΠ΅ Π΄Π° сС Ρ€Π΅ΡˆΠΈ програмски.

Π‘ΠΈΠ΄Π΅Ρ˜ΡœΠΈ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈΡ‚Π΅ Π·Π° симболичнитС прСсмСтки сС прСтставСни Π½Π° Π˜Π½Ρ‚Π΅Ρ€Π½Π΅Ρ‚ ΠΏΡ€ΠΈΠ»ΠΈΡ‡Π½ΠΎ Ρ„Ρ€Π°Π³ΠΌΠ΅Π½Ρ‚Π°Ρ€Π½ΠΎ,
Накратко ќС опишам ΡˆΡ‚ΠΎ Π΅ Ρ‚ΠΎΠ°.

Π‘ΠΈΠΌΠ±ΠΎΠ»ΠΈΡ‡ΠΊΠΎΡ‚ΠΎ ΠΏΡ€Π΅ΡΠΌΠ΅Ρ‚ΡƒΠ²Π°ΡšΠ΅ Π΅ Π½Π°Ρ‡ΠΈΠ½ Π·Π° истоврСмСно ΠΈΠ·Π²Ρ€ΡˆΡƒΠ²Π°ΡšΠ΅ Π½Π° ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠ° Π½Π° ΡˆΠΈΡ€ΠΎΠΊ опсСг Π½Π° ΠΏΠΎΠ΄Π°Ρ‚ΠΎΡ†ΠΈ ΠΈ Π΅ Π³Π»Π°Π²Π½Π°Ρ‚Π° Π°Π»Π°Ρ‚ΠΊΠ° Π·Π° Ρ„ΠΎΡ€ΠΌΠ°Π»Π½Π° Π²Π΅Ρ€ΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΡ˜Π° Π½Π° ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠ°Ρ‚Π°.

На ΠΏΡ€ΠΈΠΌΠ΅Ρ€, ΠΌΠΎΠΆΠ΅ΠΌΠ΅ Π΄Π° поставимС Π²Π»Π΅Π·Π½ΠΈ услови ΠΊΠ°Π΄Π΅ ΡˆΡ‚ΠΎ ΠΏΡ€Π²ΠΈΠΎΡ‚ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ ΠΌΠΎΠΆΠ΅ Π΄Π° ΠΈΠΌΠ° ΠΏΠΎΠ·ΠΈΡ‚ΠΈΠ²Π½ΠΈ врСдности, Π²Ρ‚ΠΎΡ€ΠΈΠΎΡ‚ Π½Π΅Π³Π°Ρ‚ΠΈΠ²Π΅Π½, Ρ‚Ρ€Π΅Ρ‚Π°Ρ‚Π° Π½ΡƒΠ»Π° ΠΈ ΠΈΠ·Π»Π΅Π·Π½ΠΈΠΎΡ‚ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚, Π½Π° ΠΏΡ€ΠΈΠΌΠ΅Ρ€, 42.

Π‘ΠΈΠΌΠ±ΠΎΠ»ΠΈΡ‡Π½ΠΈΡ‚Π΅ прСсмСтки Π²ΠΎ Π΅Π΄Π½ΠΎ возСњС ќС Π½ΠΈ Π΄Π°Π΄Π°Ρ‚ ΠΎΠ΄Π³ΠΎΠ²ΠΎΡ€ Π΄Π°Π»ΠΈ Π΅ ΠΌΠΎΠΆΠ½ΠΎ Π΄Π° Π³ΠΎ Π΄ΠΎΠ±ΠΈΠ΅ΠΌΠ΅ посакуваниот Ρ€Π΅Π·ΡƒΠ»Ρ‚Π°Ρ‚ ΠΈ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ Π·Π° мноТСство ΠΎΠ΄ Ρ‚Π°ΠΊΠ²ΠΈ Π²Π»Π΅Π·Π½ΠΈ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΈ. Или Π΄ΠΎΠΊΠ°Π· Π΄Π΅ΠΊΠ° Π½Π΅ΠΌΠ° Ρ‚Π°ΠΊΠ²ΠΈ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΈ.

ΠŸΠΎΠΊΡ€Π°Ρ˜ Ρ‚ΠΎΠ°, ΠΌΠΎΠΆΠ΅ΠΌΠ΅ Π΄Π° Π³ΠΈ поставимС Π²Π»Π΅Π·Π½ΠΈΡ‚Π΅ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΈ Π½Π° ситС ΠΌΠΎΠΆΠ½ΠΈ ΠΈ Π΄Π° Π³ΠΈ ΠΈΠ·Π±Π΅Ρ€Π΅ΠΌΠ΅ само ΠΈΠ·Π»Π΅Π·Π½ΠΈΡ‚Π΅, Π½Π° ΠΏΡ€ΠΈΠΌΠ΅Ρ€, администраторската Π»ΠΎΠ·ΠΈΠ½ΠΊΠ°.

Π’ΠΎ овој ΡΠ»ΡƒΡ‡Π°Ρ˜, ќС Π³ΠΈ најдСмС ситС пропусти Π½Π° ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠ°Ρ‚Π° ΠΈΠ»ΠΈ ќС Π΄ΠΎΠ±ΠΈΠ΅ΠΌΠ΅ Π΄ΠΎΠΊΠ°Π· Π΄Π΅ΠΊΠ° Π»ΠΎΠ·ΠΈΠ½ΠΊΠ°Ρ‚Π° Π½Π° администраторот Π΅ Π±Π΅Π·Π±Π΅Π΄Π½Π°.

МоТС Π΄Π° сС Π·Π°Π±Π΅Π»Π΅ΠΆΠΈ Π΄Π΅ΠΊΠ° класичното ΠΈΠ·Π²Ρ€ΡˆΡƒΠ²Π°ΡšΠ΅ Π½Π° ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠ° со спСцифични Π²Π»Π΅Π·Π½ΠΈ ΠΏΠΎΠ΄Π°Ρ‚ΠΎΡ†ΠΈ Π΅ посСбСн ΡΠ»ΡƒΡ‡Π°Ρ˜ Π½Π° симболично ΠΈΠ·Π²Ρ€ΡˆΡƒΠ²Π°ΡšΠ΅.

Π—Π°Ρ‚ΠΎΠ°, ΠΌΠΎΡ˜ΠΎΡ‚ Π»ΠΈΠΊ VM ΠΌΠΎΠΆΠ΅ Π΄Π° Ρ€Π°Π±ΠΎΡ‚ΠΈ ΠΈ Π²ΠΎ Ρ€Π΅ΠΆΠΈΠΌ Π½Π° Π΅ΠΌΡƒΠ»Π°Ρ†ΠΈΡ˜Π° Π½Π° стандардна Π²ΠΈΡ€Ρ‚ΡƒΠ΅Π»Π½Π° машина.

Π’ΠΎ ΠΊΠΎΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΡ‚Π΅ Π½Π° ΠΏΡ€Π΅Ρ‚Ρ…ΠΎΠ΄Π½Π°Ρ‚Π° ΡΡ‚Π°Ρ‚ΠΈΡ˜Π° ΠΌΠΎΠΆΠ΅ Π΄Π° сС најдС Ρ„Π΅Ρ€ ΠΊΡ€ΠΈΡ‚ΠΈΠΊΠ° Π½Π° Ρ„ΠΎΡ€ΠΌΠ°Π»Π½Π°Ρ‚Π° Π²Π΅Ρ€ΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΡ˜Π° со Π΄ΠΈΡΠΊΡƒΡΠΈΡ˜Π° Π·Π° Π½Π΅Ρ˜Π·ΠΈΠ½ΠΈΡ‚Π΅ слабости.

Π“Π»Π°Π²Π½ΠΈΡ‚Π΅ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠΈ сС:

  1. ΠšΠΎΠΌΠ±ΠΈΠ½Π°Ρ‚ΠΎΡ€Π½Π° Сксплозија, бидСјќи Ρ„ΠΎΡ€ΠΌΠ°Π»Π½Π°Ρ‚Π° Π²Π΅Ρ€ΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΡ˜Π° Π½Π° ΠΊΡ€Π°Ρ˜ΠΎΡ‚ сС свСдува Π½Π° P=NP
  2. ΠŸΠΎΡ‚Π΅ΡˆΠΊΠΎ Π΅ Π΄Π° сС ΠΏΠΎΡ‚Π²Ρ€Π΄ΠΈ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ°Ρ‚Π° Π½Π° ΠΏΠΎΠ²ΠΈΡ†ΠΈΡ‚Π΅ Π΄ΠΎ Π΄Π°Ρ‚ΠΎΡ‚Π΅Ρ‡Π΅Π½ систСм, ΠΌΡ€Π΅ΠΆΠΈ ΠΈ Π΄Ρ€ΡƒΠ³Π° Π½Π°Π΄Π²ΠΎΡ€Π΅ΡˆΠ½Π° ΠΌΠ΅ΠΌΠΎΡ€ΠΈΡ˜Π°
  3. Π“Ρ€Π΅ΡˆΠΊΠΈ Π²ΠΎ ΡΠΏΠ΅Ρ†ΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΡ˜Π°Ρ‚Π°, ΠΊΠΎΠ³Π° ΠΊΠ»ΠΈΠ΅Π½Ρ‚ΠΎΡ‚ ΠΈΠ»ΠΈ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠ΅Ρ€ΠΎΡ‚ ΠΈΠΌΠ°Π» Π½Π°ΠΌΠ΅Ρ€Π° Π΅Π΄Π½Π° Ρ€Π°Π±ΠΎΡ‚Π°, Π½ΠΎ Π½Π΅ ја опишал Π΄ΠΎΠ²ΠΎΠ»Π½ΠΎ Ρ‚ΠΎΡ‡Π½ΠΎ Π²ΠΎ Ρ‚Π΅Ρ…Π½ΠΈΡ‡ΠΊΠ°Ρ‚Π° ΡΠΏΠ΅Ρ†ΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΡ˜Π°.

Како Ρ€Π΅Π·ΡƒΠ»Ρ‚Π°Ρ‚ Π½Π° Ρ‚ΠΎΠ°, ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠ°Ρ‚Π° ќС Π±ΠΈΠ΄Π΅ ΠΏΠΎΡ‚Π²Ρ€Π΄Π΅Π½Π° ΠΈ усогласСна со ΡΠΏΠ΅Ρ†ΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΡ˜Π°Ρ‚Π°, Π½ΠΎ ќС Π½Π°ΠΏΡ€Π°Π²ΠΈ Π½Π΅ΡˆΡ‚ΠΎ сосСма ΠΏΠΎΠΈΠ½Π°ΠΊΠ²ΠΎ ΠΎΠ΄ ΠΎΠ½Π° ΡˆΡ‚ΠΎ ΠΊΡ€Π΅Π°Ρ‚ΠΎΡ€ΠΈΡ‚Π΅ Π³ΠΎ ΠΎΡ‡Π΅ΠΊΡƒΠ²Π°Π° ΠΎΠ΄ Π½Π΅Π°.

Π‘ΠΈΠ΄Π΅Ρ˜ΡœΠΈ Π²ΠΎ ΠΎΠ²Π°Π° ΡΡ‚Π°Ρ‚ΠΈΡ˜Π° Π³Π»Π°Π²Π½ΠΎ размислувам Π·Π° ΡƒΠΏΠΎΡ‚Ρ€Π΅Π±Π° Π½Π° Ρ„ΠΎΡ€ΠΌΠ°Π»Π½Π° Π²Π΅Ρ€ΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΡ˜Π° Π²ΠΎ пракса, засСга Π½Π΅ΠΌΠ° Π΄Π° ја ΡƒΠ΄Ρ€Π°ΠΌ Π³Π»Π°Π²Π°Ρ‚Π° ΠΎΠ΄ Ρ•ΠΈΠ΄ ΠΈ ќС ΠΈΠ·Π±Π΅Ρ€Π°ΠΌ систСм ΠΊΠ°Π΄Π΅ ΡˆΡ‚ΠΎ алгоритамската слоТСност ΠΈ Π±Ρ€ΠΎΡ˜ΠΎΡ‚ Π½Π° Π½Π°Π΄Π²ΠΎΡ€Π΅ΡˆΠ½ΠΈ ΠΏΠΎΠ²ΠΈΡ†ΠΈ сС ΠΌΠΈΠ½ΠΈΠΌΠ°Π»Π½ΠΈ.

Π‘ΠΈΠ΄Π΅Ρ˜ΡœΠΈ ΠΏΠ°ΠΌΠ΅Ρ‚Π½ΠΈΡ‚Π΅ Π΄ΠΎΠ³ΠΎΠ²ΠΎΡ€ΠΈ Π½Π°Ρ˜Π΄ΠΎΠ±Ρ€ΠΎ ΠΎΠ΄Π³ΠΎΠ²Π°Ρ€Π°Π°Ρ‚ Π½Π° ΠΎΠ²ΠΈΠ΅ Π±Π°Ρ€Π°ΡšΠ°, ΠΈΠ·Π±ΠΎΡ€ΠΎΡ‚ ΠΏΠ°Π΄Π½Π° Π½Π° Π΄ΠΎΠ³ΠΎΠ²ΠΎΡ€ΠΈΡ‚Π΅ RIDE ΠΎΠ΄ ΠΏΠ»Π°Ρ‚Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π° Waves: Ρ‚ΠΈΠ΅ Π½Π΅ сС Π·Π°Π²Ρ€ΡˆΠ΅Π½ΠΈ Π½Π° Π’ΡƒΡ€ΠΈΠ½Π³ ΠΈ Π½ΠΈΠ²Π½Π°Ρ‚Π° максимална слоТСност Π΅ Π²Π΅ΡˆΡ‚Π°Ρ‡ΠΊΠΈ ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½Π°.

Но, Π½ΠΈΠ΅ ќС Π³ΠΈ Ρ€Π°Π·Π³Π»Π΅Π΄Π°ΠΌΠ΅ исклучиво ΠΎΠ΄ Ρ‚Π΅Ρ…Π½ΠΈΡ‡ΠΊΠ° страна.

ΠŸΠΎΠΊΡ€Π°Ρ˜ сè, Ρ„ΠΎΡ€ΠΌΠ°Π»Π½Π°Ρ‚Π° Π²Π΅Ρ€ΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΡ˜Π° ќС Π±ΠΈΠ΄Π΅ особСно Π±Π°Ρ€Π°Π½Π° Π·Π° ΠΊΠ°ΠΊΠ²ΠΈ Π±ΠΈΠ»ΠΎ Π΄ΠΎΠ³ΠΎΠ²ΠΎΡ€ΠΈ: ΠΎΠ±ΠΈΡ‡Π½ΠΎ Π΅ Π½Π΅Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ Π΄Π° сС ΠΏΠΎΠΏΡ€Π°Π²ΠΈ Π³Ρ€Π΅ΡˆΠΊΠ°Ρ‚Π° Π½Π° Π΄ΠΎΠ³ΠΎΠ²ΠΎΡ€ΠΎΡ‚ ΠΎΡ‚ΠΊΠ°ΠΊΠΎ ќС Π±ΠΈΠ΄Π΅ лансирана.
И Ρ†Π΅Π½Π°Ρ‚Π° Π½Π° Ρ‚Π°ΠΊΠ²ΠΈΡ‚Π΅ Π³Ρ€Π΅ΡˆΠΊΠΈ ΠΌΠΎΠΆΠ΅ Π΄Π° Π±ΠΈΠ΄Π΅ ΠΌΠ½ΠΎΠ³Ρƒ висока, бидСјќи доста Π³ΠΎΠ»Π΅ΠΌΠΈ ΠΊΠΎΠ»ΠΈΡ‡ΠΈΠ½ΠΈ Π½Π° срСдства чСсто сС складираат Π½Π° ΠΏΠ°ΠΌΠ΅Ρ‚Π½ΠΈ Π΄ΠΎΠ³ΠΎΠ²ΠΎΡ€ΠΈ.

ΠœΠΎΡ˜Π°Ρ‚Π° симболична Π²ΠΈΡ€Ρ‚ΡƒΠ΅Π»Π½Π° машина Π΅ напишана Π²ΠΎ PHP ΠΈ Python ΠΈ користи Z3Prover ΠΎΠ΄ Microsoft Research Π·Π° Π΄Π° Π³ΠΈ Ρ€Π΅ΡˆΠΈ Π΄ΠΎΠ±ΠΈΠ΅Π½ΠΈΡ‚Π΅ SMT Ρ„ΠΎΡ€ΠΌΡƒΠ»ΠΈ.

Π’ΠΎ Π½Π΅Π³ΠΎΠ²ΠΎΡ‚ΠΎ Ρ˜Π°Π΄Ρ€ΠΎ Π΅ ΠΌΠΎΡœΠ½ΠΎΡ‚ΠΎ ΠΌΡƒΠ»Ρ‚ΠΈ-трансакциско ΠΏΡ€Π΅Π±Π°Ρ€ΡƒΠ²Π°ΡšΠ΅, ΠΊΠΎΠ΅
Π²ΠΈ ΠΎΠ²ΠΎΠ·ΠΌΠΎΠΆΡƒΠ²Π° Π΄Π° Π½Π°Ρ˜Π΄Π΅Ρ‚Π΅ Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ˜Π° ΠΈΠ»ΠΈ пропусти, Π΄ΡƒΡ€ΠΈ ΠΈ Π°ΠΊΠΎ Ρ‚ΠΎΠ° Π±Π°Ρ€Π° ΠΌΠ½ΠΎΠ³Ρƒ трансакции.
Π”ΡƒΡ€ΠΈ ΠΈ ΠœΠΈΡ‚Ρ€ΠΈΠ», Π΅Π΄Π½Π° ΠΎΠ΄ Π½Π°Ρ˜ΠΌΠΎΡœΠ½ΠΈΡ‚Π΅ симболични Ρ€Π°ΠΌΠΊΠΈ Π·Π° ΠΏΡ€ΠΎΠ½Π°ΠΎΡ“Π°ΡšΠ΅ Π½Π° ранливости Π½Π° Ethereum, ја Π΄ΠΎΠ΄Π°Π΄Π΅ ΠΎΠ²Π°Π° способност само ΠΏΡ€Π΅Π΄ Π½Π΅ΠΊΠΎΠ»ΠΊΡƒ мСсСци.

Но, Π²Ρ€Π΅Π΄ΠΈ Π΄Π° сС Π½Π°ΠΏΠΎΠΌΠ΅Π½Π΅ Π΄Π΅ΠΊΠ° СтСрскитС Π΄ΠΎΠ³ΠΎΠ²ΠΎΡ€ΠΈ сС послоТСни, Π° Π’ΡƒΡ€ΠΈΠ½Π³ Π΅ Π·Π°Π²Ρ€ΡˆΠ΅Π½.

PHP Π³ΠΎ ΠΏΡ€Π΅Π²Π΅Π΄ΡƒΠ²Π° ΠΈΠ·Π²ΠΎΡ€Π½ΠΈΠΎΡ‚ ΠΊΠΎΠ΄ Π½Π° ΠΏΠ°ΠΌΠ΅Ρ‚Π½ΠΈΠΎΡ‚ Π΄ΠΎΠ³ΠΎΠ²ΠΎΡ€ RIDE Π²ΠΎ скрипта Π·Π° ΠΏΠ°Ρ˜Ρ‚ΠΎΠ½, Π²ΠΎ која ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠ°Ρ‚Π° Π΅ прСтставСна ΠΊΠ°ΠΊΠΎ Z3 SMT-ΠΊΠΎΠΌΠΏΠ°Ρ‚ΠΈΠ±ΠΈΠ»Π΅Π½ систСм Π½Π° Π΄ΠΎΠ³ΠΎΠ²ΠΎΡ€Π½ΠΈ ΡΠΎΡΡ‚ΠΎΡ˜Π±ΠΈ ΠΈ услови Π·Π° Π½ΠΈΠ²Π½ΠΈ Ρ‚Ρ€Π°Π½Π·ΠΈΡ†ΠΈΠΈ:

БоздавањС Ρ„ΠΎΡ€ΠΌΠ°Π»Π΅Π½ систСм Π·Π° Π²Π΅Ρ€ΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΡ˜Π° ΠΎΠ΄ Π½ΡƒΠ»Π°. Π”Π΅Π» 1: Π’ΠΈΡ€Ρ‚ΡƒΠ΅Π»Π½Π° машина со ΠΊΠ°Ρ€Π°ΠΊΡ‚Π΅Ρ€ΠΈ Π²ΠΎ PHP ΠΈ Python

Π‘Π΅Π³Π° ќС опишам ΡˆΡ‚ΠΎ сС случува Π²Π½Π°Ρ‚Ρ€Π΅ ΠΏΠΎΠ΄Π΅Ρ‚Π°Π»Π½ΠΎ.

Но, ΠΏΡ€Π²ΠΎ, Π½Π΅ΠΊΠΎΠ»ΠΊΡƒ Π·Π±ΠΎΡ€ΠΎΠ²ΠΈ Π·Π° Ρ˜Π°Π·ΠΈΠΊΠΎΡ‚ Π·Π° ΠΏΠ°ΠΌΠ΅Ρ‚Π½ΠΈ Π΄ΠΎΠ³ΠΎΠ²ΠΎΡ€ΠΈ 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 ΠΈ Π΄Π° ΠΏΠΎΠΊΠ°ΠΆΠ°ΠΌ ΠΊΠ°ΠΊΠΎ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π΄Π° ΠΊΡ€Π΅ΠΈΡ€Π°Ρ‚Π΅ Ρ„ΠΎΡ€ΠΌΠ°Π»Π½ΠΎ ΠΏΠΎΡ‚Π²Ρ€Π΄Π΅Π½ΠΈ ΠΏΠ°ΠΌΠ΅Ρ‚Π½ΠΈ Π΄ΠΎΠ³ΠΎΠ²ΠΎΡ€ΠΈ со Π½Π΅Π³ΠΎΠ²Π° помош, Π° Π½Π΅ само Π΄Π° Π³ΠΈ Ρ€Π΅ΡˆΠ°Π²Π°Ρ‚Π΅.

Π›ΠΈΠΊΠΎΡ‚ Π½Π° Π²ΠΈΡ€Ρ‚ΡƒΠ΅Π»Π½Π°Ρ‚Π° машина Π΅ достапСн Π½Π° http://2.59.42.98/hyperbox/
ΠžΡ‚ΠΊΠ°ΠΊΠΎ ќС Π³ΠΎ ΠΏΠΎΠ΄Ρ€Π΅Π΄Π°ΠΌ ΠΈΠ·Π²ΠΎΡ€Π½ΠΈΠΎΡ‚ ΠΊΠΎΠ΄ Π½Π° симболичното VM ΠΈ ќС Π΄ΠΎΠ΄Π°Π΄Π°ΠΌ ΠΊΠΎΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈ Ρ‚Π°ΠΌΡƒ, ΠΏΠ»Π°Π½ΠΈΡ€Π°ΠΌ Π΄Π° Π³ΠΎ објавам Π½Π° GitHub Π·Π° бСсплатСн пристап.

Π˜Π·Π²ΠΎΡ€: www.habr.com

Π”ΠΎΠ΄Π°Π΄Π΅Ρ‚Π΅ ΠΊΠΎΠΌΠ΅Π½Ρ‚Π°Ρ€