Coq рдХреЗ рд▓рд┐рдП рдирд░рдо рдкрд░рд┐рдЪрдп: рдЖрдЧрдордирд╛рддреНрдордХ рдкрд░рд┐рднрд╛рд╖рд╛рдПрдБ

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

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

CoIDEIDE рдХреЗ рдкреНрд░рд╛рд░рдВрдн рдореЗрдВ, рдХреБрдЫ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдкреГрд╖реНрдарднреВрдорд┐ рдореЗрдВ рдорд┐рддреНрд░ рдмрди рдЬрд╛рддреЗ рд╣реИрдВ, рдЬрд┐рдирдореЗрдВ рд╕реЗ рдПрдХ рд╕реВрдЪреА Print Libraries рдХрдорд╛рдВрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рджреЗрдЦреА рдЬрд╛ рд╕рдХрддреА рд╣реИ:

 рднрд░реА рд╣реБрдИ рдФрд░ рдЖрдпрд╛рддрд┐рдд рдкреБрд╕реНрддрдХрд╛рд▓рдп рдлрд╛рдЗрд▓реЗрдВ: 
   Coq.Init.Notations 
   Coq.Init.Logic 
   Coq.Init.Datatypes 
   Coq.Init.Specif 
   Coq.Init.Peano 
   Coq.Init.Wf 
   Coq.Init.Tactics 
   Coq.Init.Prelude 
   Coq.Init.Logic_Type

рд╢реИрдХреНрд╖рдгрд┐рдХ рдЙрджреНрджреЗрд╢реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП, рд╣рдо рдЗрди рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдХреА рдкрд░рд┐рднрд╛рд╖рд╛рдУрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░реЗрдВрдЧреЗред

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

рдкреНрд░рд╛рдХреГрддрд┐рдХ рд╕рдВрдЦреНрдпрд╛


рдЧрдгрд┐рдд рдореЗрдВ рд╣рд░ рдЬрдЧрд╣ рдкреНрд░реЗрд░рдХ рдкрд░рд┐рднрд╛рд╖рд╛рдПрдБ рдкрд╛рдИ рдЬрд╛рддреА рд╣реИрдВред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд╕реЗрдЯ рд╕рд┐рджреНрдзрд╛рдВрдд рдХреЗ рджреГрд╖реНрдЯрд┐рдХреЛрдг рд╕реЗ рдкреНрд░рд╛рдХреГрддрд┐рдХ рд╕рдВрдЦреНрдпрд╛рдПрдВ рдирд┐рдореНрдирд╛рдиреБрд╕рд╛рд░ рдкреЗрд╢ рдХреА рдЧрдИ рд╣реИрдВ:

рдЫрд╡рд┐

рдЗрд╕реА рддрд░рд╣, рд╣рдо Coq рдореЗрдВ рдкреНрд░рд╛рдХреГрддрд┐рдХ рд╕рдВрдЦреНрдпрд╛рдУрдВ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдирд╛рдо рд╕реНрдерд╛рди рдХреЛ рд░реЛрдХрдирд╛ рдирд╣реАрдВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рдореЙрдбреНрдпреВрд▓ рд╕рд┐рд╕реНрдЯрдо рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ:

 рдореЙрдбреНрдпреВрд▓ рдЯреЗрд╕реНрдЯ 1ред 

 рдЖрдЧрдордирд╛рддреНрдордХ рдирдЯ: рдкреНрд░рдХрд╛рд░: = 
   |  рдУ: рдирдЯ 
   |  рд╕: рдирдЯ -> рдирдЯред 

рдЗрд╕ рдШреЛрд╖рдгрд╛ рдХреЛ рдЗрд╕ рддрд░рд╣ рдкрдврд╝рдирд╛ рдЪрд╛рд╣рд┐рдП:

  1. O рдПрдХ рдкреНрд░рд╛рдХреГрддрд┐рдХ рд╕рдВрдЦреНрдпрд╛ рд╣реИ,
  2. S рдПрдХ рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рд╣реИ рдЬреЛ рдПрдХ рд╕рдХрд╛рд░рд╛рддреНрдордХ рдкреВрд░реНрдгрд╛рдВрдХ рд▓реЗрддрд╛ рд╣реИ рдФрд░ рдПрдХ рдФрд░ рд╕рдХрд╛рд░рд╛рддреНрдордХ рдкреВрд░реНрдгрд╛рдВрдХ рд▓реМрдЯрд╛рддрд╛ рд╣реИ: рдпрджрд┐ n construct N, рддреЛ S n тИИ Nред

рдЗрд╕ рдкрд░рд┐рднрд╛рд╖рд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ, рд╣рдо рдХрд┐рд╕реА рднреА рдкреНрд░рд╛рдХреГрддрд┐рдХ рд╕рдВрдЦреНрдпрд╛ рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:

 (рдПрд╕рдУ) рдореЗрдВ рд╕рд░рд▓ рд╕рд╛рдХреНрд╖реНрдпред
 (* ==> 1: nat *)
 рдореЗрдВ рд╕рд░рд▓ (рдПрд╕ (рдПрд╕рдУ))ред
 (* ==> 2: nat *)
 рдореЗрдВ рд╕рд░рд▓ (рдПрд╕ (рдПрд╕ (рдПрд╕рдУ)))ред
 (* ==> 3: nat *)

рдЕрдм рдЬрдм рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдкреНрд░рд╛рдХреГрддрд┐рдХ рд╕рдВрдЦреНрдпрд╛рдПрдВ рд╣реИрдВ, рддреЛ рдЗрди рд╕рдВрдЦреНрдпрд╛рдУрдВ рдкрд░ рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рдПрдХ рд╕реЗрдЯ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдиреЗ рдХрд╛ рд╕рдордп рд╣реИ:

 рдлрд╝рд┐рдХреНрд╕рдкреЙрдЗрдВрдЯ рдкреНрд▓рд╕ (n: nat) (m: nat): nat: =
   n рдХреЗ рд╕рд╛рде рдореИрдЪ
     |  рдУ => рдо
     |  S n '=> S (рдкреНрд▓рд╕ n' m)
   рдЕрдВрддред

рдпрд╣рд╛рдВ рд╣рдордиреЗ рдПрдХ рдкреБрдирд░рд╛рд╡рд░реНрддреА ( Fixpoint рдХреАрд╡рд░реНрдб) plus рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рд╣реИ рдЬреЛ рдЗрдирдкреБрдЯ рдХреЗ рд░реВрдк рдореЗрдВ рджреЛ nat рддрд░реНрдХ рд▓реЗрддрд╛ рд╣реИ рдФрд░ рдЯрд╛рдЗрдк Fixpoint рдПрдХ рдкрд░рд┐рдгрд╛рдо рджреЗрддрд╛ рд╣реИред рдЖрдк рдЗрд╕реЗ Check рдХрдорд╛рдВрдб рд╕реЗ рд╕рддреНрдпрд╛рдкрд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:

 рдкреНрд▓рд╕ рдЪреЗрдХ рдХрд░реЗрдВред
 (* ==> рдкреНрд▓рд╕: рдиреЗрдЯ -> рдиреЗрдЯ -> рдиреЗрдЯ *)

рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдЙрджрд╛рд╣рд░рдг рдкрд░ рдЙрд╕рдХреЗ рдХрд╛рдо рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВред рд╣рдо рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ 3 + 2 рдХреЗ рдореВрд▓реНрдп рдХреА рдЧрдгрдирд╛ рдХрд░рддреЗ рд╣реИрдВ:

 ((рдПрд╕ (рдПрд╕ (рдПрд╕))) (рдПрд╕ (рдПрд╕рдУ))) рдореЗрдВ рд╕рд░рд▓ рд╕рд╛рдХреНрд╖реНрдпред
 (* ==> 5: nat *)

рдмрд╣реБрдд рдмрдврд╝рд┐рдпрд╛! рд╕рдм рдХреБрдЫ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред рд▓реЗрдХрд┐рди рдЗрд╕рдХрд╛ рдкрд░рд┐рдгрд╛рдо рдХреИрд╕реЗ рд╣реЛрддрд╛ рд╣реИ?

 (* рдкреНрд▓рд╕ (рдПрд╕ (рдПрд╕ (рдПрд╕рдУ))) (рдПрд╕ (рдПрд╕рдУ))    
 ==> рдПрд╕ (рдкреНрд▓рд╕ (рдПрд╕ (рдПрд╕рдУ)) (рдПрд╕ (рдПрд╕рдУ)) рдкрд░рд┐рднрд╛рд╖рд╛ рдореЗрдВ рджреВрд╕рд░рд╛ рдЦрдВрдб
 ==> рдПрд╕ (рдПрд╕ (рдкреНрд▓рд╕ (рдПрд╕рдУ) (рдПрд╕ (рдПрд╕рдУ)))) рдкрд░рд┐рднрд╛рд╖рд╛ рдореЗрдВ рджреВрд╕рд░рд╛ рдЦрдВрдб
 ==> рдПрд╕ (рдПрд╕ (рдПрд╕ (рдкреНрд▓рд╕ рдУ (рдПрд╕))))) рдкрд░рд┐рднрд╛рд╖рд╛ рдореЗрдВ рджреВрд╕рд░рд╛ рдЦрдВрдб
 ==> рдПрд╕ (рдПрд╕ (рдПрд╕ (рдПрд╕ (рдПрд╕)))) рдкрд░рд┐рднрд╛рд╖рд╛ рдореЗрдВ рдкрд╣рд▓рд╛ рдЦрдВрдб рд╣реИ
 *)

рдЗрд╕реА рддрд░рд╣ рд╕реЗ, рдЖрдк рдПрдХ рдЧреБрдгрди рдлрд╝рдВрдХреНрд╢рди рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рддрдереНрдпрд╛рддреНрдордХ рдЧрдгрдирд╛ рдХреЛ рд▓рд╛рдЧреВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЬрд┐рд╕рдХреЗ рдмрд┐рдирд╛ рдХрд╛рд░реНрдпрд╛рддреНрдордХ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рдкрд░ рдПрдХ рднреА рдкрд╛рдареНрдпрдкреБрд╕реНрддрдХ рдирд╣реАрдВ рджреА рдЬрд╛ рд╕рдХрддреА рд╣реИ:

 рдлрд┐рдХреНрд╕ рдкреЙрдЗрдВрдЯ рдорд▓реНрдЯреА (nm: nat): nat: =
   n рдХреЗ рд╕рд╛рде рдореИрдЪ
     |  рдУ => рдУ
     |  S n '=> рдкреНрд▓рд╕ m (рдмрд╣реБ n' m)
   рдЕрдВрддред

 рдирд┐рдпрддрд╛рдВрдХ рддрдереНрдп (n: nat): nat: =
   n рдХреЗ рд╕рд╛рде рдореИрдЪ
     |  рдУ => рдПрд╕рдУ
     |  S n '=> рдмрд╣реБ n (рднрд╛рдЬреНрдп n')
   рдЕрдВрддред

 рдореЗрдВ рд╕рд░рд▓ (рддрдереНрдпрд╛рддреНрдордХ (рдПрд╕ (рдПрд╕ (рдПрд╕ (рдПрд╕ (рдПрд╕)))))))ред
 (* ==> 120: nat *)

рдирд┐рд╖реНрдХрд░реНрд╖


рд╕рд╛рдордЧреНрд░реА рдХреЛ рдордЬрдмреВрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдореИрдВ рджреГрдврд╝рддрд╛ рд╕реЗ рдЕрдиреБрд╢рдВрд╕рд╛ рдХрд░рддрд╛ рд╣реВрдВ рдХрд┐ рдкрд╛рдардХ рдХреЛрдХрд╛рдЗрдб рдореЗрдВ рд╕рднреА рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХреЛ рдЪрд▓рд╛рдПрдВред рдЕрдЧрд▓реЗ рднрд╛рдЧ рдореЗрдВ, рд╣рдо рдореВрд▓ Coq рд░рдгрдиреАрддрд┐ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВрдЧреЗред

рдЬрд╛рд░реА рд░рдЦрд╛ рдЬрд╛рдП ред

Source: https://habr.com/ru/post/In182748/


All Articles