Zulip Chat Archive

Stream: general

Topic: Proving γ ≃ α ⊕ β × γ ⇒ γ ≃ α × list β


Slavomir Kaslev (Jun 03 2020 at 17:42):

I'm trying to formalize[1] some ideas from analytic combinatorics[2] and got stuck on trying to prove the following isomorphism:

structure {u v} iso (α : Sort u) (β : Sort v) :=
(f : α  β) (g : β  α) (gf : Π x, g (f x) = x) (fg : Π x, f (g x) = x)

def linear {α β γ : Type} (i : iso γ (α  β × γ)) : iso γ (α × list β) :=
⟨λ x, sum.rec (λ y, (y, [])) (λ y, (sorry, y.1 :: sorry)) (i.f x),
 λ x, list.rec (i.g (sum.inl x.1)) (λ y ys ih, i.g (sum.inr (y, ih))) x.2,
 λ x, sorry,
 λ x, sorry

This is how I would do it in Haskell:

data Iso a b = Iso { to :: a->b, from :: b->a }

lin_iso_to :: Iso c (Either a (b, c)) -> c -> (a, [b])
lin_iso_to i c = case to i c of
  Left a -> (a, [])
  Right (b, c) -> let (a, bs) = lin_iso_to i c in (a, b : bs)

lin_iso_from :: Iso c (Either a (b, c)) -> (a, [b]) -> c
lin_iso_from i (a, []) = from i $ Left a
lin_iso_from i (a, b:bs) = from i $ Right (b, lin_iso_from i (a, bs))

-- c = a + b c   =>   c = a (list b)
lin_iso :: Iso c (Either a (b, c)) -> Iso c (a, [b])
lin_iso i = Iso {to = lin_iso_to i, from = lin_iso_from i}

but I can't figure out how to do the recursive call in lin_iso_to.

I haven't used the well-founded machinery in Lean so far and I guess that's the missing piece for the above definition.

[1] https://github.com/skaslev/papers/blob/master/analytic_functor.lean
[2] http://algo.inria.fr/flajolet/Publications/book.pdf

Reid Barton (Jun 03 2020 at 17:44):

This doesn't look true, since lists are finite

Reid Barton (Jun 03 2020 at 17:45):

or actually it just doesn't look true period

Reid Barton (Jun 03 2020 at 17:46):

Aren't potentially infinite streams another solution to γ ≃ α ⊕ β × γ?

Slavomir Kaslev (Jun 03 2020 at 17:46):

Lists are potentially infinite in Haskell but always finite in Lean, if I understand correctly.

Reid Barton (Jun 03 2020 at 17:47):

In Lean α × list β is the initial algebra for α ⊕ β × - so you could build a map from α × list β to γ, but you can't necessarily go back

Slavomir Kaslev (Jun 03 2020 at 18:11):

The Haskell version works correctly though. What's missing imo is given iso γ (α ⊕ β × γ) to be able to do a recursive call over the γ on the rhs (since it should be "smaller" than the γ on the lhs and thus should terminate) but my well-founded-fu is nonexistent.

Reid Barton (Jun 03 2020 at 18:13):

It's not missing, though, because it's not true!

Reid Barton (Jun 03 2020 at 18:13):

Lean's semantics correspond to ordinary math, and the statement you are trying to prove is false in ordinary math.

Reid Barton (Jun 03 2020 at 18:14):

Haskell's semantics don't correspond to ordinary math so it's not surprising that you can "prove" it there.

Reid Barton (Jun 03 2020 at 18:15):

Here is a counterexample, take γ = α × list β ⊕ ℕ → β. Then there is still an isomorphism γ ≃ α ⊕ β × γ, but there isn't an isomorphism γ ≃ α × list β (in general; for example, take α empty).

Slavomir Kaslev (Jun 03 2020 at 18:15):

Can it be formally proved false in Lean then?

I've been using this isomorphism for a while and I haven't be able to come up with contradiction or any surprises so far.

Reid Barton (Jun 03 2020 at 18:22):

Yes, just use this example above.

Reid Barton (Jun 03 2020 at 18:23):

It's tempting to think that there should be some extra structure one can impose on top of bare sets to rule out examples like this one, but I don't know what it is.

Reid Barton (Jun 03 2020 at 18:23):

But in Set, it's just false.

Bhavik Mehta (Jun 03 2020 at 18:24):

Reid Barton said:

It's tempting to think that there should be some extra structure one can impose on top of bare sets to rule out examples like this one, but I don't know what it is.

Maybe that initial algebras and final coalgebras coincide?

Reid Barton (Jun 03 2020 at 18:25):

Right, but where does that actually happen.

Reid Barton (Jun 03 2020 at 18:25):

Maybe in compact Hausdorff spaces for example.

Bhavik Mehta (Jun 03 2020 at 18:25):

In 'Hask' :P

Johan Commelin (Jun 03 2020 at 18:26):

Obligatory Hask is not a category link...

Bhavik Mehta (Jun 03 2020 at 18:26):

I vaguely remember something about that happening in the category of CPOs with bottom, but might be misremembering

Bhavik Mehta (Jun 03 2020 at 18:26):

Johan Commelin said:

Obligator Hask is not a cateogry link...

Hence the quotes around it!

Reid Barton (Jun 03 2020 at 18:27):

right, and this is one place where you can say Haskell has its semantics I think

Reid Barton (Jun 03 2020 at 18:27):

but it's rather far from Set

Chris Hughes (Jun 03 2020 at 18:28):

Here's a disproof

example (h :  α β γ, γ  α  β × γ  γ  α × list β) : false :=
have unit  empty  unit × unit,
from { to_fun := λ _, sum.inr ((),()),
        inv_fun := λ _, (),
        left_inv := λ x, by cases x; refl,
        right_inv := λ x, begin cases x, cases x, cases x, cases x_fst, cases x_snd, refl end },
(h empty unit unit this ()).1.elim

Bhavik Mehta (Jun 03 2020 at 18:36):

The same idea lets you construct a term of type Void in Haskell

Bhavik Mehta (Jun 03 2020 at 18:40):

What's the actual bit of maths you wanted this result for?

Slavomir Kaslev (Jun 03 2020 at 18:58):

For constructing other isomorphisms (iso.linear is the offending propositionγ ≃ α ⊕ β × γ ⇒ γ ≃ α × list β) such as
https://github.com/skaslev/papers/blob/3d42174fa43cd71680a89c5cc14924b21d0b57de/analytic_functor.lean#L596-L607
https://github.com/skaslev/papers/blob/3d42174fa43cd71680a89c5cc14924b21d0b57de/analytic_functor.lean#L701-L716

Reid Barton (Jun 03 2020 at 19:03):

Well, those are all fine; you could construct the isomorphisms directly.

Slavomir Kaslev (Jun 03 2020 at 19:45):

This last use was giving me grief last time I tried to prove it directly :cold_sweat:

https://github.com/skaslev/papers/blob/3d42174fa43cd71680a89c5cc14924b21d0b57de/analytic_functor.lean#L774-L776


Last updated: Dec 20 2023 at 11:08 UTC