рд╢реБрд░реБрдЖрдд рд╕реЗ рдПрдХ рдФрдкрдЪрд╛рд░рд┐рдХ рд╕рддреНрдпрд╛рдкрди рдкреНрд░рдгрд╛рд▓реА рдмрдирд╛рдирд╛ред рднрд╛рдЧ 1: PHP рдФрд░ рдкрд╛рдпрдерди рдореЗрдВ рдХреИрд░реЗрдХреНрдЯрд░ рд╡рд░реНрдЪреБрдЕрд▓ рдорд╢реАрди

рдФрдкрдЪрд╛рд░рд┐рдХ рд╕рддреНрдпрд╛рдкрди рдПрдХ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдпрд╛ рдПрд▓реНрдЧреЛрд░рд┐рджрдо рдХрд╛ рджреВрд╕рд░реЗ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╕рддреНрдпрд╛рдкрди рд╣реИред

рдпрд╣ рд╕рдмрд╕реЗ рд╢рдХреНрддрд┐рд╢рд╛рд▓реА рддрд░реАрдХреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рд╣реИ рдЬреЛ рдЖрдкрдХреЛ рдХрд┐рд╕реА рдкреНрд░реЛрдЧреНрд░рд╛рдо рдореЗрдВ рд╕рднреА рдХрдордЬреЛрд░рд┐рдпреЛрдВ рдХреЛ рдЦреЛрдЬрдиреЗ рдпрд╛ рдпрд╣ рд╕рд╛рдмрд┐рдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ рдХрд┐ рд╡реЗ рдореМрдЬреВрдж рдирд╣реАрдВ рд╣реИрдВред

рдФрдкрдЪрд╛рд░рд┐рдХ рд╕рддреНрдпрд╛рдкрди рдХрд╛ рдЕрдзрд┐рдХ рд╡рд┐рд╕реНрддреГрдд рд╡рд┐рд╡рд░рдг рд╕рдорд╕реНрдпрд╛ рдХреЗ рд╕рдорд╛рдзрд╛рди рдХреЗ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ рджреЗрдЦрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рднреЗрдбрд╝рд┐рдпрд╛, рдмрдХрд░реА, рдФрд░ рдЧреЛрднреА рдореЗрд░реЗ рдкрд┐рдЫрд▓реЗ рд▓реЗрдЦ рдореЗрдВ.

рдЗрд╕ рд▓реЗрдЦ рдореЗрдВ рдореИрдВ рд╕рдорд╕реНрдпрд╛рдУрдВ рдХреЗ рдФрдкрдЪрд╛рд░рд┐рдХ рд╕рддреНрдпрд╛рдкрди рд╕реЗ рд▓реЗрдХрд░ рдХрд╛рд░реНрдпрдХреНрд░рдореЛрдВ рдХреА рдУрд░ рдмрдврд╝рддрд╛ рд╣реВрдБ рдФрд░ рд╡рд░реНрдгрди рдХрд░рддрд╛ рд╣реВрдБ рдХрд┐ рдХреИрд╕реЗ
рдЙрдиреНрд╣реЗрдВ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдФрдкрдЪрд╛рд░рд┐рдХ рдирд┐рдпрдо рдкреНрд░рдгрд╛рд▓рд┐рдпреЛрдВ рдореЗрдВ рдХреИрд╕реЗ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдореИрдВрдиреЗ рдкреНрд░рддреАрдХрд╛рддреНрдордХ рд╕рд┐рджреНрдзрд╛рдВрддреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП рдПрдХ рд╡рд░реНрдЪреБрдЕрд▓ рдорд╢реАрди рдХрд╛ рдЕрдкрдирд╛ рдПрдирд╛рд▓реЙрдЧ рд▓рд┐рдЦрд╛ред

рдпрд╣ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХреЛрдб рдХреЛ рдкрд╛рд░реНрд╕ рдХрд░рддрд╛ рд╣реИ рдФрд░ рдЗрд╕реЗ рд╕рдореАрдХрд░рдгреЛрдВ рдХреА рдкреНрд░рдгрд╛рд▓реА (рдПрд╕рдПрдордЯреА) рдореЗрдВ рдЕрдиреБрд╡рд╛рджрд┐рдд рдХрд░рддрд╛ рд╣реИ, рдЬрд┐рд╕реЗ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдкреНрд░реЛрдЧреНрд░рд╛рдореЗрдЯрд┐рдХ рд░реВрдк рд╕реЗ рд╣рд▓ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

рдЪреВрдБрдХрд┐ рдкреНрд░рддреАрдХрд╛рддреНрдордХ рдЧрдгрдирд╛рдУрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирдХрд╛рд░реА рдЗрдВрдЯрд░рдиреЗрдЯ рдкрд░ рдЦрдВрдбрд┐рдд рд░реВрдк рд╕реЗ рдкреНрд░рд╕реНрддреБрдд рдХреА рдЬрд╛рддреА рд╣реИ,
рдореИрдВ рд╕рдВрдХреНрд╖реЗрдк рдореЗрдВ рдмрддрд╛рдКрдВрдЧрд╛ рдХрд┐ рдпрд╣ рдХреНрдпрд╛ рд╣реИред

рдкреНрд░рддреАрдХрд╛рддреНрдордХ рдЧрдгрдирд╛ рдбреЗрдЯрд╛ рдХреА рдПрдХ рд╡рд┐рд╕реНрддреГрдд рд╢реНрд░реГрдВрдЦрд▓рд╛ рдкрд░ рдПрдХ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХреЛ рдПрдХ рд╕рд╛рде рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рдиреЗ рдХрд╛ рдПрдХ рддрд░реАрдХрд╛ рд╣реИ рдФрд░ рдФрдкрдЪрд╛рд░рд┐рдХ рдкреНрд░реЛрдЧреНрд░рд╛рдо рд╕рддреНрдпрд╛рдкрди рдХреЗ рд▓рд┐рдП рдореБрдЦреНрдп рдЙрдкрдХрд░рдг рд╣реИред

рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд╣рдо рдЗрдирдкреБрдЯ рд╕реНрдерд┐рддрд┐рдпрд╛рдБ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдЬрд╣рд╛рдБ рдкрд╣рд▓рд╛ рддрд░реНрдХ рдХреЛрдИ рднреА рд╕рдХрд╛рд░рд╛рддреНрдордХ рдорд╛рди рд▓реЗ рд╕рдХрддрд╛ рд╣реИ, рджреВрд╕рд░рд╛ рдирдХрд╛рд░рд╛рддреНрдордХ, рддреАрд╕рд░рд╛ рд╢реВрдиреНрдп рдФрд░ рдЖрдЙрдЯрдкреБрдЯ рддрд░реНрдХ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, 42ред

рдПрдХ рдмрд╛рд░ рдореЗрдВ рдкреНрд░рддреАрдХрд╛рддреНрдордХ рдЧрдгрдирд╛ рд╣рдореЗрдВ рдпрд╣ рдЙрддреНрддрд░ рджреЗрдЧреА рдХрд┐ рдХреНрдпрд╛ рд╣рдорд╛рд░реЗ рд▓рд┐рдП рд╡рд╛рдВрдЫрд┐рдд рдкрд░рд┐рдгрд╛рдо рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ рдФрд░ рдРрд╕реЗ рдЗрдирдкреБрдЯ рдорд╛рдкрджрдВрдбреЛрдВ рдХреЗ рдПрдХ рд╕реЗрдЯ рдХрд╛ рдЙрджрд╛рд╣рд░рдг рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ рд╕рдВрднрд╡ рд╣реИред рдпрд╛ рд╕рдмреВрдд рд╣реИ рдХрд┐ рдРрд╕реЗ рдХреЛрдИ рдкреИрд░рд╛рдореАрдЯрд░ рдирд╣реАрдВ рд╣реИрдВред

рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рд╣рдо рдЗрдирдкреБрдЯ рддрд░реНрдХреЛрдВ рдХреЛ рд╕рднреА рд╕рдВрднрд╛рд╡рд┐рдд рддрд░реНрдХреЛрдВ рдкрд░ рд╕реЗрдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдФрд░ рдХреЗрд╡рд▓ рдЖрдЙрдЯрдкреБрдЯ рддрд░реНрдХреЛрдВ рдХрд╛ рдЪрдпрди рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд╡реНрдпрд╡рд╕реНрдерд╛рдкрдХ рдкрд╛рд╕рд╡рд░реНрдбред

рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рд╣рдо рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХреА рд╕рднреА рдХрдордЬреЛрд░рд┐рдпреЛрдВ рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рдПрдВрдЧреЗ рдпрд╛ рдЗрд╕ рдмрд╛рдд рдХрд╛ рдкреНрд░рдорд╛рдг рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВрдЧреЗ рдХрд┐ рд╡реНрдпрд╡рд╕реНрдерд╛рдкрдХ рдХрд╛ рдкрд╛рд╕рд╡рд░реНрдб рд╕реБрд░рдХреНрд╖рд┐рдд рд╣реИред

рдпрд╣ рдзреНрдпрд╛рди рджрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдЗрдирдкреБрдЯ рдбреЗрдЯрд╛ рдХреЗ рд╕рд╛рде рдХрд┐рд╕реА рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХрд╛ рд╢рд╛рд╕реНрддреНрд░реАрдп рдирд┐рд╖реНрдкрд╛рджрди рдкреНрд░рддреАрдХрд╛рддреНрдордХ рдирд┐рд╖реНрдкрд╛рджрди рдХрд╛ рдПрдХ рд╡рд┐рд╢реЗрд╖ рдорд╛рдорд▓рд╛ рд╣реИред

рдЗрд╕рд▓рд┐рдП, рдореЗрд░рд╛ рдЪрд░рд┐рддреНрд░ рд╡реАрдПрдо рдПрдХ рдорд╛рдирдХ рд╡рд░реНрдЪреБрдЕрд▓ рдорд╢реАрди рдХреЗ рдЗрдореНрдпреВрд▓реЗрд╢рди рдореЛрдб рдореЗрдВ рднреА рдХрд╛рдо рдХрд░ рд╕рдХрддрд╛ рд╣реИред

рдкрд┐рдЫрд▓реЗ рд▓реЗрдЦ рдХреА рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдореЗрдВ рдЗрд╕рдХреА рдХрдордЬреЛрд░рд┐рдпреЛрдВ рдХреА рдЪрд░реНрдЪрд╛ рдХреЗ рд╕рд╛рде рдФрдкрдЪрд╛рд░рд┐рдХ рд╕рддреНрдпрд╛рдкрди рдХреА рдирд┐рд╖реНрдкрдХреНрд╖ рдЖрд▓реЛрдЪрдирд╛ рдкрд╛рдИ рдЬрд╛ рд╕рдХрддреА рд╣реИред

рдореБрдЦреНрдп рд╕рдорд╕реНрдпрд╛рдПрдБ рд╣реИрдВ:

  1. рд╕рдВрдпреБрдХреНрдд рд╡рд┐рд╕реНрдлреЛрдЯ, рдЪреВрдБрдХрд┐ рдФрдкрдЪрд╛рд░рд┐рдХ рд╕рддреНрдпрд╛рдкрди рдЕрдВрддрддрдГ P=NP рдкрд░ рдЖ рдЬрд╛рддрд╛ рд╣реИ
  2. рдлрд╝рд╛рдЗрд▓ рд╕рд┐рд╕реНрдЯрдо, рдиреЗрдЯрд╡рд░реНрдХ рдФрд░ рдЕрдиреНрдп рдмрд╛рд╣реНрдп рд╕рдВрдЧреНрд░рд╣рдг рдкрд░ рдХреЙрд▓ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рдирд╛ рд╕рддреНрдпрд╛рдкрд┐рдд рдХрд░рдирд╛ рдЕрдзрд┐рдХ рдХрдард┐рди рд╣реИ
  3. рд╡рд┐рдирд┐рд░реНрджреЗрд╢ рдореЗрдВ рдмрдЧ, рдЬрдм рдЧреНрд░рд╛рд╣рдХ рдпрд╛ рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рдПрдХ рдЪреАрдЬрд╝ рдХрд╛ рдЗрд░рд╛рджрд╛ рд░рдЦрддреЗ рдереЗ, рд▓реЗрдХрд┐рди рддрдХрдиреАрдХреА рд╡рд┐рдирд┐рд░реНрджреЗрд╢ рдореЗрдВ рдЗрд╕рдХрд╛ рдкрд░реНрдпрд╛рдкреНрдд рд╕рдЯреАрдХ рд╡рд░реНрдгрди рдирд╣реАрдВ рдХрд░рддреЗ рдереЗред

рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк, рдкреНрд░реЛрдЧреНрд░рд╛рдо рд╕рддреНрдпрд╛рдкрд┐рдд рд╣реЛ рдЬрд╛рдПрдЧрд╛ рдФрд░ рд╡рд┐рдирд┐рд░реНрджреЗрд╢реЛрдВ рдХрд╛ рдЕрдиреБрдкрд╛рд▓рди рдХрд░реЗрдЧрд╛, рд▓реЗрдХрд┐рди рдпрд╣ рд░рдЪрдирд╛рдХрд╛рд░реЛрдВ рдХреА рдЕрдкреЗрдХреНрд╖рд╛ рд╕реЗ рдмрд┐рд▓реНрдХреБрд▓ рдЕрд▓рдЧ рдХреБрдЫ рдХрд░реЗрдЧрд╛ред

рдЪреВрдВрдХрд┐ рдЗрд╕ рд▓реЗрдЦ рдореЗрдВ рдореИрдВ рдореБрдЦреНрдп рд░реВрдк рд╕реЗ рд╡реНрдпрд╡рд╣рд╛рд░ рдореЗрдВ рдФрдкрдЪрд╛рд░рд┐рдХ рд╕рддреНрдпрд╛рдкрди рдХреЗ рдЙрдкрдпреЛрдЧ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ, рдореИрдВ рдЕрднреА рджреАрд╡рд╛рд░ рдХреЗ рдЦрд┐рд▓рд╛рдл рдЕрдкрдирд╛ рд╕рд┐рд░ рдирд╣реАрдВ рдлреЛрдбрд╝реВрдВрдЧрд╛, рдФрд░ рдПрдХ рдРрд╕реА рдкреНрд░рдгрд╛рд▓реА рдЪреБрдиреВрдВрдЧрд╛ рдЬрд╣рд╛рдВ рдПрд▓реНрдЧреЛрд░рд┐рджрдо рдЬрдЯрд┐рд▓рддрд╛ рдФрд░ рдмрд╛рд╣рд░реА рдХреЙрд▓ рдХреА рд╕рдВрдЦреНрдпрд╛ рдиреНрдпреВрдирддрдо рд╣реЛред

рдЪреВрдВрдХрд┐ рд╕реНрдорд╛рд░реНрдЯ рдХреЙрдиреНрдЯреНрд░реИрдХреНрдЯ рдЗрди рдЖрд╡рд╢реНрдпрдХрддрд╛рдУрдВ рдХреЗ рд▓рд┐рдП рд╕рдмрд╕реЗ рдЙрдкрдпреБрдХреНрдд рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рд╡рд┐рдХрд▓реНрдк рд╡реЗрд╡реНрд╕ рдкреНрд▓реЗрдЯрдлрд╝реЙрд░реНрдо рд╕реЗ RIDE рдХреЙрдиреНрдЯреНрд░реИрдХреНрдЯреНрд╕ рдкрд░ рдЧрд┐рд░ рдЧрдпрд╛: рд╡реЗ рдЯреНрдпреВрд░рд┐рдВрдЧ рдкреВрд░реНрдг рдирд╣реАрдВ рд╣реИрдВ, рдФрд░ рдЙрдирдХреА рдЕрдзрд┐рдХрддрдо рдЬрдЯрд┐рд▓рддрд╛ рдХреГрддреНрд░рд┐рдо рд░реВрдк рд╕реЗ рд╕реАрдорд┐рдд рд╣реИред

рд▓реЗрдХрд┐рди рд╣рдо рдЙрди рдкрд░ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рддрдХрдиреАрдХреА рдкрдХреНрд╖ рд╕реЗ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВрдЧреЗред

рд╕рдм рдХреБрдЫ рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдФрдкрдЪрд╛рд░рд┐рдХ рд╕рддреНрдпрд╛рдкрди рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдХрд┐рд╕реА рднреА рдЕрдиреБрдмрдВрдз рдХреА рдорд╛рдВрдЧ рдореЗрдВ рд╣реЛрдЧрд╛: рд▓реЙрдиреНрдЪ рд╣реЛрдиреЗ рдХреЗ рдмрд╛рдж рдЕрдиреБрдмрдВрдз рддреНрд░реБрдЯрд┐ рдХреЛ рдареАрдХ рдХрд░рдирд╛ рдЖрдорддреМрд░ рдкрд░ рдЕрд╕рдВрднрд╡ рд╣реИред
рдФрд░ рдРрд╕реА рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреА рд▓рд╛рдЧрдд рдмрд╣реБрдд рдЕрдзрд┐рдХ рд╣реЛ рд╕рдХрддреА рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рд╕реНрдорд╛рд░реНрдЯ рдЕрдиреБрдмрдВрдзреЛрдВ рдкрд░ рдЕрдХреНрд╕рд░ рдмрдбрд╝реА рдорд╛рддреНрд░рд╛ рдореЗрдВ рдзрдирд░рд╛рд╢рд┐ рд╕рдВрдЧреНрд░рд╣реАрдд рдХреА рдЬрд╛рддреА рд╣реИред

рдореЗрд░реА рдкреНрд░рддреАрдХрд╛рддреНрдордХ рд╡рд░реНрдЪреБрдЕрд▓ рдорд╢реАрди PHP рдФрд░ Python рдореЗрдВ рд▓рд┐рдЦреА рдЧрдИ рд╣реИ, рдФрд░ рдкрд░рд┐рдгрд╛рдореА SMT рдлрд╝рд╛рд░реНрдореБрд▓реЛрдВ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП Microsoft рд░рд┐рд╕рд░реНрдЪ рд╕реЗ Z3Prover рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреА рд╣реИред

рдЗрд╕рдХреЗ рдореВрд▓ рдореЗрдВ рдПрдХ рд╢рдХреНрддрд┐рд╢рд╛рд▓реА рдмрд╣реБ-рд▓реЗрди-рджреЗрди рд╕рдВрдмрдВрдзреА рдЦреЛрдЬ рд╣реИ, рдЬреЛ
рдЖрдкрдХреЛ рд╕рдорд╛рдзрд╛рди рдпрд╛ рдХрдордЬреЛрд░рд┐рдпрд╛рдБ рдвреВрдВрдврдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ, рднрд▓реЗ рд╣реА рдЗрд╕рдХреЗ рд▓рд┐рдП рдХрдИ рд▓реЗрди-рджреЗрди рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛред
рдФрд░ рднреА рдорд┐рдердХрдПрдереЗрд░рд┐рдпрдо рдХреА рдХрдордЬреЛрд░рд┐рдпреЛрдВ рдХреЛ рдЦреЛрдЬрдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдмрд╕реЗ рд╢рдХреНрддрд┐рд╢рд╛рд▓реА рдкреНрд░рддреАрдХрд╛рддреНрдордХ рд░реВрдкрд░реЗрдЦрд╛рдУрдВ рдореЗрдВ рд╕реЗ рдПрдХ, рдЗрд╕ рдХреНрд╖рдорддрд╛ рдХреЛ рдХреБрдЫ рдорд╣реАрдиреЗ рдкрд╣рд▓реЗ рд╣реА рдЬреЛрдбрд╝рд╛ рдЧрдпрд╛ рдерд╛ред

рд▓реЗрдХрд┐рди рдпрд╣ рдзреНрдпрд╛рди рджреЗрдиреЗ рдпреЛрдЧреНрдп рд╣реИ рдХрд┐ рдИрдерд░ рдЕрдиреБрдмрдВрдз рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ рдФрд░ рдЯреНрдпреВрд░рд┐рдВрдЧ рдкреВрд░реНрдг рд╣реИрдВред

PHP RIDE рд╕реНрдорд╛рд░реНрдЯ рдХреЙрдиреНрдЯреНрд░реИрдХреНрдЯ рдХреЗ рд╕реНрд░реЛрдд рдХреЛрдб рдХреЛ рдПрдХ рдкрд╛рдпрдерди рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдореЗрдВ рдЕрдиреБрд╡рд╛рджрд┐рдд рдХрд░рддрд╛ рд╣реИ, рдЬрд┐рд╕рдореЗрдВ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХреЛ рдЕрдиреБрдмрдВрдз рд░рд╛рдЬреНрдпреЛрдВ рдФрд░ рдЙрдирдХреЗ рд╕рдВрдХреНрд░рдордгреЛрдВ рдХреЗ рд▓рд┐рдП Z3 SMT-рд╕рдВрдЧрдд рдкреНрд░рдгрд╛рд▓реА рдХреЗ рд░реВрдк рдореЗрдВ рдкреНрд░рд╕реНрддреБрдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ:

рд╢реБрд░реБрдЖрдд рд╕реЗ рдПрдХ рдФрдкрдЪрд╛рд░рд┐рдХ рд╕рддреНрдпрд╛рдкрди рдкреНрд░рдгрд╛рд▓реА рдмрдирд╛рдирд╛ред рднрд╛рдЧ 1: PHP рдФрд░ рдкрд╛рдпрдерди рдореЗрдВ рдХреИрд░реЗрдХреНрдЯрд░ рд╡рд░реНрдЪреБрдЕрд▓ рдорд╢реАрди

рдЕрдм рдореИрдВ рд╡рд┐рд╕реНрддрд╛рд░ рд╕реЗ рдмрддрд╛рдКрдВрдЧрд╛ рдХрд┐ рдЕрдВрджрд░ рдХреНрдпрд╛ рд╣реЛ рд░рд╣рд╛ рд╣реИред

рд▓реЗрдХрд┐рди рдкрд╣рд▓реЗ, RIDE рд╕реНрдорд╛рд░реНрдЯ рдХреЙрдиреНрдЯреНрд░реИрдХреНрдЯ рднрд╛рд╖рд╛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреБрдЫ рд╢рдмреНрджред

рдпрд╣ рдПрдХ рдХрд╛рд░реНрдпрд╛рддреНрдордХ рдФрд░ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐-рдЖрдзрд╛рд░рд┐рдд рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рднрд╛рд╖рд╛ рд╣реИ рдЬреЛ рдбрд┐рдЬрд╛рдЗрди рдореЗрдВ рдЖрд▓рд╕реА рд╣реИред
RIDE рдмреНрд▓реЙрдХрдЪреЗрди рдХреЗ рднреАрддрд░ рдЕрд▓рдЧрд╛рд╡ рдореЗрдВ рдЪрд▓рддрд╛ рд╣реИ рдФрд░ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ рд╡реЙрд▓реЗрдЯ рд╕реЗ рдЬреБрдбрд╝реЗ рд╕реНрдЯреЛрд░реЗрдЬ рд╕реЗ рдЬрд╛рдирдХрд╛рд░реА рдкреНрд░рд╛рдкреНрдд рдФрд░ рд▓рд┐рдЦ рд╕рдХрддрд╛ рд╣реИред

рдЖрдк рдкреНрд░рддреНрдпреЗрдХ рд╡реЙрд▓реЗрдЯ рдореЗрдВ рдПрдХ RIDE рдЕрдиреБрдмрдВрдз рд╕рдВрд▓рдЧреНрди рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдФрд░ рдирд┐рд╖реНрдкрд╛рджрди рдХрд╛ рдкрд░рд┐рдгрд╛рдо рдХреЗрд╡рд▓ 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 рдлрд┐рд░ рдЙрдиреНрд╣реЗрдВ Python рдореЗрдВ 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] )  

рд╢рд░реНрддреЛрдВ рдХреЛ рдХреНрд░рдордмрджреНрдз рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдкрд╛рдпрдерди рдореЗрдВ рдПрд╕рдПрдордЯреА рдкреНрд░рдгрд╛рд▓реА рдХрд╛ рд╡рд░реНрдгрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдбрд┐рдЬрд╝рд╛рдЗрди рдХрд┐рдП рдЧрдП рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдЯреЗрдореНрдкрд▓реЗрдЯ рдореЗрдВ рдбрд╛рд▓рд╛ рдЬрд╛рддрд╛ рд╣реИред

рд░рд┐рдХреНрдд рдЯреЗрдореНрдкрд▓реЗрдЯ


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 рд╢рд░реНрддреЛрдВ рдХреЗ рд╕рдЯреАрдХ рд╕реЗрдЯ рдХреА рддрд▓рд╛рд╢ рдХрд░реЗрдЧрд╛ рдЬреЛ рдЕрдВрддрддрдГ рдЕрдиреБрдмрдВрдз рд╕реЗ рдзрди рдирд┐рдХрд╛рд▓рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдЧрд╛ред

рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк, рд╣рдореЗрдВ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рд╣рдорд╛рд░реЗ рдЕрдиреБрдмрдВрдз рдХрд╛ рдкреВрд░реНрдгрддрдГ рдХрд╛рд░реНрдпрд╛рддреНрдордХ рдПрд╕рдПрдордЯреА рдореЙрдбрд▓ рдкреНрд░рд╛рдкреНрдд рд╣реЛрддрд╛ рд╣реИред
рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдпрд╣ рдореЗрд░реЗ рдкрд┐рдЫрд▓реЗ рд▓реЗрдЦ рдХреЗ рдореЙрдбрд▓ рд╕реЗ рдХрд╛рдлреА рдорд┐рд▓рддрд╛-рдЬреБрд▓рддрд╛ рд╣реИ, рдЬрд┐рд╕реЗ рдореИрдВрдиреЗ рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ рд╕рдВрдХрд▓рд┐рдд рдХрд┐рдпрд╛ рдерд╛ред

рдкреВрд░реНрдг рдЯреЗрдореНрдкрд▓реЗрдЯ


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()
 


рд▓реЙрдиреНрдЪ рдХреЗ рдмрд╛рдж, Z3Pover рд╕реНрдорд╛рд░реНрдЯ рдЕрдиреБрдмрдВрдз рдХреЛ рд╣рд▓ рдХрд░рддрд╛ рд╣реИ рдФрд░ рд╣рдореЗрдВ рд▓реЗрдирджреЗрди рдХреА рдПрдХ рд╢реНрд░реГрдВрдЦрд▓рд╛ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ рдЬреЛ рд╣рдореЗрдВ рдзрди рдирд┐рдХрд╛рд▓рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдЧрд╛:

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

}

рдЪреВрдБрдХрд┐ рдпрд╣ рдкрд╣рд▓рд╛ рд╕рдВрд╕реНрдХрд░рдг рд╣реИ, рд╕рд┐рдВрдЯреИрдХреНрд╕ рдмрд╣реБрдд рд╕реАрдорд┐рдд рд╣реИ рдФрд░ рдЗрд╕рдореЗрдВ рдмрдЧ рднреА рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВред
рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд▓реЗрдЦреЛрдВ рдореЗрдВ, рдореИрдВ рд╡реАрдПрдо рдХреЗ рдЖрдЧреЗ рдХреЗ рд╡рд┐рдХрд╛рд╕ рдХреЛ рдХрд╡рд░ рдХрд░рдиреЗ рдХреА рдпреЛрдЬрдирд╛ рдмрдирд╛ рд░рд╣рд╛ рд╣реВрдВ, рдФрд░ рдпрд╣ рджрд┐рдЦрд╛рдКрдВрдЧрд╛ рдХрд┐ рдЖрдк рдЗрд╕рдХреА рдорджрдж рд╕реЗ рдФрдкрдЪрд╛рд░рд┐рдХ рд░реВрдк рд╕реЗ рд╕рддреНрдпрд╛рдкрд┐рдд рд╕реНрдорд╛рд░реНрдЯ рдЕрдиреБрдмрдВрдз рдХреИрд╕реЗ рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВ, рди рдХрд┐ рдХреЗрд╡рд▓ рдЙрдиреНрд╣реЗрдВ рд╣рд▓ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

рдХреИрд░реЗрдХреНрдЯрд░ рд╡рд░реНрдЪреБрдЕрд▓ рдорд╢реАрди рдпрд╣рд╛рдВ рдЙрдкрд▓рдмреНрдз рд╣реИ http://2.59.42.98/hyperbox/
рдкреНрд░рддреАрдХрд╛рддреНрдордХ рд╡реАрдПрдо рдХреЗ рд╕реНрд░реЛрдд рдХреЛрдб рдХреЛ рдХреНрд░рдо рдореЗрдВ рд░рдЦрдиреЗ рдФрд░ рд╡рд╣рд╛рдВ рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдВ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рдмрд╛рдж, рдореИрдВ рдЗрд╕реЗ рдореБрдлреНрдд рдкрд╣реБрдВрдЪ рдХреЗ рд▓рд┐рдП GitHub рдкрд░ рдбрд╛рд▓рдиреЗ рдХреА рдпреЛрдЬрдирд╛ рдмрдирд╛ рд░рд╣рд╛ рд╣реВрдВред

рд╕реНрд░реЛрдд: www.habr.com

рдПрдХ рдЯрд┐рдкреНрдкрдгреА рдЬреЛрдбрд╝реЗрдВ