anchor.diff:        mk
   
     member z.Pos (_: Elem<'r, 'r, 'p>,
  -                down: Z<'w, 'r>,
  -                P0 left: P0Z<And<'l, 'r>, 'w, 'p>)
  -                       : PIZ<    'l, 'r , 'w, 'p> =
  +                down: Down<'w, 'r>,
  +                P0 left: ProductDown0<And<'l, 'r>, 'w, 'p>)
  +                       : ProductDownI<    'l, 'r , 'w, 'p> =
       PI <| fun wlrC ->
         let rec mk (And (l, r)) =
           {new Zipper<'w, 'r> with
  
positive.code: 
    member z.Union (m: Union<'u>,
                    _: AsChoice<'c, 'u>,
                    U u: UZ<'c, 'c, 'w, 'u>) : Z<'w, 'u> =
      let cs = Array.ofList u
      fun wuC u -> cs.[m.Tag u] wuC u
  
  
negative.code:       mk
  
    member z.Product (m: AsProduct<'es, 'p>,
                      P0 down: ProductDown0<'es, 'w, 'p>) : Down<'w, 'p> =
      fun wpC -> m.ToProduct >> down (m.OfProduct >> wpC) >> Some
  
    member z.Case (_: Case<Empty, 'cs, 'u>) : UZ<Empty, 'cs, 'w, 'u> =
      U [fun _ _ -> None]
  
    member z.Case (m: Case<'ls, 'cs, 'u>,
                   down: ProductDown0<'ls, 'w, 'u>) : UZ<'ls, 'cs, 'w, 'u> =
      U [z.Product (m, down)]
  
    member z.Plus (U c:  UZ<       'c      , Choice<'c, 'cs>, 'w, 'u>,
                   U cs: UZ<           'cs ,            'cs , 'w, 'u>)
  