рдПрдХ рдЧрд╛рдпрди рд╕реЗ рдЬреБрдбрд╝реЗ рд╕рд╛рдХреНрд╖рд╛рддреНрдХрд╛рд░ рд╕реВрдЪреА рдХреЛ рдХреИрд╕реЗ рддреИрдирд╛рдд рдХрд┐рдпрд╛ рдЬрд╛рдП

рд╣рд╛рдп, рд╣реИрдмреНрд░ред


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


рдЫрд╡рд┐


рд╣рдо рд╕рдорд╕реНрдпрд╛ рдХрд╛ рд╕рдорд╛рдзрд╛рди рдХрд░рддреЗ рд╣реИрдВ


рд╕рд╛рдХреНрд╖рд╛рддреНрдХрд╛рд░рдХрд░реНрддрд╛ рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рдФрд░ рджреЛрд╕реНрддрд╛рдирд╛ рдерд╛:


- рдареАрдХ рд╣реИ, рдЪрд▓реЛ рдкрд╣рд▓реЗ рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдХрд░реЗрдВ: рдПрдХ рдмрд╕ рдХрдиреЗрдХреНрдЯреЗрдб рд╕реВрдЪреА рджреА рдЧрдИ рд╣реИ, рдЖрдкрдХреЛ рдЗрд╕реЗ рдЪрд╛рд░реЛрдВ рдУрд░ рдореЛрдбрд╝рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред


- рдореИрдВ рдЕрднреА рдХрд░реВрдБрдЧрд╛! рдФрд░ рдРрд╕рд╛ рдХрд░рдирд╛ рдХрд┐рд╕ рднрд╛рд╖рд╛ рдореЗрдВ рдмреЗрд╣рддрд░ рд╣реИ?


- рдХреМрди рд╕рд╛ рдЖрдкрдХреЗ рд▓рд┐рдП рдЕрдзрд┐рдХ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╣реИ?


рдореИрдВрдиреЗ C ++ рдбреЗрд╡рд▓рдкрд░ рдХрд╛ рд╕рд╛рдХреНрд╖рд╛рддреНрдХрд╛рд░ рд▓рд┐рдпрд╛, рд▓реЗрдХрд┐рди рд╕реВрдЪрд┐рдпреЛрдВ рдкрд░ рдПрд▓реНрдЧреЛрд░рд┐рджрдо рдХрд╛ рд╡рд░реНрдгрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдпрд╣ рд╕рдмрд╕реЗ рдЕрдЪреНрдЫреА рднрд╛рд╖рд╛ рдирд╣реАрдВ рд╣реИред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдореИрдВрдиреЗ рдХрд╣реАрдВ рдкрдврд╝рд╛ рд╣реИ рдХрд┐ рд╕рд╛рдХреНрд╖рд╛рддреНрдХрд╛рд░реЛрдВ рдореЗрдВ рдЖрдкрдХреЛ рдкрд╣рд▓реЗ рдПрдХ рдЕрдкреНрд░рднрд╛рд╡реА рд╕рдорд╛рдзрд╛рди рдХреА рдкреЗрд╢рдХрд╢ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рдФрд░ рдлрд┐рд░ рдЗрд╕реЗ рдХреНрд░рдорд┐рдХ рд░реВрдк рд╕реЗ рд╕реБрдзрд╛рд░рддреЗ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рдореИрдВрдиреЗ рд▓реИрдкрдЯреЙрдк рдЦреЛрд▓рд╛, рд╡рд┐рдо рд▓реЙрдиреНрдЪ рдХрд┐рдпрд╛ рдФрд░ рджреБрднрд╛рд╖рд┐рдпрд╛ рдФрд░ рдЗрд╕ рдХреЛрдб рдХреЛ рд╕реНрдХреЗрдЪ рдХрд┐рдпрд╛:


revDumb : List a -> List a
revDumb [] = []
revDumb (x :: xs) = revDumb xs ++ [x]

, , , - , , :


revOnto : List a -> List a -> List a
revOnto acc [] = acc
revOnto acc (x :: xs) = revOnto (x :: acc) xs

revAcc : List a -> List a
revAcc = revOnto []

тАФ , , , .



- , . , ( ?) - , :


тАФ , , , , , , , .



revsEq : (xs : List a) -> revAcc xs = revDumb xs

, :


тАФ , case split .


тАФ generate definition, case split, obvious proof search тАФ


revsEq : (xs : List a) -> revAcc xs = revDumb xs
revsEq [] = Refl
revsEq (x :: xs) = ?revsEq_rhs_1

, , , :


тАФ , , , . , , , :


revsEq : (xs : List a) -> revAcc xs = revDumb xs
revsEq [] = Refl
revsEq (x :: xs) = let rec = revsEq xs in ?wut

тАФ ?wut,


  rec : revOnto [] xs = revDumb xs
--------------------------------------
wut : revOnto [x] xs = revDumb xs ++ [x]

тАФ revDumb xs , rec. :


revsEq (x :: xs) = let rec = revsEq xs in
                   rewrite sym rec in ?wut


--------------------------------------
wut : revOnto [x] xs = revOnto [] xs ++ [x]

тАФ c :


lemma1 : (x0 : a) -> (xs : List a) -> revOnto [x0] xs = revOnto [] xs ++ [x0]

generate definition, case split xs, obvious proof search


lemma1 : (x0 : a) -> (xs : List a) -> revOnto [x0] xs = revOnto [] xs ++ [x0]
lemma1 x0 [] = Refl
lemma1 x0 (x :: xs) = ?lemma1_rhs_2

тАФ , . lemma1 x xs, lemma1 x0 xs. , , ,


lemma1 x0 (x :: xs) = let rec = lemma1 x xs in ?wut

?wut:


  rec : revOnto [x] xs = revOnto [] xs ++ [x]
--------------------------------------
wut : revOnto [x, x0] xs = revOnto [x] xs ++ [x0]

тАФ revOnto [x] xs rec. :


lemma1 x0 (x :: xs) = let rec = lemma1 x xs in
                      rewrite rec in ?wut

тАФ , :


--------------------------------------
wut : revOnto [x, x0] xs = (revOnto [] xs ++ [x]) ++ [x0]

тАФ , . :


lemma1 x0 (x :: xs) = let rec = lemma1 x xs in
                      rewrite rec in
                      rewrite sym $ appendAssociative (revOnto [] xs) [x] [x0] in ?wut

тАФ -:


--------------------------------------
wut : revOnto [x, x0] xs = revOnto [] xs ++ [x, x0]

тАФ ! , , , . , , :


lemma2 : (acc, lst : List a) -> revOnto acc lst = revOnto [] lst ++ acc

IDE . case split lst, acc, revOnto lst:


lemma2 : (acc, lst : List a) -> revOnto acc lst = revOnto [] lst ++ acc
lemma2 acc [] = Refl
lemma2 acc (x :: xs) = ?wut1

wut1


--------------------------------------
wut1 : revOnto (x :: acc) xs = revOnto [x] xs ++ acc

:


lemma2 acc (x :: xs) = let rec = lemma2 (x :: acc) xs in ?wut1


  rec : revOnto (x :: acc) xs = revOnto [] xs ++ x :: acc
--------------------------------------
wut1 : revOnto (x :: acc) xs = revOnto [x] xs ++ acc

rec:


lemma2 acc (x :: xs) = let rec = lemma2 (x :: acc) xs in
                       rewrite rec in ?wut1


--------------------------------------
wut1 : revOnto [] xs ++ x :: acc = revOnto [x] xs ++ acc

тАФ - . , lemma1 , , lemma2 , lemma1 x xs , lemma2 [x] xs:


lemma2 acc (x :: xs) = let rec1 = lemma2 (x :: acc) xs in
                       let rec2 = lemma2 [x] xs in
                       rewrite rec1 in
                       rewrite rec2 in ?wut1

:


--------------------------------------
wut1 : revOnto [] xs ++ x :: acc = (revOnto [] xs ++ [x]) ++ acc

, :


lemma2 : (acc, lst : List a) -> revOnto acc lst = revOnto [] lst ++ acc
lemma2 acc [] = Refl
lemma2 acc (x :: xs) = let rec1 = lemma2 (x :: acc) xs in
                       let rec2 = lemma2 [x] xs in
                       rewrite rec1 in
                       rewrite rec2 in 
                       rewrite sym $ appendAssociative (revOnto [] xs) [x] acc in Refl

тАФ , lemma1 , , lemma2 lemma. , , , :


lemma : (acc, lst : List a) -> revOnto acc lst = revOnto [] lst ++ acc
lemma acc [] = Refl
lemma acc (x :: xs) = let rec1 = lemma (x :: acc) xs in
                      let rec2 = lemma [x] xs in
                      rewrite rec1 in
                      rewrite rec2 in 
                      rewrite sym $ appendAssociative (revOnto [] xs) [x] acc in Refl

revsEq : (xs : List a) -> revAcc xs = revDumb xs
revsEq [] = Refl
revsEq (x :: xs) = let rec = revsEq xs in
                   rewrite sym rec in lemma [x] xs

15, - , .


тАФ , , - .


тАФ , , . ! , ? ?!



тАФ ! , ! , , ? ┬л ┬╗? : xs тАФ , xs' ┬л┬╗ , , . !


revCorrect : (xs : List a) ->
             (f : b -> a -> b) ->
             (init : b) ->
             foldl f init (revDumb xs) = foldr (flip f) init xs

тАФ , revDumb revAcc ( forall xs. revDumb xs = revAcc xs, , , , ), , , revDumb.


,


revCorrect : (xs : List a) ->
             (f : b -> a -> b) ->
             (init : b) ->
             foldl f init (revDumb xs) = foldr (flip f) init xs
revCorrect [] f init = Refl
revCorrect (x :: xs) f init = let rec = revCorrect xs f init in ?wut

:


  rec : foldl f init (revDumb xs) = foldr (flip f) init xs
--------------------------------------
wut : foldl f init (revDumb xs ++ [x]) = f (foldr (flip f) init xs) x

тАФ :


revCorrect (x :: xs) f init = let rec = revCorrect xs f init in
                              rewrite sym rec in ?wut


--------------------------------------
wut : foldl f init (revDumb xs ++ [x]) = f (foldl f init (revDumb xs)) x

тАФ revDumb xs . : f f, . :


foldlRhs : (f : b -> a -> b) ->
           (init : b) ->
           (x : a) ->
           (xs : List a) ->
           foldl f init (xs ++ [x]) = f (foldl f init xs) x

тАФ , . :


foldlRhs : (f : b -> a -> b) ->
           (init : b) ->
           (x : a) ->
           (xs : List a) ->
           foldl f init (xs ++ [x]) = f (foldl f init xs) x
foldlRhs f init x [] = Refl
foldlRhs f init x (y :: xs) = foldlRhs f (f init y) x xs

revCorrect : (xs : List a) ->
             (f : b -> a -> b) ->
             (init : b) ->
             foldl f init (revDumb xs) = foldr (flip f) init xs
revCorrect [] f init = Refl
revCorrect (x :: xs) f init = let rec = revCorrect xs f init in
                              rewrite sym rec in foldlRhs f init x (revDumb xs)

тАФ - ?
тАФ . , .
тАФ тАж , , . , , , , .


, - .

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


All Articles