SlideShare a Scribd company logo
Constructing List Homomorphisms from Proofs

            Yun-Yan Chi             Shin-Cheng Mu

                  IIS, Academia Sinica, Taiwan


                    September 17, 2012




       Yun-Yan Chi, Shin-Cheng Mu    APLAS 2011 1/ 25
Prelude
                                Preliminaries
                             The Way To Go



List Homomorphism


    ▸   A function h on lists is called a list homomorphism if it
        satisfies
                           h (xs + ys) = h xs h ys,
                                  +
        for some associative operator ( )
    ▸   E.g. sum (xs + ys) = sum xs + sum ys
                     +




                  Yun-Yan Chi, Shin-Cheng Mu    APLAS 2011 2/ 25
Prelude
                                 Preliminaries
                              The Way To Go



List Homomorphism


    ▸   A function h on lists is called a list homomorphism if it
        satisfies
                           h (xs + ys) = h xs h ys,
                                  +
        for some associative operator ( )
    ▸   E.g. sum (xs + ys) = sum xs + sum ys
                     +
    ▸   Potential chances of parallelisation
          ▸   compute h xs and h ys in parallel
          ▸   combine the results using ( )
    ▸   Can a list homomorphism be mechanically constructed?




                   Yun-Yan Chi, Shin-Cheng Mu    APLAS 2011 2/ 25
Prelude
                                   Preliminaries
                                The Way To Go



A clue


     ▸   The well-known third list-homomorphism theorem:
           ▸    h is a list homomorphism
           ▸    if h can be foldr (⊲) e and foldl(⊳) e
                for some (⊲), (⊳) and e
     ▸   E.g.

                       sum ([3, 5, 7, 9]) = 3 + sum [5, 7, 9]
                                                   = sum [3, 5, 7] + 9
                                                   = sum [3, 5] + sum [7, 9]




                     Yun-Yan Chi, Shin-Cheng Mu        APLAS 2011 3/ 25
Prelude
                               Preliminaries
                            The Way To Go



But, how?



    ▸   Plenty of previous work was devoted to the construction of
        ( ) from the definitions of (⊲) and (⊳)
    ▸   Practically, efforts are needed to prove
        h = foldr (⊲) e = foldl (⊳) e
    ▸   This occurs often that one of (⊲) or (⊳) is picked as definition
        of h, while the other is much harder to find




                 Yun-Yan Chi, Shin-Cheng Mu    APLAS 2011 4/ 25
Prelude
                               Preliminaries
                            The Way To Go



But, how?



    ▸   We may have a good guess of ( ) by mixing (⊲) and (⊳)
    ▸   The proof of the correctness of ( ) is very similar to the proof
        of h = foldr (⊲) e = foldl (⊳) e, which we have to provide
        anyway
    ▸   Our idea: transform the proof of the correctness of ( ) from
        the proof of foldr = foldl, after assembling a possible ( )




                 Yun-Yan Chi, Shin-Cheng Mu    APLAS 2011 4/ 25
Prelude    Fold
                           Preliminaries   Tupling
                        The Way To Go      Foldr-Fusion Law




Prelude


Preliminaries
   Fold
   Tupling
   Foldr-Fusion Law


The Way To Go
   Proof by Fusion
   Proof Generalisation




             Yun-Yan Chi, Shin-Cheng Mu    APLAS 2011 5/ 25
Prelude    Fold
                                      Preliminaries   Tupling
                                   The Way To Go      Foldr-Fusion Law



Foldr
        ▸   A function h is a instance of foldr (⊲) e if h can be defined as
              ▸    h [] = e
              ▸    h (x xs) = x ⊲ h xs
            for some e and (⊲)
        ▸   E.g.

                                 foldr (⊲) e xs
                             = foldr (⊲) e (x1          (x2      (x3     [ ])))
                             = x1 ⊲ foldr (⊲) e (x2               (x3    [ ]))
                             = ...
                             = x1 ⊲ (x2 ⊲ (x3 ⊲ e))



                        Yun-Yan Chi, Shin-Cheng Mu    APLAS 2011 6/ 25
Prelude    Fold
                                      Preliminaries   Tupling
                                   The Way To Go      Foldr-Fusion Law



Foldl
        ▸   Symmetrically, h is a foldl(⊳) e if it can be defined as
              ▸    h [] = e
              ▸    h (xs + [x]) = h xs ⊳ x,
                         +
            for some (⊳) and e
        ▸   E.g.

                            foldl (⊳) e xs
                        = foldl (⊳) e ((([ ] + [x1 ]) + [x2 ]) + [x3 ])
                                             +        +        +
                        = foldl (⊳) e (([ ] + [x1 ]) + [x2 ]) ⊳ x3
                                            +        +
                        = ...
                        = ((e ⊳ x1 ) ⊳ x2 ) ⊳ x3



                        Yun-Yan Chi, Shin-Cheng Mu    APLAS 2011 7/ 25
Prelude    Fold
                                 Preliminaries   Tupling
                              The Way To Go      Foldr-Fusion Law



Tupling




     ▸   Not all functions can be a fold
     ▸   Tupling:
         for h, find a k such that ⟨h, k⟩ is a fold
     ▸   ⟨h, k⟩ x = (h x, k x)




                   Yun-Yan Chi, Shin-Cheng Mu    APLAS 2011 8/ 25
Prelude    Fold
                                Preliminaries   Tupling
                             The Way To Go      Foldr-Fusion Law



Foldr-Fusion Law

     ▸   One can fuse f and foldr into another foldr




                  Yun-Yan Chi, Shin-Cheng Mu    APLAS 2011 9/ 25
Prelude    Fold
                                Preliminaries   Tupling
                             The Way To Go      Foldr-Fusion Law



Foldr-Fusion Law

     ▸   One can fuse f and foldr into another foldr

                      (f ○ foldr (⊲) e) xs
                  = (f ○ foldr (⊲) e) (x1 (x2 (x3 ... [])))
                  = f (x1 ⊲ (x2 ⊲ (x3 ⊲ ... ⊲ e)))
                  =       { f (x ⊲ z) = x ⊕ f z }
                      x1 ⊕ (f (x2 ⊲ (x3 ⊲ ... ⊲ e)))
                  = ...
                  = x1 ⊕ (x2 ⊕ (x3 ⊕ ... ⊕ (f e)))
                  = foldr (⊕) (f e) xs




                  Yun-Yan Chi, Shin-Cheng Mu    APLAS 2011 9/ 25
Prelude
                                                  Proof by Fusion
                                  Preliminaries
                                                  Proof Generalisation
                               The Way To Go



Return to our approach


     ▸   Since we try to transform the proof of
           ▸   h = foldr (⊲) e = foldl (⊳) e
         to the proof of
           ▸   the correctness of ( ),
     ▸   we want to know how to
          1. prove that h = foldr (⊲) e = foldl (⊳) e
          2. prove that ( ) do define a list homomorphism
          3. transform the former to the latter




                    Yun-Yan Chi, Shin-Cheng Mu    APLAS 2011 10/ 25
Prelude
                                                     Proof by Fusion
                                     Preliminaries
                                                     Proof Generalisation
                                  The Way To Go



h = foldr (⊲) e = foldl (⊳) e

     ▸   Let h = foldr (⊲) e
     ▸   To prove that h = foldl (⊳) e, we have to show
           ▸   h[] = e
           ▸   h (xs + [z]) = h xs ⊳ z
                     +
     ▸   In point-free style: h ○ (+
                                   +[z]) = (⊳ z) ○ h

                        h ○ (+
                             +[z])
                   =       { foldr -fusion, since (+
                                                   +[z]) = foldr ( ) [z] }
                        foldr (⊲) (h [z])
                   =       { foldr -fusion (backwards) }
                        (⊳ z) ○ foldr (⊲) e
                   = (⊳ z) ○ h



                       Yun-Yan Chi, Shin-Cheng Mu    APLAS 2011 11/ 25
Prelude
                                                  Proof by Fusion
                                  Preliminaries
                                                  Proof Generalisation
                               The Way To Go



h = foldr (⊲) e = foldl (⊳) e



     ▸   For the second foldr -fusion
           ▸   z ⊲e=e⊳z
           ▸   (x ⊲ y ) ⊳ z = x ⊲ (y ⊳ z) - the associativity of (⊲) and (⊳)

     ▸   We will have the proof of h = foldr (⊲) e = foldl (⊳) e
         if we have the proof of above fusion conditions




                    Yun-Yan Chi, Shin-Cheng Mu    APLAS 2011 11/ 25
Prelude
                                                    Proof by Fusion
                                    Preliminaries
                                                    Proof Generalisation
                                 The Way To Go



h is list homomorphism

     ▸   To prove that h is a list homomorphism, we have to show
           ▸   h (xs + ys) = h xs
                     +                    h ys
     ▸   In point-free style: h ○ (+
                                   +ys) = ( h ys) ○ h

                     h ○ (+
                          +ys)
                 =     { foldr -fusion, since (+
                                               +ys) = foldr ( ) ys }
                     foldr (⊲) (h ys)
                 =     { foldr -fusion (backwards) }
                     ( h ys) ○ foldr (⊲) e
                 = ( h ys) ○ h




                     Yun-Yan Chi, Shin-Cheng Mu     APLAS 2011 12/ 25
Prelude
                                                     Proof by Fusion
                                  Preliminaries
                                                     Proof Generalisation
                               The Way To Go



h is list homomorphism



     ▸   For the second foldr -fusion
           ▸   h ys = e   h ys
           ▸   (x ⊲ y )   h ys = x ⊲ (y           h ys)

     ▸   If we have the proof of those fusion conditions, we will have
         the proof of ( ) do define a list homomorphism




                    Yun-Yan Chi, Shin-Cheng Mu       APLAS 2011 12/ 25
Prelude
                                                  Proof by Fusion
                                  Preliminaries
                                                  Proof Generalisation
                               The Way To Go



Generalisation

     ▸   To transform the proof of
           ▸   h = foldr (⊲) e = foldl (⊳) e

         to the proof of
           ▸   h (xs + ys) = h xs
                     +                  h ys




                    Yun-Yan Chi, Shin-Cheng Mu    APLAS 2011 13/ 25
Prelude
                                                     Proof by Fusion
                                  Preliminaries
                                                     Proof Generalisation
                               The Way To Go



Generalisation

     ▸   To transform the proof of
           ▸   z ⊲e=e⊳z
           ▸   (x ⊲ y ) ⊳ z = x ⊲ (y ⊳ z)
         to the proof of
           ▸   h ys = e   h ys
           ▸   (x ⊲ y )   h ys = x ⊲ (y           h ys)




                    Yun-Yan Chi, Shin-Cheng Mu       APLAS 2011 13/ 25
Prelude
                                                     Proof by Fusion
                                  Preliminaries
                                                     Proof Generalisation
                               The Way To Go



Generalisation

     ▸   To transform the proof of
           ▸   z ⊲e=e⊳z
           ▸   (x ⊲ y ) ⊳ z = x ⊲ (y ⊳ z)
         to the proof of
           ▸   h ys = e   h ys
           ▸   (x ⊲ y )   h ys = x ⊲ (y           h ys)

     ▸   To come up with ( ) and its correctness proof
     ▸   Generalise the former proof to the latter by replacing the
         occurrences of z in (⊳) by metavariables




                    Yun-Yan Chi, Shin-Cheng Mu       APLAS 2011 13/ 25
Setup
                          Example: Steep
                                           Proving foldr (⊲) e = foldl (⊳) e
                             Conclusions
                                           Constructing ( )




Example: Steep
   Setup
   Proving foldr (⊲) e = foldl (⊳) e
   Constructing ( )



Conclusions




              Yun-Yan Chi, Shin-Cheng Mu   APLAS 2011 14/ 25
Setup
                             Example: Steep
                                              Proving foldr (⊲) e = foldl (⊳) e
                                Conclusions
                                              Constructing ( )



Steep
    ▸   A list of numbers is said to be steep if each number is larger
        than the sum of the numbers to its right.
    ▸   E.g. steep [20, 10, 5, 2]




                 Yun-Yan Chi, Shin-Cheng Mu   APLAS 2011 15/ 25
Setup
                             Example: Steep
                                              Proving foldr (⊲) e = foldl (⊳) e
                                Conclusions
                                              Constructing ( )



Steep
    ▸   A list of numbers is said to be steep if each number is larger
        than the sum of the numbers to its right.
    ▸   E.g. steep [20, 10, 5, 2]




                 Yun-Yan Chi, Shin-Cheng Mu   APLAS 2011 15/ 25
Setup
                             Example: Steep
                                              Proving foldr (⊲) e = foldl (⊳) e
                                Conclusions
                                              Constructing ( )



Steep
    ▸   A list of numbers is said to be steep if each number is larger
        than the sum of the numbers to its right.
    ▸   E.g. steep [20, 10, 5, 2]




                 Yun-Yan Chi, Shin-Cheng Mu   APLAS 2011 15/ 25
Setup
                             Example: Steep
                                              Proving foldr (⊲) e = foldl (⊳) e
                                Conclusions
                                              Constructing ( )



Steep
    ▸   A list of numbers is said to be steep if each number is larger
        than the sum of the numbers to its right.
    ▸   E.g. steep [20, 10, 5, 2]




                 Yun-Yan Chi, Shin-Cheng Mu   APLAS 2011 15/ 25
Setup
                             Example: Steep
                                              Proving foldr (⊲) e = foldl (⊳) e
                                Conclusions
                                              Constructing ( )



Steep
    ▸   A list of numbers is said to be steep if each number is larger
        than the sum of the numbers to its right.
    ▸   Can steep be a foldr ?




                 Yun-Yan Chi, Shin-Cheng Mu   APLAS 2011 15/ 25
Setup
                             Example: Steep
                                              Proving foldr (⊲) e = foldl (⊳) e
                                Conclusions
                                              Constructing ( )



Steep
    ▸   A list of numbers is said to be steep if each number is larger
        than the sum of the numbers to its right.
    ▸   Can steep be a foldr ?




                 Yun-Yan Chi, Shin-Cheng Mu   APLAS 2011 15/ 25
Setup
                             Example: Steep
                                              Proving foldr (⊲) e = foldl (⊳) e
                                Conclusions
                                              Constructing ( )



Steep
    ▸   A list of numbers is said to be steep if each number is larger
        than the sum of the numbers to its right.
    ▸   Can steep be a foldl ?




                 Yun-Yan Chi, Shin-Cheng Mu   APLAS 2011 15/ 25
Setup
                             Example: Steep
                                              Proving foldr (⊲) e = foldl (⊳) e
                                Conclusions
                                              Constructing ( )



Steep
    ▸   A list of numbers is said to be steep if each number is larger
        than the sum of the numbers to its right.
    ▸   Can steep be a foldl ?




                 Yun-Yan Chi, Shin-Cheng Mu   APLAS 2011 15/ 25
Setup
                             Example: Steep
                                              Proving foldr (⊲) e = foldl (⊳) e
                                Conclusions
                                              Constructing ( )



Steep
    ▸   A list of numbers is said to be steep if each number is larger
        than the sum of the numbers to its right.
    ▸   Can steep be a foldl ?




                 Yun-Yan Chi, Shin-Cheng Mu   APLAS 2011 15/ 25
Setup
                             Example: Steep
                                              Proving foldr (⊲) e = foldl (⊳) e
                                Conclusions
                                              Constructing ( )



Steep
    ▸   A list of numbers is said to be steep if each number is larger
        than the sum of the numbers to its right.
    ▸   Can steep be a foldl ?




                 Yun-Yan Chi, Shin-Cheng Mu   APLAS 2011 15/ 25
Setup
                               Example: Steep
                                                Proving foldr (⊲) e = foldl (⊳) e
                                  Conclusions
                                                Constructing ( )



Cap
      ▸   cap xs, upper-bound of value we can attach to the right of xs
      ▸   cap can be a foldr together with sum




                   Yun-Yan Chi, Shin-Cheng Mu   APLAS 2011 16/ 25
Setup
                               Example: Steep
                                                Proving foldr (⊲) e = foldl (⊳) e
                                  Conclusions
                                                Constructing ( )



Cap
      ▸   cap xs, upper-bound of value we can attach to the right of xs
      ▸   cap can be a foldl




                   Yun-Yan Chi, Shin-Cheng Mu   APLAS 2011 16/ 25
Setup
                                 Example: Steep
                                                  Proving foldr (⊲) e = foldl (⊳) e
                                    Conclusions
                                                  Constructing ( )



Steep as Fold



     ▸   We can compute steep if we can compute cap
     ▸   ⟨cap, sum⟩ can be foldr (⊲) (∞, 0) and foldl (⊳) (∞, 0),
         where
           ▸   x ⊲ (c2 , s2 ) = ((x − s2 ) ↓ c2 , x + s2 )
           ▸   (c1 , s1 ) ⊳ z = ((c1 − z) ↓ z, s1 + z)
     ▸   It is not so obvious that foldr = foldl




                     Yun-Yan Chi, Shin-Cheng Mu   APLAS 2011 17/ 25
Setup
                          Example: Steep
                                           Proving foldr (⊲) e = foldl (⊳) e
                             Conclusions
                                           Constructing ( )




Example: Steep
   Setup
   Proving foldr (⊲) e = foldl (⊳) e
   Constructing ( )



Conclusions




              Yun-Yan Chi, Shin-Cheng Mu   APLAS 2011 18/ 25
Setup
                              Example: Steep
                                               Proving foldr (⊲) e = foldl (⊳) e
                                 Conclusions
                                               Constructing ( )



Fusion Conditions

     ▸   z ⊲ (∞, 0) = (∞, 0) ⊳ z
     ▸   (x ⊲ y ) ⊳ z = x ⊲ (y ⊳ z)
     ▸   The former condition trivially holds:

                                   z ⊲ (∞, 0)
                               =      { definition of (⊲) }
                                   ((z − 0) ↓ ∞, z + 0)
                               =      { arithmetics }
                                   ((∞ − z) ↓ z, 0 + z)
                               =      { definition of (⊳) }
                                   (∞, 0) ⊳ z.



                  Yun-Yan Chi, Shin-Cheng Mu   APLAS 2011 19/ 25
Setup
                          Example: Steep
                                           Proving foldr (⊲) e = foldl (⊳) e
                             Conclusions
                                           Constructing ( )



Proof of Associativity

                   (x ⊲ (c, s)) ⊳ z
               =      { definition of (⊲) }
                   ((x − s) ↓ c, x + s) ⊳ z
               =      { definition of (⊳) }
                   ((((x − s) ↓ c) − z) ↓ z, x + s + z)
               =      { (−z) distributes over (↓) }
                   (((x − s − z) ↓ (c − z)) ↓ z, x + s + z)
               =      { arithmetics }
                   (((x − (s + z)) ↓ ((c − z) ↓ z), x + s + z)
               =      { definition of (⊲) }
                   x ⊲ ((c − z) ↓ z, s + z)
               =      { definition of (⊳) }
                   x ⊲ ((c, s) ⊳ z)


              Yun-Yan Chi, Shin-Cheng Mu   APLAS 2011 20/ 25
Setup
                          Example: Steep
                                           Proving foldr (⊲) e = foldl (⊳) e
                             Conclusions
                                           Constructing ( )




Example: Steep
   Setup
   Proving foldr (⊲) e = foldl (⊳) e
   Constructing ( )



Conclusions




              Yun-Yan Chi, Shin-Cheng Mu   APLAS 2011 21/ 25
Setup
                              Example: Steep
                                               Proving foldr (⊲) e = foldl (⊳) e
                                 Conclusions
                                               Constructing ( )



The Aim now is



    1. Generalise the proof of
         ▸   (x ⊲ y ) ⊳ z = x ⊲ (y ⊳ z)
       to a proof of
         ▸   (x ⊲ y )   (c2 , s2 ) = x ⊲ (y    (c2 , s2 )).
    2. Construct a definition of ( )




                  Yun-Yan Chi, Shin-Cheng Mu   APLAS 2011 22/ 25
Setup
                              Example: Steep
                                               Proving foldr (⊲) e = foldl (⊳) e
                                 Conclusions
                                               Constructing ( )



Generalise The Proof
     ▸   Copy the proof of associativity
                        (x ⊲ (c, s)) ⊳ z
                    =     { definition of (⊲) }
                        ((x − s) ↓ c, x + s) ⊳ z
                    =     { definition of (⊳)       }
                        ((((x − s) ↓ c) − z) ↓ z, x + s + z)
                    =     { -z distributes over (↓) }
                        (((x − s − z) ↓ (c − z)) ↓ z, x + s + z)
                    =     { arithmetics }
                        (((x − (s + z)) ↓ ((c − z) ↓ z), x + s + z)
                    =     { definition of (⊲) }
                        x ⊲ ((c − z) ↓ z, s + z)
                    =     { definition of (⊳)       }
                        x ⊲ ((c, s) ⊳ z)

                  Yun-Yan Chi, Shin-Cheng Mu   APLAS 2011 23/ 25
Setup
                              Example: Steep
                                               Proving foldr (⊲) e = foldl (⊳) e
                                 Conclusions
                                               Constructing ( )



Generalise The Proof
     ▸   Generalise ⊳ z to       (c2 , s2 )
                       (x ⊲ (c, s)) ⊳ z
                   =      { definition of (⊲) }
                       ((x − s) ↓ c, x + s) ⊳ z
                   =      { definition of (⊳)       }
                       ((((x − s) ↓ c) − z) ↓ z, x + s + z)
                   =      { -z distributes over (↓) }
                       (((x − s − z) ↓ (c − z)) ↓ z, x + s + z)
                   =      { arithmetics }
                       (((x − (s + z)) ↓ ((c − z) ↓ z), x + s + z)
                   =      { definition of (⊲) }
                       x ⊲ ((c − z) ↓ z, s + z)
                   =      { definition of (⊳)       }
                       x ⊲ ((c, s) ⊳ z)

                  Yun-Yan Chi, Shin-Cheng Mu   APLAS 2011 23/ 25
Setup
                              Example: Steep
                                                  Proving foldr (⊲) e = foldl (⊳) e
                                 Conclusions
                                                  Constructing ( )



Generalise The Proof
     ▸   Generalise ⊳ z to       (c2 , s2 )
                       (x ⊲ (c, s))      (c2 , s2 )
                   =      { definition of (⊲) }
                       ((x − s) ↓ c, x + s)       (c2 , s2 )
                   =      { definition of ( ) }
                       ((((x − s) ↓ c) − z) ↓ z, x + s + z)
                   =      { -z distributes over (↓) }
                       (((x − s − z) ↓ (c − z)) ↓ z, x + s + z)
                   =      { arithmetics }
                       (((x − (s + z)) ↓ ((c − z) ↓ z), x + s + z)
                   =      { definition of (⊲) }
                       x ⊲ ((c − z) ↓ z, s + z)
                   =      { definition of ( ) }
                       x ⊲ ((c, s)     (c2 , s2 ))

                  Yun-Yan Chi, Shin-Cheng Mu      APLAS 2011 23/ 25
Setup
                              Example: Steep
                                                  Proving foldr (⊲) e = foldl (⊳) e
                                 Conclusions
                                                  Constructing ( )



Generalise The Proof
     ▸   Replace z by metavariable Xi
                       (x ⊲ (c, s))      (c2 , s2 )
                   =      { definition of (⊲) }
                       ((x − s) ↓ c, x + s)       (c2 , s2 )
                   =      { definition of ( ) }
                       ((((x − s) ↓ c) − z) ↓ z, x + s + z)
                   =      { -z distributes over (↓) }
                       (((x − s − z) ↓ (c − z)) ↓ z, x + s + z)
                   =      { arithmetics }
                       (((x − (s + z)) ↓ ((c − z) ↓ z), x + s + z)
                   =      { definition of (⊲) }
                       x ⊲ ((c − z) ↓ z, s + z)
                   =      { definition of ( ) }
                       x ⊲ ((c, s)     (c2 , s2 ))

                  Yun-Yan Chi, Shin-Cheng Mu      APLAS 2011 23/ 25
Setup
                              Example: Steep
                                                  Proving foldr (⊲) e = foldl (⊳) e
                                 Conclusions
                                                  Constructing ( )



Generalise The Proof
     ▸   Replace z by metavariable Xi
                     (x ⊲ (c, s))    (c2 , s2 )
                 =     { definition of (⊲) }
                     ((x − s) ↓ c, x + s)      (c2 , s2 )
                 =     { definition of ( ) }
                     ((((x − s) ↓ c) − X1 ) ↓ X2 , x + s + X3 )
                 =     { -X1 distributes over (↓) }
                     (((x − s − X1 ) ↓ (c − X1 )) ↓ X2 , x + s + X3 )
                 =     { arithmetics }
                     (((x − (s + X1 )) ↓ ((c − X1 ) ↓ X2 ), x + s + X3 )
                 =     { definition of (⊲) }
                     x ⊲ ((c − X1 ) ↓ X2 , s + X1 )
                 =     { definition of ( ) }
                     x ⊲ ((c, s)    (c2 , s2 ))

                  Yun-Yan Chi, Shin-Cheng Mu      APLAS 2011 23/ 25
Setup
                              Example: Steep
                                                  Proving foldr (⊲) e = foldl (⊳) e
                                 Conclusions
                                                  Constructing ( )



Generalise The Proof
     ▸   (s + X1 ) and (s + X3 ) have to be the same term
                     (x ⊲ (c, s))    (c2 , s2 )
                 =     { definition of (⊲) }
                     ((x − s) ↓ c, x + s)      (c2 , s2 )
                 =     { definition of ( ) }
                     ((((x − s) ↓ c) − X1 ) ↓ X2 , x + s + X3 )
                 =     { -X1 distributes over (↓) }
                     (((x − s − X1 ) ↓ (c − X1 )) ↓ X2 , x + s + X3 )
                 =     { arithmetics }
                     (((x − (s + X1 )) ↓ ((c − X1 ) ↓ X2 ), x + s + X3 )
                 =     { definition of (⊲) }
                     x ⊲ ((c − X1 ) ↓ X2 , s + X1 )
                 =     { definition of ( ) }
                     x ⊲ ((c, s)    (c2 , s2 ))

                  Yun-Yan Chi, Shin-Cheng Mu      APLAS 2011 23/ 25
Setup
                              Example: Steep
                                                  Proving foldr (⊲) e = foldl (⊳) e
                                 Conclusions
                                                  Constructing ( )



Generalise The Proof
     ▸   (s + X1 ) and (s + X3 ) have to be the same term
                     (x ⊲ (c, s))    (c2 , s2 )
                 =     { definition of (⊲) }
                     ((x − s) ↓ c, x + s)      (c2 , s2 )
                 =     { definition of ( ) }
                     ((((x − s) ↓ c) − X1 ) ↓ X2 , x + s + X1 )
                 =     { -X1 distributes over (↓) }
                     (((x − s − X1 ) ↓ (c − X1 )) ↓ X2 , x + s + X1 )
                 =     { arithmetics }
                     (((x − (s + X1 )) ↓ ((c − X1 ) ↓ X2 ), x + s + X1 )
                 =     { definition of (⊲) }
                     x ⊲ ((c − X1 ) ↓ X2 , s + X1 )
                 =     { definition of ( ) }
                     x ⊲ ((c, s)    (c2 , s2 ))

                  Yun-Yan Chi, Shin-Cheng Mu      APLAS 2011 23/ 25
Setup
                               Example: Steep
                                                   Proving foldr (⊲) e = foldl (⊳) e
                                  Conclusions
                                                   Constructing ( )



Generalise The Proof
     ▸   Proof of (x ⊲ y )       (c2 , s2 ) = x ⊲ (y          (c2 , s2 ))
                      (x ⊲ (c, s))    (c2 , s2 )
                  =     { definition of (⊲) }
                      ((x − s) ↓ c, x + s)      (c2 , s2 )
                  =     { definition of ( ) }
                      ((((x − s) ↓ c) − X1 ) ↓ X2 , x + s + X1 )
                  =     { -X1 distributes over (↓) }
                      (((x − s − X1 ) ↓ (c − X1 )) ↓ X2 , x + s + X1 )
                  =     { arithmetics }
                      (((x − (s + X1 )) ↓ ((c − X1 ) ↓ X2 ), x + s + X1 )
                  =     { definition of (⊲) }
                      x ⊲ ((c − X1 ) ↓ X2 , s + X1 )
                  =     { definition of ( ) }
                      x ⊲ ((c, s)    (c2 , s2 ))

                   Yun-Yan Chi, Shin-Cheng Mu      APLAS 2011 23/ 25
Setup
                                 Example: Steep
                                                  Proving foldr (⊲) e = foldl (⊳) e
                                    Conclusions
                                                  Constructing ( )



Refining The ( )

    ▸   (c1 , s1 )   (c2 , s2 ) = ((c1 − X1 ) ↓ X2 , s1 + X1 )
    ▸   Satisfies that (c2 , s2 ) = (∞, 0)            (c2 , s2 )

                              (c2 , s2 ) = ((∞ − X1 ) ↓ X2 , 0 + X1 )
                          ≡ (c2 , s2 ) = (∞ ↓ X2 , X1 )
                          ≡ (c2 , s2 ) = (X2 , X1 )




                     Yun-Yan Chi, Shin-Cheng Mu   APLAS 2011 24/ 25
Setup
                                 Example: Steep
                                                  Proving foldr (⊲) e = foldl (⊳) e
                                    Conclusions
                                                  Constructing ( )



Refining The ( )

    ▸   (c1 , s1 )   (c2 , s2 ) = ((c1 − X1 ) ↓ X2 , s1 + X1 )
    ▸   Satisfies that (c2 , s2 ) = (∞, 0)            (c2 , s2 )

                              (c2 , s2 ) = ((∞ − X1 ) ↓ X2 , 0 + X1 )
                          ≡ (c2 , s2 ) = (∞ ↓ X2 , X1 )
                          ≡ (c2 , s2 ) = (X2 , X1 )
    ▸   We have thus discovered that
           ▸   (c1 , s1 ) (c2 , s2 ) = ((c1 − s2 ) ↓ c2 , s1 + s2 )
           ▸   This ( ) has got to be correct, because we have the proof
               already!



                     Yun-Yan Chi, Shin-Cheng Mu   APLAS 2011 24/ 25
Example: Steep
                                  Conclusions



Conclusions



     ▸   We have proposed and demonstrated a novel approach to
         constructing ( ).
     ▸   Starting with a trivial generalisation of either (⊲) or (⊳), we
         exploit the constraint enforced by the proof of associativity to
         refine ( ).
     ▸   Once we have constructed ( ), we have its correctness proof
         too.




                   Yun-Yan Chi, Shin-Cheng Mu   APLAS 2011 25/ 25

More Related Content

PDF
Quantum optical models in noncommutative spaces
PDF
Discussion of ABC talk by Stefano Cabras, Padova, March 21, 2013
PDF
Machine learning (9)
PDF
Truth, deduction, computation lecture i (last one)
PDF
Slides simplexe
PDF
Slides econ-lm
PDF
Slides econ-lm
PDF
Darmon Points: an Overview
Quantum optical models in noncommutative spaces
Discussion of ABC talk by Stefano Cabras, Padova, March 21, 2013
Machine learning (9)
Truth, deduction, computation lecture i (last one)
Slides simplexe
Slides econ-lm
Slides econ-lm
Darmon Points: an Overview

What's hot (15)

PDF
Cs229 notes8
PDF
Lecture 2 predicates quantifiers and rules of inference
PDF
Laplace's Demon: seminar #1
PDF
Dominación y extensiones óptimas de operadores con rango esencial compacto en...
PPTX
Predicates and Quantifiers
DOC
PDF
Slides mc gill-v3
PPTX
Predicates and quantifiers presentation topics
PPT
Predicates and Quantifiers
PPTX
PDF
Sildes buenos aires
PDF
ABC-Gibbs
PDF
IRJET - Fuzzy Soft Hyperideals in Meet Hyperlattices
PDF
Harmonic Analysis and Deep Learning
PDF
Hyperfunction method for numerical integration and Fredholm integral equation...
Cs229 notes8
Lecture 2 predicates quantifiers and rules of inference
Laplace's Demon: seminar #1
Dominación y extensiones óptimas de operadores con rango esencial compacto en...
Predicates and Quantifiers
Slides mc gill-v3
Predicates and quantifiers presentation topics
Predicates and Quantifiers
Sildes buenos aires
ABC-Gibbs
IRJET - Fuzzy Soft Hyperideals in Meet Hyperlattices
Harmonic Analysis and Deep Learning
Hyperfunction method for numerical integration and Fredholm integral equation...
Ad

Similar to Constructing List Homomorphisms from Proofs (20)

PDF
Meta-learning and the ELBO
PDF
Discussion cabras-robert-130323171455-phpapp02
PDF
Testing for mixtures by seeking components
PDF
PDF
L2_First_Order_Logic - AI_for_Beginners, Logic Maths
PDF
Murphy: Machine learning A probabilistic perspective: Ch.9
PDF
Lecture11
PDF
Slides mc gill-v4
PDF
bayesian_statistics_introduction_uppsala_university
PPT
Jarrar.lecture notes.aai.2011s.ch8.fol.introduction
PDF
Inferring the number of components: dream or reality?
PPTX
AI_05_First Order Logic.pptx
PDF
The dual geometry of Shannon information
PPT
Predicate logic_2(Artificial Intelligence)
PDF
Presentation iaf 2014 v1
PPT
Ch09.ppt dilfidsnpfpdsvklnvskv vdv;dlvd k;vsvdvk
PDF
PAGOdA poster
DOCX
Probability[1]
PDF
Notes on Intersection theory
PDF
CISEA 2019: ABC consistency and convergence
Meta-learning and the ELBO
Discussion cabras-robert-130323171455-phpapp02
Testing for mixtures by seeking components
L2_First_Order_Logic - AI_for_Beginners, Logic Maths
Murphy: Machine learning A probabilistic perspective: Ch.9
Lecture11
Slides mc gill-v4
bayesian_statistics_introduction_uppsala_university
Jarrar.lecture notes.aai.2011s.ch8.fol.introduction
Inferring the number of components: dream or reality?
AI_05_First Order Logic.pptx
The dual geometry of Shannon information
Predicate logic_2(Artificial Intelligence)
Presentation iaf 2014 v1
Ch09.ppt dilfidsnpfpdsvklnvskv vdv;dlvd k;vsvdvk
PAGOdA poster
Probability[1]
Notes on Intersection theory
CISEA 2019: ABC consistency and convergence
Ad

More from Yun-Yan Chi (13)

PDF
Tezos Taipei Meetup #2 - 15/06/2019
PDF
Traversing on Algebraic Datatype
PDF
for "Parallelizing Multiple Group-by Queries using MapReduce"
PDF
Program Language - Fall 2013
PDF
Machine X Language
PDF
Examples for loopless
PDF
Insert 2 Merge
PDF
Any tutor
PDF
Data type a la carte
PDF
Genetic programming
PDF
Paper presentation: The relative distance of key point based iris recognition
PDF
Deriving a compiler and interpreter for a Multi-level
PDF
Number System in Haskell
Tezos Taipei Meetup #2 - 15/06/2019
Traversing on Algebraic Datatype
for "Parallelizing Multiple Group-by Queries using MapReduce"
Program Language - Fall 2013
Machine X Language
Examples for loopless
Insert 2 Merge
Any tutor
Data type a la carte
Genetic programming
Paper presentation: The relative distance of key point based iris recognition
Deriving a compiler and interpreter for a Multi-level
Number System in Haskell

Recently uploaded (20)

PDF
FIFA World Cup Scaloni Hopeful for Messi’s FIFA World Cup 2026 Participation.pdf
DOC
Bishop's毕业证学历认证,维耶蒙特利尔学校毕业证毕业证文凭
DOCX
North Texas announced as base camps for 2026 FIFA World Cup.docx
DOCX
NFL London Jets QB Room Dealing with Multiple Injuries.docx
DOCX
NFL Dublin Addison Fuels Steelers-Vikings Showdown.docx
DOCX
NFL Dublin Will Howard’s Preseason Be Over After Hand Injury.docx
DOCX
NFL Dublin Who Will Rise as Super Bowl 60 Champs.docx
PPTX
International Football (International football is a type of soccer in which n...
PPTX
Badminton Sport group presentation pathfit
PPTX
Orange and Colorful History Of Sport Club Presentation.pptx
PDF
Understanding Volunteering_ A Look at Its True Meaning by David Bennett Gallo...
DOCX
FIFA World Cup Semi Final: Lionel Messi one win from crowning glory after Arg...
PDF
Download GTA 5 For PC (Windows 7, 10, 11)
PDF
BOOK MUAYTHAI THAI FIGHT ALEXANDRE BRECK
PPTX
sports performance data analysics for sports
DOCX
How FIFA 2026 Is Changing Vancouver Before Kickoff.docx
DOCX
FIFA World Cup 2026 Run-Up Just 10 Months Until Kickoff.docx
PPT
Aboriginals Achievements in Society and Community Development
DOCX
NFL Dublin Labriola on Steelers’ Victory Over the Jaguars.docx
DOCX
NFL Dublin Vikings Turn to Speed with Tai Felton.docx
FIFA World Cup Scaloni Hopeful for Messi’s FIFA World Cup 2026 Participation.pdf
Bishop's毕业证学历认证,维耶蒙特利尔学校毕业证毕业证文凭
North Texas announced as base camps for 2026 FIFA World Cup.docx
NFL London Jets QB Room Dealing with Multiple Injuries.docx
NFL Dublin Addison Fuels Steelers-Vikings Showdown.docx
NFL Dublin Will Howard’s Preseason Be Over After Hand Injury.docx
NFL Dublin Who Will Rise as Super Bowl 60 Champs.docx
International Football (International football is a type of soccer in which n...
Badminton Sport group presentation pathfit
Orange and Colorful History Of Sport Club Presentation.pptx
Understanding Volunteering_ A Look at Its True Meaning by David Bennett Gallo...
FIFA World Cup Semi Final: Lionel Messi one win from crowning glory after Arg...
Download GTA 5 For PC (Windows 7, 10, 11)
BOOK MUAYTHAI THAI FIGHT ALEXANDRE BRECK
sports performance data analysics for sports
How FIFA 2026 Is Changing Vancouver Before Kickoff.docx
FIFA World Cup 2026 Run-Up Just 10 Months Until Kickoff.docx
Aboriginals Achievements in Society and Community Development
NFL Dublin Labriola on Steelers’ Victory Over the Jaguars.docx
NFL Dublin Vikings Turn to Speed with Tai Felton.docx

Constructing List Homomorphisms from Proofs

  • 1. Constructing List Homomorphisms from Proofs Yun-Yan Chi Shin-Cheng Mu IIS, Academia Sinica, Taiwan September 17, 2012 Yun-Yan Chi, Shin-Cheng Mu APLAS 2011 1/ 25
  • 2. Prelude Preliminaries The Way To Go List Homomorphism ▸ A function h on lists is called a list homomorphism if it satisfies h (xs + ys) = h xs h ys, + for some associative operator ( ) ▸ E.g. sum (xs + ys) = sum xs + sum ys + Yun-Yan Chi, Shin-Cheng Mu APLAS 2011 2/ 25
  • 3. Prelude Preliminaries The Way To Go List Homomorphism ▸ A function h on lists is called a list homomorphism if it satisfies h (xs + ys) = h xs h ys, + for some associative operator ( ) ▸ E.g. sum (xs + ys) = sum xs + sum ys + ▸ Potential chances of parallelisation ▸ compute h xs and h ys in parallel ▸ combine the results using ( ) ▸ Can a list homomorphism be mechanically constructed? Yun-Yan Chi, Shin-Cheng Mu APLAS 2011 2/ 25
  • 4. Prelude Preliminaries The Way To Go A clue ▸ The well-known third list-homomorphism theorem: ▸ h is a list homomorphism ▸ if h can be foldr (⊲) e and foldl(⊳) e for some (⊲), (⊳) and e ▸ E.g. sum ([3, 5, 7, 9]) = 3 + sum [5, 7, 9] = sum [3, 5, 7] + 9 = sum [3, 5] + sum [7, 9] Yun-Yan Chi, Shin-Cheng Mu APLAS 2011 3/ 25
  • 5. Prelude Preliminaries The Way To Go But, how? ▸ Plenty of previous work was devoted to the construction of ( ) from the definitions of (⊲) and (⊳) ▸ Practically, efforts are needed to prove h = foldr (⊲) e = foldl (⊳) e ▸ This occurs often that one of (⊲) or (⊳) is picked as definition of h, while the other is much harder to find Yun-Yan Chi, Shin-Cheng Mu APLAS 2011 4/ 25
  • 6. Prelude Preliminaries The Way To Go But, how? ▸ We may have a good guess of ( ) by mixing (⊲) and (⊳) ▸ The proof of the correctness of ( ) is very similar to the proof of h = foldr (⊲) e = foldl (⊳) e, which we have to provide anyway ▸ Our idea: transform the proof of the correctness of ( ) from the proof of foldr = foldl, after assembling a possible ( ) Yun-Yan Chi, Shin-Cheng Mu APLAS 2011 4/ 25
  • 7. Prelude Fold Preliminaries Tupling The Way To Go Foldr-Fusion Law Prelude Preliminaries Fold Tupling Foldr-Fusion Law The Way To Go Proof by Fusion Proof Generalisation Yun-Yan Chi, Shin-Cheng Mu APLAS 2011 5/ 25
  • 8. Prelude Fold Preliminaries Tupling The Way To Go Foldr-Fusion Law Foldr ▸ A function h is a instance of foldr (⊲) e if h can be defined as ▸ h [] = e ▸ h (x xs) = x ⊲ h xs for some e and (⊲) ▸ E.g. foldr (⊲) e xs = foldr (⊲) e (x1 (x2 (x3 [ ]))) = x1 ⊲ foldr (⊲) e (x2 (x3 [ ])) = ... = x1 ⊲ (x2 ⊲ (x3 ⊲ e)) Yun-Yan Chi, Shin-Cheng Mu APLAS 2011 6/ 25
  • 9. Prelude Fold Preliminaries Tupling The Way To Go Foldr-Fusion Law Foldl ▸ Symmetrically, h is a foldl(⊳) e if it can be defined as ▸ h [] = e ▸ h (xs + [x]) = h xs ⊳ x, + for some (⊳) and e ▸ E.g. foldl (⊳) e xs = foldl (⊳) e ((([ ] + [x1 ]) + [x2 ]) + [x3 ]) + + + = foldl (⊳) e (([ ] + [x1 ]) + [x2 ]) ⊳ x3 + + = ... = ((e ⊳ x1 ) ⊳ x2 ) ⊳ x3 Yun-Yan Chi, Shin-Cheng Mu APLAS 2011 7/ 25
  • 10. Prelude Fold Preliminaries Tupling The Way To Go Foldr-Fusion Law Tupling ▸ Not all functions can be a fold ▸ Tupling: for h, find a k such that ⟨h, k⟩ is a fold ▸ ⟨h, k⟩ x = (h x, k x) Yun-Yan Chi, Shin-Cheng Mu APLAS 2011 8/ 25
  • 11. Prelude Fold Preliminaries Tupling The Way To Go Foldr-Fusion Law Foldr-Fusion Law ▸ One can fuse f and foldr into another foldr Yun-Yan Chi, Shin-Cheng Mu APLAS 2011 9/ 25
  • 12. Prelude Fold Preliminaries Tupling The Way To Go Foldr-Fusion Law Foldr-Fusion Law ▸ One can fuse f and foldr into another foldr (f ○ foldr (⊲) e) xs = (f ○ foldr (⊲) e) (x1 (x2 (x3 ... []))) = f (x1 ⊲ (x2 ⊲ (x3 ⊲ ... ⊲ e))) = { f (x ⊲ z) = x ⊕ f z } x1 ⊕ (f (x2 ⊲ (x3 ⊲ ... ⊲ e))) = ... = x1 ⊕ (x2 ⊕ (x3 ⊕ ... ⊕ (f e))) = foldr (⊕) (f e) xs Yun-Yan Chi, Shin-Cheng Mu APLAS 2011 9/ 25
  • 13. Prelude Proof by Fusion Preliminaries Proof Generalisation The Way To Go Return to our approach ▸ Since we try to transform the proof of ▸ h = foldr (⊲) e = foldl (⊳) e to the proof of ▸ the correctness of ( ), ▸ we want to know how to 1. prove that h = foldr (⊲) e = foldl (⊳) e 2. prove that ( ) do define a list homomorphism 3. transform the former to the latter Yun-Yan Chi, Shin-Cheng Mu APLAS 2011 10/ 25
  • 14. Prelude Proof by Fusion Preliminaries Proof Generalisation The Way To Go h = foldr (⊲) e = foldl (⊳) e ▸ Let h = foldr (⊲) e ▸ To prove that h = foldl (⊳) e, we have to show ▸ h[] = e ▸ h (xs + [z]) = h xs ⊳ z + ▸ In point-free style: h ○ (+ +[z]) = (⊳ z) ○ h h ○ (+ +[z]) = { foldr -fusion, since (+ +[z]) = foldr ( ) [z] } foldr (⊲) (h [z]) = { foldr -fusion (backwards) } (⊳ z) ○ foldr (⊲) e = (⊳ z) ○ h Yun-Yan Chi, Shin-Cheng Mu APLAS 2011 11/ 25
  • 15. Prelude Proof by Fusion Preliminaries Proof Generalisation The Way To Go h = foldr (⊲) e = foldl (⊳) e ▸ For the second foldr -fusion ▸ z ⊲e=e⊳z ▸ (x ⊲ y ) ⊳ z = x ⊲ (y ⊳ z) - the associativity of (⊲) and (⊳) ▸ We will have the proof of h = foldr (⊲) e = foldl (⊳) e if we have the proof of above fusion conditions Yun-Yan Chi, Shin-Cheng Mu APLAS 2011 11/ 25
  • 16. Prelude Proof by Fusion Preliminaries Proof Generalisation The Way To Go h is list homomorphism ▸ To prove that h is a list homomorphism, we have to show ▸ h (xs + ys) = h xs + h ys ▸ In point-free style: h ○ (+ +ys) = ( h ys) ○ h h ○ (+ +ys) = { foldr -fusion, since (+ +ys) = foldr ( ) ys } foldr (⊲) (h ys) = { foldr -fusion (backwards) } ( h ys) ○ foldr (⊲) e = ( h ys) ○ h Yun-Yan Chi, Shin-Cheng Mu APLAS 2011 12/ 25
  • 17. Prelude Proof by Fusion Preliminaries Proof Generalisation The Way To Go h is list homomorphism ▸ For the second foldr -fusion ▸ h ys = e h ys ▸ (x ⊲ y ) h ys = x ⊲ (y h ys) ▸ If we have the proof of those fusion conditions, we will have the proof of ( ) do define a list homomorphism Yun-Yan Chi, Shin-Cheng Mu APLAS 2011 12/ 25
  • 18. Prelude Proof by Fusion Preliminaries Proof Generalisation The Way To Go Generalisation ▸ To transform the proof of ▸ h = foldr (⊲) e = foldl (⊳) e to the proof of ▸ h (xs + ys) = h xs + h ys Yun-Yan Chi, Shin-Cheng Mu APLAS 2011 13/ 25
  • 19. Prelude Proof by Fusion Preliminaries Proof Generalisation The Way To Go Generalisation ▸ To transform the proof of ▸ z ⊲e=e⊳z ▸ (x ⊲ y ) ⊳ z = x ⊲ (y ⊳ z) to the proof of ▸ h ys = e h ys ▸ (x ⊲ y ) h ys = x ⊲ (y h ys) Yun-Yan Chi, Shin-Cheng Mu APLAS 2011 13/ 25
  • 20. Prelude Proof by Fusion Preliminaries Proof Generalisation The Way To Go Generalisation ▸ To transform the proof of ▸ z ⊲e=e⊳z ▸ (x ⊲ y ) ⊳ z = x ⊲ (y ⊳ z) to the proof of ▸ h ys = e h ys ▸ (x ⊲ y ) h ys = x ⊲ (y h ys) ▸ To come up with ( ) and its correctness proof ▸ Generalise the former proof to the latter by replacing the occurrences of z in (⊳) by metavariables Yun-Yan Chi, Shin-Cheng Mu APLAS 2011 13/ 25
  • 21. Setup Example: Steep Proving foldr (⊲) e = foldl (⊳) e Conclusions Constructing ( ) Example: Steep Setup Proving foldr (⊲) e = foldl (⊳) e Constructing ( ) Conclusions Yun-Yan Chi, Shin-Cheng Mu APLAS 2011 14/ 25
  • 22. Setup Example: Steep Proving foldr (⊲) e = foldl (⊳) e Conclusions Constructing ( ) Steep ▸ A list of numbers is said to be steep if each number is larger than the sum of the numbers to its right. ▸ E.g. steep [20, 10, 5, 2] Yun-Yan Chi, Shin-Cheng Mu APLAS 2011 15/ 25
  • 23. Setup Example: Steep Proving foldr (⊲) e = foldl (⊳) e Conclusions Constructing ( ) Steep ▸ A list of numbers is said to be steep if each number is larger than the sum of the numbers to its right. ▸ E.g. steep [20, 10, 5, 2] Yun-Yan Chi, Shin-Cheng Mu APLAS 2011 15/ 25
  • 24. Setup Example: Steep Proving foldr (⊲) e = foldl (⊳) e Conclusions Constructing ( ) Steep ▸ A list of numbers is said to be steep if each number is larger than the sum of the numbers to its right. ▸ E.g. steep [20, 10, 5, 2] Yun-Yan Chi, Shin-Cheng Mu APLAS 2011 15/ 25
  • 25. Setup Example: Steep Proving foldr (⊲) e = foldl (⊳) e Conclusions Constructing ( ) Steep ▸ A list of numbers is said to be steep if each number is larger than the sum of the numbers to its right. ▸ E.g. steep [20, 10, 5, 2] Yun-Yan Chi, Shin-Cheng Mu APLAS 2011 15/ 25
  • 26. Setup Example: Steep Proving foldr (⊲) e = foldl (⊳) e Conclusions Constructing ( ) Steep ▸ A list of numbers is said to be steep if each number is larger than the sum of the numbers to its right. ▸ Can steep be a foldr ? Yun-Yan Chi, Shin-Cheng Mu APLAS 2011 15/ 25
  • 27. Setup Example: Steep Proving foldr (⊲) e = foldl (⊳) e Conclusions Constructing ( ) Steep ▸ A list of numbers is said to be steep if each number is larger than the sum of the numbers to its right. ▸ Can steep be a foldr ? Yun-Yan Chi, Shin-Cheng Mu APLAS 2011 15/ 25
  • 28. Setup Example: Steep Proving foldr (⊲) e = foldl (⊳) e Conclusions Constructing ( ) Steep ▸ A list of numbers is said to be steep if each number is larger than the sum of the numbers to its right. ▸ Can steep be a foldl ? Yun-Yan Chi, Shin-Cheng Mu APLAS 2011 15/ 25
  • 29. Setup Example: Steep Proving foldr (⊲) e = foldl (⊳) e Conclusions Constructing ( ) Steep ▸ A list of numbers is said to be steep if each number is larger than the sum of the numbers to its right. ▸ Can steep be a foldl ? Yun-Yan Chi, Shin-Cheng Mu APLAS 2011 15/ 25
  • 30. Setup Example: Steep Proving foldr (⊲) e = foldl (⊳) e Conclusions Constructing ( ) Steep ▸ A list of numbers is said to be steep if each number is larger than the sum of the numbers to its right. ▸ Can steep be a foldl ? Yun-Yan Chi, Shin-Cheng Mu APLAS 2011 15/ 25
  • 31. Setup Example: Steep Proving foldr (⊲) e = foldl (⊳) e Conclusions Constructing ( ) Steep ▸ A list of numbers is said to be steep if each number is larger than the sum of the numbers to its right. ▸ Can steep be a foldl ? Yun-Yan Chi, Shin-Cheng Mu APLAS 2011 15/ 25
  • 32. Setup Example: Steep Proving foldr (⊲) e = foldl (⊳) e Conclusions Constructing ( ) Cap ▸ cap xs, upper-bound of value we can attach to the right of xs ▸ cap can be a foldr together with sum Yun-Yan Chi, Shin-Cheng Mu APLAS 2011 16/ 25
  • 33. Setup Example: Steep Proving foldr (⊲) e = foldl (⊳) e Conclusions Constructing ( ) Cap ▸ cap xs, upper-bound of value we can attach to the right of xs ▸ cap can be a foldl Yun-Yan Chi, Shin-Cheng Mu APLAS 2011 16/ 25
  • 34. Setup Example: Steep Proving foldr (⊲) e = foldl (⊳) e Conclusions Constructing ( ) Steep as Fold ▸ We can compute steep if we can compute cap ▸ ⟨cap, sum⟩ can be foldr (⊲) (∞, 0) and foldl (⊳) (∞, 0), where ▸ x ⊲ (c2 , s2 ) = ((x − s2 ) ↓ c2 , x + s2 ) ▸ (c1 , s1 ) ⊳ z = ((c1 − z) ↓ z, s1 + z) ▸ It is not so obvious that foldr = foldl Yun-Yan Chi, Shin-Cheng Mu APLAS 2011 17/ 25
  • 35. Setup Example: Steep Proving foldr (⊲) e = foldl (⊳) e Conclusions Constructing ( ) Example: Steep Setup Proving foldr (⊲) e = foldl (⊳) e Constructing ( ) Conclusions Yun-Yan Chi, Shin-Cheng Mu APLAS 2011 18/ 25
  • 36. Setup Example: Steep Proving foldr (⊲) e = foldl (⊳) e Conclusions Constructing ( ) Fusion Conditions ▸ z ⊲ (∞, 0) = (∞, 0) ⊳ z ▸ (x ⊲ y ) ⊳ z = x ⊲ (y ⊳ z) ▸ The former condition trivially holds: z ⊲ (∞, 0) = { definition of (⊲) } ((z − 0) ↓ ∞, z + 0) = { arithmetics } ((∞ − z) ↓ z, 0 + z) = { definition of (⊳) } (∞, 0) ⊳ z. Yun-Yan Chi, Shin-Cheng Mu APLAS 2011 19/ 25
  • 37. Setup Example: Steep Proving foldr (⊲) e = foldl (⊳) e Conclusions Constructing ( ) Proof of Associativity (x ⊲ (c, s)) ⊳ z = { definition of (⊲) } ((x − s) ↓ c, x + s) ⊳ z = { definition of (⊳) } ((((x − s) ↓ c) − z) ↓ z, x + s + z) = { (−z) distributes over (↓) } (((x − s − z) ↓ (c − z)) ↓ z, x + s + z) = { arithmetics } (((x − (s + z)) ↓ ((c − z) ↓ z), x + s + z) = { definition of (⊲) } x ⊲ ((c − z) ↓ z, s + z) = { definition of (⊳) } x ⊲ ((c, s) ⊳ z) Yun-Yan Chi, Shin-Cheng Mu APLAS 2011 20/ 25
  • 38. Setup Example: Steep Proving foldr (⊲) e = foldl (⊳) e Conclusions Constructing ( ) Example: Steep Setup Proving foldr (⊲) e = foldl (⊳) e Constructing ( ) Conclusions Yun-Yan Chi, Shin-Cheng Mu APLAS 2011 21/ 25
  • 39. Setup Example: Steep Proving foldr (⊲) e = foldl (⊳) e Conclusions Constructing ( ) The Aim now is 1. Generalise the proof of ▸ (x ⊲ y ) ⊳ z = x ⊲ (y ⊳ z) to a proof of ▸ (x ⊲ y ) (c2 , s2 ) = x ⊲ (y (c2 , s2 )). 2. Construct a definition of ( ) Yun-Yan Chi, Shin-Cheng Mu APLAS 2011 22/ 25
  • 40. Setup Example: Steep Proving foldr (⊲) e = foldl (⊳) e Conclusions Constructing ( ) Generalise The Proof ▸ Copy the proof of associativity (x ⊲ (c, s)) ⊳ z = { definition of (⊲) } ((x − s) ↓ c, x + s) ⊳ z = { definition of (⊳) } ((((x − s) ↓ c) − z) ↓ z, x + s + z) = { -z distributes over (↓) } (((x − s − z) ↓ (c − z)) ↓ z, x + s + z) = { arithmetics } (((x − (s + z)) ↓ ((c − z) ↓ z), x + s + z) = { definition of (⊲) } x ⊲ ((c − z) ↓ z, s + z) = { definition of (⊳) } x ⊲ ((c, s) ⊳ z) Yun-Yan Chi, Shin-Cheng Mu APLAS 2011 23/ 25
  • 41. Setup Example: Steep Proving foldr (⊲) e = foldl (⊳) e Conclusions Constructing ( ) Generalise The Proof ▸ Generalise ⊳ z to (c2 , s2 ) (x ⊲ (c, s)) ⊳ z = { definition of (⊲) } ((x − s) ↓ c, x + s) ⊳ z = { definition of (⊳) } ((((x − s) ↓ c) − z) ↓ z, x + s + z) = { -z distributes over (↓) } (((x − s − z) ↓ (c − z)) ↓ z, x + s + z) = { arithmetics } (((x − (s + z)) ↓ ((c − z) ↓ z), x + s + z) = { definition of (⊲) } x ⊲ ((c − z) ↓ z, s + z) = { definition of (⊳) } x ⊲ ((c, s) ⊳ z) Yun-Yan Chi, Shin-Cheng Mu APLAS 2011 23/ 25
  • 42. Setup Example: Steep Proving foldr (⊲) e = foldl (⊳) e Conclusions Constructing ( ) Generalise The Proof ▸ Generalise ⊳ z to (c2 , s2 ) (x ⊲ (c, s)) (c2 , s2 ) = { definition of (⊲) } ((x − s) ↓ c, x + s) (c2 , s2 ) = { definition of ( ) } ((((x − s) ↓ c) − z) ↓ z, x + s + z) = { -z distributes over (↓) } (((x − s − z) ↓ (c − z)) ↓ z, x + s + z) = { arithmetics } (((x − (s + z)) ↓ ((c − z) ↓ z), x + s + z) = { definition of (⊲) } x ⊲ ((c − z) ↓ z, s + z) = { definition of ( ) } x ⊲ ((c, s) (c2 , s2 )) Yun-Yan Chi, Shin-Cheng Mu APLAS 2011 23/ 25
  • 43. Setup Example: Steep Proving foldr (⊲) e = foldl (⊳) e Conclusions Constructing ( ) Generalise The Proof ▸ Replace z by metavariable Xi (x ⊲ (c, s)) (c2 , s2 ) = { definition of (⊲) } ((x − s) ↓ c, x + s) (c2 , s2 ) = { definition of ( ) } ((((x − s) ↓ c) − z) ↓ z, x + s + z) = { -z distributes over (↓) } (((x − s − z) ↓ (c − z)) ↓ z, x + s + z) = { arithmetics } (((x − (s + z)) ↓ ((c − z) ↓ z), x + s + z) = { definition of (⊲) } x ⊲ ((c − z) ↓ z, s + z) = { definition of ( ) } x ⊲ ((c, s) (c2 , s2 )) Yun-Yan Chi, Shin-Cheng Mu APLAS 2011 23/ 25
  • 44. Setup Example: Steep Proving foldr (⊲) e = foldl (⊳) e Conclusions Constructing ( ) Generalise The Proof ▸ Replace z by metavariable Xi (x ⊲ (c, s)) (c2 , s2 ) = { definition of (⊲) } ((x − s) ↓ c, x + s) (c2 , s2 ) = { definition of ( ) } ((((x − s) ↓ c) − X1 ) ↓ X2 , x + s + X3 ) = { -X1 distributes over (↓) } (((x − s − X1 ) ↓ (c − X1 )) ↓ X2 , x + s + X3 ) = { arithmetics } (((x − (s + X1 )) ↓ ((c − X1 ) ↓ X2 ), x + s + X3 ) = { definition of (⊲) } x ⊲ ((c − X1 ) ↓ X2 , s + X1 ) = { definition of ( ) } x ⊲ ((c, s) (c2 , s2 )) Yun-Yan Chi, Shin-Cheng Mu APLAS 2011 23/ 25
  • 45. Setup Example: Steep Proving foldr (⊲) e = foldl (⊳) e Conclusions Constructing ( ) Generalise The Proof ▸ (s + X1 ) and (s + X3 ) have to be the same term (x ⊲ (c, s)) (c2 , s2 ) = { definition of (⊲) } ((x − s) ↓ c, x + s) (c2 , s2 ) = { definition of ( ) } ((((x − s) ↓ c) − X1 ) ↓ X2 , x + s + X3 ) = { -X1 distributes over (↓) } (((x − s − X1 ) ↓ (c − X1 )) ↓ X2 , x + s + X3 ) = { arithmetics } (((x − (s + X1 )) ↓ ((c − X1 ) ↓ X2 ), x + s + X3 ) = { definition of (⊲) } x ⊲ ((c − X1 ) ↓ X2 , s + X1 ) = { definition of ( ) } x ⊲ ((c, s) (c2 , s2 )) Yun-Yan Chi, Shin-Cheng Mu APLAS 2011 23/ 25
  • 46. Setup Example: Steep Proving foldr (⊲) e = foldl (⊳) e Conclusions Constructing ( ) Generalise The Proof ▸ (s + X1 ) and (s + X3 ) have to be the same term (x ⊲ (c, s)) (c2 , s2 ) = { definition of (⊲) } ((x − s) ↓ c, x + s) (c2 , s2 ) = { definition of ( ) } ((((x − s) ↓ c) − X1 ) ↓ X2 , x + s + X1 ) = { -X1 distributes over (↓) } (((x − s − X1 ) ↓ (c − X1 )) ↓ X2 , x + s + X1 ) = { arithmetics } (((x − (s + X1 )) ↓ ((c − X1 ) ↓ X2 ), x + s + X1 ) = { definition of (⊲) } x ⊲ ((c − X1 ) ↓ X2 , s + X1 ) = { definition of ( ) } x ⊲ ((c, s) (c2 , s2 )) Yun-Yan Chi, Shin-Cheng Mu APLAS 2011 23/ 25
  • 47. Setup Example: Steep Proving foldr (⊲) e = foldl (⊳) e Conclusions Constructing ( ) Generalise The Proof ▸ Proof of (x ⊲ y ) (c2 , s2 ) = x ⊲ (y (c2 , s2 )) (x ⊲ (c, s)) (c2 , s2 ) = { definition of (⊲) } ((x − s) ↓ c, x + s) (c2 , s2 ) = { definition of ( ) } ((((x − s) ↓ c) − X1 ) ↓ X2 , x + s + X1 ) = { -X1 distributes over (↓) } (((x − s − X1 ) ↓ (c − X1 )) ↓ X2 , x + s + X1 ) = { arithmetics } (((x − (s + X1 )) ↓ ((c − X1 ) ↓ X2 ), x + s + X1 ) = { definition of (⊲) } x ⊲ ((c − X1 ) ↓ X2 , s + X1 ) = { definition of ( ) } x ⊲ ((c, s) (c2 , s2 )) Yun-Yan Chi, Shin-Cheng Mu APLAS 2011 23/ 25
  • 48. Setup Example: Steep Proving foldr (⊲) e = foldl (⊳) e Conclusions Constructing ( ) Refining The ( ) ▸ (c1 , s1 ) (c2 , s2 ) = ((c1 − X1 ) ↓ X2 , s1 + X1 ) ▸ Satisfies that (c2 , s2 ) = (∞, 0) (c2 , s2 ) (c2 , s2 ) = ((∞ − X1 ) ↓ X2 , 0 + X1 ) ≡ (c2 , s2 ) = (∞ ↓ X2 , X1 ) ≡ (c2 , s2 ) = (X2 , X1 ) Yun-Yan Chi, Shin-Cheng Mu APLAS 2011 24/ 25
  • 49. Setup Example: Steep Proving foldr (⊲) e = foldl (⊳) e Conclusions Constructing ( ) Refining The ( ) ▸ (c1 , s1 ) (c2 , s2 ) = ((c1 − X1 ) ↓ X2 , s1 + X1 ) ▸ Satisfies that (c2 , s2 ) = (∞, 0) (c2 , s2 ) (c2 , s2 ) = ((∞ − X1 ) ↓ X2 , 0 + X1 ) ≡ (c2 , s2 ) = (∞ ↓ X2 , X1 ) ≡ (c2 , s2 ) = (X2 , X1 ) ▸ We have thus discovered that ▸ (c1 , s1 ) (c2 , s2 ) = ((c1 − s2 ) ↓ c2 , s1 + s2 ) ▸ This ( ) has got to be correct, because we have the proof already! Yun-Yan Chi, Shin-Cheng Mu APLAS 2011 24/ 25
  • 50. Example: Steep Conclusions Conclusions ▸ We have proposed and demonstrated a novel approach to constructing ( ). ▸ Starting with a trivial generalisation of either (⊲) or (⊳), we exploit the constraint enforced by the proof of associativity to refine ( ). ▸ Once we have constructed ( ), we have its correctness proof too. Yun-Yan Chi, Shin-Cheng Mu APLAS 2011 25/ 25