Zulip Chat Archive

Stream: new members

Topic: destructuring existentials in proofs


Jacob Weightman (Feb 14 2025 at 06:45):

I'm working on a formalization of a string rewriting system, and some of the literature on the topic uses this "strong" notion of divergence — intuitively, string rewriting diverges on a string A if for any string length n, there is a "point of no return" i such that for any subsequent step the length is greater than n. That is, after i steps, we never get a short string.

def diverges (A : List α) : Prop :=
  n : , i : , j > i, (T.next^[j] A).length > n

I'd like to prove that this "seemingly weaker" notion of divergence is equivalent — intuitively, if string rewriting diverges on A, then we always eventually get a longer string.

def diverges' (A : List α) : Prop :=
  i : , j : , j > i  (T.next^[j] A).length > (T.next^[i] A).length

The T.diverges A → T.diverges' A part of the proof is easy, I have that formalized already. Formalizing the other direction is a bit trickier. I'm able to get up to this point with contraposition:

α : Type u
inst : Inhabited α
T : TagSystem α
A : List α
n : 
h :  (i : ),  j, i < j  (next^[j] A).length  n
  i,  (j : ), i < j  (next^[j] A).length  (next^[i] A).length

Now the rest of the argument I'd like to make goes something like this: starting with h 0, there is a jthat gives us a string shorter than n. Proceed with h j to obtain another such j, and by repeating we can find infinitely many such js. However, there are less than #α^(n+1) strings shorter than n, so at that point we must have repeated a string which means we have either halted or gotten stuck in a loop. Let i be the last j if it halted, or look forward and find the largest string in that loop. All j > i have length less than or equal to n by construction.

The part of this that has me stumped is "by repeating we can find infinitely many such js." In the context of a proof, I can "extract" the value of an existential with e.g. let ⟨j, _⟩ := h 0, but I cannot do this in the context of a function because of proof irrelevance. How can I do this style of iteration in my proof?

suhr (Feb 14 2025 at 07:31):

You can try using this functions:

Classical.choose.{u} {α : Sort u} {p : α  Prop} (h :  x, p x) : α
Classical.choose_spec.{u} {α : Sort u} {p : α  Prop} (h :  x, p x) : p (Classical.choose h)

Kyle Miller (Feb 14 2025 at 17:03):

There's a tactic choose j h' using h that will create a j function from h with a fixed set of cohices.

Jacob Weightman (Feb 15 2025 at 04:44):

the choose tactic was exactly what I was looking for, but I learned something useful from both of these answers. Thanks :blush:


Last updated: May 02 2025 at 03:31 UTC