Zulip Chat Archive
Stream: Is there code for X?
Topic: Uncurrying n-times, but for imp
Robert Maxton (Apr 07 2024 at 08:35):
Is there a version of docs#Function.HasUncurry for implications/functions into Prop
? I'm trying to check if a given theorem has the type ... → TFAE ?l
for an arbitrary number of parameters and some list ?l
; so far the recursive uncurry is the closest existing function I've found, but it only works on functions into Type u
.
Timo Carlin-Burns (Apr 10 2024 at 06:21):
Is this what you want?
import Mathlib.Tactic
class HasUncurry' (α : Sort*) (β : outParam (Sort*)) (γ : outParam (β → Sort*)) where
uncurry : α → (b : β) → γ b
instance hasUncurryBase (α : Sort*) (β : α → Sort*) : HasUncurry' ((a : α) → β a) α β :=
⟨id⟩
instance hasUncurrySubtype (α : Sort*) (β : α → Sort*) (γ : α → Prop) (δ : (a : α) → γ a → Sort*)
[∀ a, HasUncurry' (β a) (γ a) (δ a)] :
HasUncurry' ((a : α) → β a) { a : α // γ a } fun ⟨a, h⟩ => δ a h :=
⟨fun f ⟨a, h⟩ ↦ HasUncurry'.uncurry (f a) h⟩
instance hasUncurrySigma (α : Type*) (β : α → Sort*) (γ : α → Type*) (δ : (a : α) → γ a → Sort*)
[∀ a, HasUncurry' (β a) (γ a) (δ a)] :
HasUncurry' ((a : α) → β a) ((a : α) × γ a) fun ⟨a, g⟩ => δ a g :=
⟨fun f ⟨a, g⟩ ↦ HasUncurry'.uncurry (f a) g⟩
-- An example with TFAE
#check (List.tfae_of_forall)
-- ∀ (b : Prop) (l : List Prop), (∀ a ∈ l, a ↔ b) → List.TFAE l
#synth HasUncurry' (∀ (b : Prop) (l : List Prop), (∀ a ∈ l, a ↔ b) → List.TFAE l) ((b : Prop) × {l : List Prop // (∀ a ∈ l, a ↔ b)}) fun ⟨_, l, _⟩ => List.TFAE l
Robert Maxton (Apr 11 2024 at 02:53):
Timo Carlin-Burns
Ooh, you did it for Sigma
s too! Thanks!
Eric Wieser (Apr 11 2024 at 07:41):
This sounds slightly like an XY problem; are you sure you actually care about doing this within Lean's type theory? Metaprogramming would be easier
Robert Maxton (Apr 11 2024 at 07:42):
I did end up doing that specific thing a different way, but I've already run into a different case where the class/construction would be useful, so I'm still glad to have it :p
Last updated: May 02 2025 at 03:31 UTC