Zulip Chat Archive
Stream: new members
Topic: What does it mean for a structure/class to be of type Prop?
Kevin Cheung (Oct 29 2024 at 19:29):
The definition for LawfulFunctor
is class LawfulFunctor (f : Type u → Type v) [Functor f] : Prop
. In both Theorem Proving in Lean 4 and Functional Programming in Lean, I haven't seen a class declaration with a : Prop
. Trying to understand what this could mean, I cooked up the following:
structure Stuff : Prop where
addProp : 1 + 1 = 2
mulProp : 2 * 3 = 6
#check Stuff -- Stuff : Prop
structure Stuff' where
addProp : 1 + 1 = 2
mulProp : 2 * 3 = 6
#check Stuff' -- Stuff' : Type
def someStuff : Stuff := Stuff.mk rfl rfl
def someStuff' : Stuff' := Stuff'.mk rfl rfl
#check someStuff -- someStuff : Stuff
#check someStuff' -- someStuff' : Stuff'
From the info I gathered, I couldn't really figure out when one would want to define a structure or a class to be a Prop
. Insights or pointers greatly appreciated.
Kyle Miller (Oct 29 2024 at 19:31):
If each field is a proof, then the structure
is essentially a conjunction, and generally you want it to be a Prop
. In the next release of Lean, this will be the default.
Kevin Cheung (Oct 29 2024 at 19:32):
So in the next release, Stuff'
will be automatically a Prop
?
Kyle Miller (Oct 29 2024 at 19:33):
Yes
Kyle Miller (Oct 29 2024 at 19:33):
Here's what it means that it's a Prop
:
theorem Stuff_iff : Stuff ↔ 1 + 1 = 2 ∧ 2 * 3 = 6 := by
constructor <;>
· rintro ⟨ha, hm⟩
exact ⟨ha, hm⟩
Kyle Miller (Oct 29 2024 at 19:34):
It "is" a conjunction, and you can use it wherever the conjunction would appear. It's nicer than a conjunction since each field has a nice name.
Kyle Miller (Oct 29 2024 at 19:34):
With Stuff'
, you can only use it as a proposition if you write something like Nonempty Stuff'
Kevin Cheung (Oct 29 2024 at 19:34):
Now I am a bit confused. What is someStuff
then?
Kevin Cheung (Oct 29 2024 at 19:35):
someStuff
is of type Stuff
, but it itself is not a Prop
.
Kyle Miller (Oct 29 2024 at 19:35):
someStuff
is a proof of Stuff
Kevin Cheung (Oct 29 2024 at 19:35):
Does that mean someStuff
is a proof of Stuff
?
Kevin Cheung (Oct 29 2024 at 19:35):
Ok. Thanks.
Kyle Miller (Oct 29 2024 at 19:36):
By the way, since it's useful to be able to break up these named conjunctions inside proofs, mathlib has a @[mk_iff]
attribute to automatically generate the iff
theorem:
@[mk_iff]
structure Stuff : Prop where
addProp : 1 + 1 = 2
mulProp : 2 * 3 = 6
#check stuff_iff
/-
stuff_iff : Stuff ↔ 1 + 1 = 2 ∧ 2 * 3 = 6
-/
Kevin Cheung (Oct 29 2024 at 19:37):
Wow. This looks like something that needs to be added to the books.
Kyle Miller (Oct 29 2024 at 19:37):
I sort of wonder if Lean should automatically generate this theorem without being asked to
Kevin Cheung (Oct 29 2024 at 19:38):
I should write a blog article about this so I don't forget. Thank you very much for the help.
Alex Mobius (Oct 29 2024 at 20:39):
What's the benefit of generating the And theorem? Things like simp
won't attempt to destructure it otherwise?
Kyle Miller (Oct 29 2024 at 20:42):
Yes, exactly. In particular, simp
has no way of destructuring structures without such a theorem. If simp
had this feature, it would need to contain an implementation of @[mk_iff]
.
Last updated: May 02 2025 at 03:31 UTC