Zulip Chat Archive

Stream: new members

Topic: working with sets of vectors


Koundinya Vajjha (Jun 05 2019 at 14:41):

Is there any function which transforms a vector (set A) n into set(vector A n) in mathlib?

Reid Barton (Jun 05 2019 at 14:42):

Transforms how? The cartesian product?

Reid Barton (Jun 05 2019 at 14:42):

Is set a monad?

Reid Barton (Jun 05 2019 at 14:42):

If so it looks like traverse

Koundinya Vajjha (Jun 05 2019 at 14:44):

Yes I want the cartesian product.

Koundinya Vajjha (Jun 05 2019 at 14:44):

set is a functor..

Chris Hughes (Jun 05 2019 at 14:46):

set is a monad, but I don't think it's been proved yet.

Reid Barton (Jun 05 2019 at 14:46):

Yeah, I should have said a monad

Koundinya Vajjha (Jun 05 2019 at 14:49):

@Reid Barton could you explain how traverse gives the cartesian product?

Reid Barton (Jun 05 2019 at 14:53):

Basically set models a nondeterministic computation. do a <- s, b <- t, ... corresponds to taking any combination of a in s and b in t.

Reid Barton (Jun 05 2019 at 14:54):

The monad instance has return : t -> set t given by singleton and join : set (set t) -> set t given by union

Reid Barton (Jun 05 2019 at 14:55):

list is another instance of the same idea that you can actually compute with, and sequence : list (list a) -> list (list a) being the cartesian product is a classic example in Haskell

Koundinya Vajjha (Jun 05 2019 at 14:58):

I'm finding it hard to convince lean that vector A n is the same thing as the n-fold cartesian product of elements of A.

Reid Barton (Jun 05 2019 at 15:02):

Is there a traversable instance for \lam A, vector A n? (Does that even work, with a lambda?)

Koundinya Vajjha (Jun 05 2019 at 15:03):

vector is defined as a subtype of list. I assume list is traversable, so does vector inherit that?

Mario Carneiro (Jun 05 2019 at 15:04):

no, that doesn't work in general

Reid Barton (Jun 05 2019 at 15:05):

Not automatically, and in fact there is something to prove--that the length of the list doesn't change

Reid Barton (Jun 05 2019 at 15:05):

It should be free by parametricity, but Lean doesn't know that

Mario Carneiro (Jun 05 2019 at 15:06):

actually parametricity doesn't tell you the length doesn't change; it could drop the first element without violating parametricity

Koundinya Vajjha (Jun 05 2019 at 15:06):

If vector does have a traversable instance, how would that help me define cartesian products?

Reid Barton (Jun 05 2019 at 15:06):

I guess you need the traversable laws as well then

Reid Barton (Jun 05 2019 at 15:06):

traverse would exactly be the cartesian product

Reid Barton (Jun 05 2019 at 15:08):

Of course if the traversable instance doesn't already exist then in some sense it doesn't help you.

Koundinya Vajjha (Jun 05 2019 at 15:08):

Isn't there a simpler way to do this?

Mario Carneiro (Jun 05 2019 at 15:08):

do it directly

Chris Hughes (Jun 05 2019 at 15:08):

example (n : ) {M : Type  Type} {α : Type} [monad M] : (M (fin n  α))  fin n  M α :=
λ x i, do y  x, return (y i)

Mario Carneiro (Jun 05 2019 at 15:09):

that's the wrong way around, I think

Chris Hughes (Jun 05 2019 at 15:09):

So it is.

Chris Hughes (Jun 05 2019 at 15:10):

The other way is harder.

Mario Carneiro (Jun 05 2019 at 15:12):

@Koundinya Vajjha is this an XY problem?

Mario Carneiro (Jun 05 2019 at 15:12):

I suspect you don't want this

Koundinya Vajjha (Jun 05 2019 at 15:12):

An XY problem?

Reid Barton (Jun 05 2019 at 15:12):

It would be easy on the inductive family version of vector (like https://github.com/idris-lang/Idris-dev/blob/master/libs/base/Data/Vect.idr#L11 )--I forget whether this is also in mathlib. The "subtype of list" definition seems a bit more inconvenient here

Mario Carneiro (Jun 05 2019 at 15:13):

the subtype of list definition is very rarely the convenient one

Koundinya Vajjha (Jun 05 2019 at 15:13):

I just want to define the product measure and pass a vector of sets and not have it complain that it's not the right type.

Mario Carneiro (Jun 05 2019 at 15:13):

what do you want to actually say?

Koundinya Vajjha (Jun 05 2019 at 15:14):

I want to prove that the n-fold product measure has it's defining property.

Mario Carneiro (Jun 05 2019 at 15:14):

if you are giving something of the wrong type then "making it not complain" is the wrong way to approach the problem

Mario Carneiro (Jun 05 2019 at 15:21):

Given s : ∀ i, set (A i), the set of elements of ∀ i:I, A i in the s's is Prod s : set (∀ i, A i) := { f | ∀ i, f i ∈ s i }

Koundinya Vajjha (Jun 05 2019 at 15:27):

Here is what I am working with:

def collapse_in (S: set α) {n: } (Es: set (vector α n)): set (vector α (n+1)) :=
    set.sUnion (set.image (λ x: α, set.image (λ v: _, vector.cons x v) Es) S)

def collapse: Π n, vector (set α) n  set (vector α n)
| 0 _ := 
| (nat.succ n) v := collapse_in (vector.head v) n (collapse n (vector.tail v))

Reid Barton (Jun 05 2019 at 15:29):

Do you already have the product of two measure spaces?

Koundinya Vajjha (Jun 05 2019 at 15:31):

Yes, most of the definitions for the product construction were available in mathlib

Simon Hudon (Jun 05 2019 at 18:01):

I'm pretty sure I wrote traversable instance for vector and array

Simon Hudon (Jun 05 2019 at 18:02):

traversable (flip vector n) to be exact

Simon Hudon (Jun 05 2019 at 18:02):

Just import data.vector2

Koundinya Vajjha (Jun 05 2019 at 18:35):

@Simon Hudon thank you! Can you please tell me how I can use this? I have a bunch of lemmas proven for binary cartesian products. Can I use this to extend to n tuples (vectors)?

Simon Hudon (Jun 05 2019 at 18:37):

Probably. It depends on the lemmas. What do you have in mind?

Koundinya Vajjha (Jun 05 2019 at 18:43):

At the most basic level, given a set (A : set α) and (B : set (vector α n)) I want to construct A.prod B which lives in set(vector α (succ n)).

Simon Hudon (Jun 05 2019 at 18:46):

yes, that works. You can work by induction on n

Simon Hudon (Jun 05 2019 at 18:53):

Proving this lemma might make things more straightforward:

lemma traverse_cons {n α β F} [applicative F] (f : α  F β) (v : α) (vs : flip vector n α) :
  (traverse f (vector.cons v vs) : F (flip vector _ β)) = vector.cons <$> f v <*> traverse f vs := sorry

Last updated: Dec 20 2023 at 11:08 UTC