рдЬреЛрдбрд╝реЗ рдФрд░ рд╕реВрдЪрд┐рдпрд╛рдБ
рдкрд┐рдЫрд▓реЗ рднрд╛рдЧреЛрдВ рдореЗрдВ, рд╣рдордиреЗ рд╕реАрдЦрд╛ рдХрд┐ рдирдП рдбреЗрдЯрд╛ рдкреНрд░рдХрд╛рд░ рдХреИрд╕реЗ рд╕реЗрдЯ рдХрд░реЗрдВ, рдЙрдирдХреЗ рдКрдкрд░ рдлрд╝рдВрдХреНрд╢рдВрд╕ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░реЗрдВ рдФрд░ рд╕рд╛рдорд╛рдиреНрдп рд░рдгрдиреАрддрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЙрдирдХреА рд╢реБрджреНрдзрддрд╛ рдХреЛ рд╕рд╛рдмрд┐рдд рдХрд░реЗрдВред рдпрд╣ рдЙрдирдХреЗ рдКрдкрд░ рдХреБрдЫ рдбреЗрдЯрд╛ рд╕рдВрд░рдЪрдирд╛рдУрдВ рдФрд░ рдЙрдЪреНрдЪ-рдХреНрд░рдо рдХреЗ рдХрд╛рд░реНрдпреЛрдВ (рдмрд╛рдж рдореЗрдВ рдПрдлрдбрдмреНрд▓реНрдпреВрдкреА) рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдиреЗ рдХрд╛ рд╕рдордп рд╣реИред
рдПрдХ рдЖрдЧрдордирд╛рддреНрдордХ рдкрд░рд┐рднрд╛рд╖рд╛ рдореЗрдВ, рдкреНрд░рддреНрдпреЗрдХ рдирд┐рд░реНрдорд╛рддрд╛ рдореЗрдВ рдПрдХ рдордирдорд╛рдирд╛ рд╕рдВрдЦреНрдпрд╛ рдореЗрдВ рдкреИрд░рд╛рдореАрдЯрд░ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдПрдХ рдкрд░рд┐рднрд╛рд╖рд╛
рдЖрдЧрдордирд╛рддреНрдордХ natprod: рдкреНрд░рдХрд╛рд░: =
рдЬреЛрдбрд╝реА: рдирдЯ -> рдирдЯ -> рдирдЯрдкреНрд░реЛрдбред
рдЗрд╕ рддрд░рд╣ рд╕реЗ рдкрдврд╝реЗрдВ: рд╕рдВрдЦреНрдпрд╛рдУрдВ рдХреА рдПрдХ рдЬреЛрдбрд╝реА рдмрдирд╛рдиреЗ рдХрд╛ рдХреЗрд╡рд▓ рдПрдХ рд╣реА рддрд░реАрдХрд╛ рд╣реИ - рдкреНрд░рдХрд╛рд░ рдХреЗ
nat
рджреЛ рддрд░реНрдХреЛрдВ рдХреЗ рд▓рд┐рдП
pair
рдирд┐рд░реНрдорд╛рддрд╛ рдХреЛ рд▓рд╛рдЧреВ рдХрд░реЗрдВ
рдореЗрдВ рд╕рд░рд▓ (рдЬреЛрдбрд╝реА 1 2)ред
(* ==> рдЬреЛрдбрд╝реА 1 2: рдиреЗрдЯрдкреНрд░реЛрдб *)
Coq рдореЗрдВ
Notation
рд╢рд░реНрдХрд░рд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ
Notation
рдХрдорд╛рдВрдб рдХрд╛ рдкреНрд░рдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рддрдВрддреНрд░ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд╣рдо рдЙрдкрд╕рд░реНрдЧ рдлреЙрд░реНрдо рд╕реЗ рдЫреБрдЯрдХрд╛рд░рд╛ рдкрд╛ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рд╕рдВрдЦреНрдпрд╛рдУрдВ рдХреЗ рдЬреЛрдбрд╝реЗ рдХреЛ рдЗрд╕ рддрд░рд╣ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:
рд╕рдВрдХреЗрддрди "(x, y)": = (рдЬреЛрдбрд╝реА xy)ред
рдЗрд╕ рдирдП рд╕рдВрдХреЗрддрди рдХреЛ рдЕрдм рд╡реНрдпрд╛рдкрдХ рд░реВрдк рд╕реЗ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдФрд░ рдХрд╛рд░реНрдпреЛрдВ рдФрд░ рдкрд░рд┐рднрд╛рд╖рд╛рдУрдВ рдХреЗ рд╡рд┐рд╡рд░рдгреЛрдВ рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:
рдкрд░рд┐рднрд╛рд╖рд╛ fst (p: natprod): nat: =
рдореИрдЪ рдкреА рдХреЗ рд╕рд╛рде
| (x, y) => x
рдЕрдВрддред
рдкрд░рд┐рднрд╛рд╖рд╛ snd (p: natprod): nat: =
рдореИрдЪ рдкреА рдХреЗ рд╕рд╛рде
| (x, y) => y
рдЕрдВрддред
рдкреНрд░рдореЗрдп рдкрд░реАрдХреНрд╖рдг: forall (ab: nat),
(рдП, рдмреА) = (рдПрдлрдПрд╕рдЯреА (рдП, рдмреА), рдПрд╕рдПрдирдбреА (рдП, рдмреА))ред
рд╕рдмреВрддред рд░рд┐рдлреНрд▓реЗрдХреНрд╕рд┐рд╡рд┐рдЯреАред QEDред
рдПрдХ рдЬреЛрдбрд╝реА рдХреА рдкрд░рд┐рднрд╛рд╖рд╛ рдХреЛ рд╕рдВрдХреНрд╖реЗрдк рдореЗрдВ, рд╣рдо рд╕рдВрдЦреНрдпрд╛рдУрдВ рдХреА рд╕реВрдЪреА рдХрд╛ рднреА рд╡рд░реНрдгрди рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:
рдЖрдЧрдордирд╛рддреНрдордХ natlist: рдкреНрд░рдХрд╛рд░: =
| nil: рдиреЗрдЯрд▓рд┐рд╕реНрдЯ
| cons: nat -> рдиреЗрдЯрд▓рд┐рд╕реНрдЯ -> рдиреЗрдЯрд▓рд┐рд╕реНрдЯред
рд╕рдВрдХреЗрддрди "h :: t": = (cons ht) (рд╕реНрддрд░ 60 рдкрд░, рд╕рдорд░реВрдкрддрд╛)ред
рд╕рдВрдХреЗрддрди "[]": = рдиреАрд▓ред
рд╕рдВрдХреЗрддрди "[h, .., t]": = (cons h .. (cons t nil) ..)ред
рдкреНрд░рд╕реНрддреБрдд рдХрд┐рдП рдЧрдП рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕ рдирд┐рдпрдореЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ, рд╣рдо рд╕реВрдЪрд┐рдпреЛрдВ рдХреЛ рдХрдИ рддрд░реАрдХреЛрдВ рд╕реЗ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:
рдкрд░рд┐рднрд╛рд╖рд╛ рд╕реВрдЪреА 1: = 1 :: (2 :: (3 :: рдиреАрд▓))ред
рдкрд░рд┐рднрд╛рд╖рд╛ рд╕реВрдЪреА 2: = [1,2,3]ред
рд╕реВрдЪрд┐рдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рд╕рд╛рд░реНрд╡рднреМрдорд┐рдХ рд░реВрдк рд╕реЗ рдХрд╛рд░реНрдпрд╛рддреНрдордХ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рднрд╛рд╖рд╛рдУрдВ рдореЗрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рд▓реЗрдХрд┐рди рдХреНрдпрд╛ рд╣реЛрдЧрд╛ рдпрджрд┐ рд╣рдо рдкреВрд░реНрдгрд╛рдВрдХ рдХреА рд╕реВрдЪреА, рддрд╛рд░реНрдХрд┐рдХ рдореВрд▓реНрдпреЛрдВ рдХреА рд╕реВрдЪреА рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рд╛рдорд╛рдиреНрдпреАрдХреГрдд рдкрд░рд┐рднрд╛рд╖рд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ? Coq рдореЗрдВ рдмрд╣реБрд░реВрдкреА рдЖрдЧрдордирд╛рддреНрдордХ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рддрдВрддреНрд░ рд╣реИ:
рдЖрдЧрдордирд╛рддреНрдордХ рд╕реВрдЪреА (X: рдкреНрд░рдХрд╛рд░): рдкреНрд░рдХрд╛рд░: =
| nil: рд╕реВрдЪреА X
| рд╡рд┐рдкрдХреНрд╖: рдПрдХреНрд╕ -> рд╕реВрдЪреА рдПрдХреНрд╕ -> рд╕реВрдЪреА рдПрдХреНрд╕ред
рдпрд╣рд╛рдБ
nil
рдФрд░
cons
рдкреЙрд▓реАрдореЙрд░реНрдлрд┐рдХ рдирд┐рд░реНрдорд╛рдгрдХрд░реНрддрд╛рдУрдВ рдХреА рднреВрдорд┐рдХрд╛ рдирд┐рднрд╛рддреЗ рд╣реИрдВред рдЗрд╕реА рддрд░рд╣, рд╣рдо рдмрд╣реБрд░реВрдкреА рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
FVP
рдлрд╝рд┐рд▓реНрдЯрд░
рдХрдИ рдЖрдзреБрдирд┐рдХ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рднрд╛рд╖рд╛рдУрдВ рдореЗрдВ, рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдпрд╛ рддреЛ рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд░реВрдк рдореЗрдВ рдХрд┐рд╕реА рдЕрдиреНрдп рдлрд╝рдВрдХреНрд╢рди рдХреЛ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░ рд╕рдХрддрд╛ рд╣реИ рдпрд╛ рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк рдЗрд╕реЗ рд╡рд╛рдкрд╕ рдХрд░ рд╕рдХрддрд╛ рд╣реИред рдЗрд╕ рддрд░рд╣ рдХреЗ рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рдЙрдЪреНрдЪ-рдХреНрд░рдо рдлрд╝рдВрдХреНрд╢рди рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рд╡реНрдпрд╛рдкрдХ рд░реВрдк рд╕реЗ рдЧрдгрд┐рдд рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд╡реНрдпреБрддреНрдкрдиреНрди рдЧрдгрдирд╛ рдСрдкрд░реЗрдЯрд░) рдФрд░ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП,
filter
рдлрд╝рдВрдХреНрд╢рди рдПрдХ рд╡рд┐рдзреЗрдп рджреНрд╡рд╛рд░рд╛ рд╕реЗрдЯ рдХреЗ рддрддреНрд╡реЛрдВ рдХреЛ
filter
рдХрд░рддрд╛ рд╣реИ):
рдлрд┐рдХреНрд╕реЗрдкрд┐рди рдЗрд╡рди (n: nat): рдмреВрд▓: =
n рдХреЗ рд╕рд╛рде рдореИрдЪ
| рдУ => рд╕рддреНрдп
| SO => рдЕрд╕рддреНрдп
| рдПрд╕ (рдПрд╕ рдПрди ') => рдПрдирдмреАрдмреА рдПрди'
рдЕрдВрддред
Fixpoint рдлрд╝рд┐рд▓реНрдЯрд░ {X: рдкреНрд░рдХрд╛рд░} (рдкрд░реАрдХреНрд╖рдг: X тЖТ рдмреВрд▓) (l: рд╕реВрдЪреА X)
: (рд╕реВрдЪреА X): =
рдХреЗ рд╕рд╛рде рдореИрдЪ рдПрд▓
| [] => []
| h :: t => рдпрджрд┐ рдкрд░реАрдХреНрд╖рдг h рддреЛ h :: (рдлрд╝рд┐рд▓реНрдЯрд░ рдкрд░реАрдХреНрд╖рдг t)
рдФрд░ рдлрд┐рд▓реНрдЯрд░ рдкрд░реАрдХреНрд╖рдг рдЯреА
рдЕрдВрддред
рдЙрджрд╛рд╣рд░рдг рдкрд░реАрдХреНрд╖рдг: рдлрд╝рд┐рд▓реНрдЯрд░ рдЗрдм [1,2,3,4,5] = [2,4]ред
рд╕рдмреВрддред рд░рд┐рдлреНрд▓реЗрдХреНрд╕рд┐рд╡рд┐рдЯреАред QEDред
рдирдХреНрд╢рд╛
FVP
map
рдЗрд╕ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рд╕реВрдЪреА рдХреЗ рдкреНрд░рддреНрдпреЗрдХ рддрддреНрд╡ рдкрд░ рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИ, рдкрд░рд┐рдгрд╛рдореЛрдВ рдХреА рд╕реВрдЪреА рд▓реМрдЯрд╛рддрд╛ рд╣реИ:
рдлрд┐рдХреНрд╕рдкреЙрдЗрдВрдЯ рдореИрдк {XY: рдЯрд╛рдЗрдк} (f: X тЖТ Y) (l: рд▓рд┐рд╕реНрдЯ X)
: (рд╕реВрдЪреА рд╡рд╛рдИ): =
рдХреЗ рд╕рд╛рде рдореИрдЪ рдПрд▓
| [] => []
| h :: t => (fh) :: (рдирдХреНрд╢рд╛ рдлреБрдЯ)
рдЕрдВрддред
рдЧреАрддрд╛рддреНрдордХ рд╡рд┐рд╖рдпрд╛рдВрддрд░
рдкрд┐рдЫрд▓реЗ рд▓реЗрдЦреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдХреЗ рд▓рд┐рдП рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдореЗрдВ, рдпрд╣ рд╕рд╡рд╛рд▓ рдкреВрдЫрд╛ рдЧрдпрд╛ рдерд╛ рдХрд┐ рдорд╢реАрди рджреНрд╡рд╛рд░рд╛ рд╕рд╛рдХреНрд╖реНрдп рдХреА рд╡реНрдпрд╛рдЦреНрдпрд╛ рдХреИрд╕реЗ рд╣реЛрддреА рд╣реИред
рдЬреИрд╕рд╛ рдХрд┐ рдЬреНрдЮрд╛рдд рд╣реИ, рдХрд░реА-рд╣рд╛рд╡рд░реНрдб рдЖрдЗрд╕реЛрдореЛрд░реНрдлрд┐рдЬреНрдо рд╕рд╛рдХреНрд╖реНрдпреЛрдВ рдФрд░ рдХрд╛рд░реНрдпрдХреНрд░рдореЛрдВ рдХреЗ рдмреАрдЪ рдкрддреНрд░рд╛рдЪрд╛рд░ рдХреЛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рддрд╛ рд╣реИред рд╣рдо рдХреБрдЫ рдЙрдкрдорд╛рдПрдБ рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВ:
- рдкреНрд░рдореЗрдп - рдкреНрд░рдХрд╛рд░
- рд╕рд╛рдХреНрд╖реНрдп - рд╢рд░реНрддреЗрдВ
- рдкреНрд░рдорд╛рдг рд╕рддреНрдпрд╛рдкрди - рд╢рдмреНрдж рдкреНрд░рдХрд╛рд░ рд╕рддреНрдпрд╛рдкрди
рдЗрд╕ рдкреНрд░рдХрд╛рд░, рдХреЙрдХ рд╕рд┐рд░реНрдл рдПрдХ рд╢рдмреНрдж рд╣реИ рдЬреЛ рд╢рдмреНрджреЛрдВ рдХреЗ рдкреНрд░рдХрд╛рд░ рдХреЛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рддрд╛ рд╣реИред рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рд░рдгрдиреАрддрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЖрдЙрдЯрдкреБрдЯ рдПрд▓реНрдЧреЛрд░рд┐рджрдо рдХреЛ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░ рд╕рдХрддрд╛ рд╣реИред