Zulip Chat Archive
Stream: Is there code for X?
Topic: A way to make a non-Prop structure Prop
Emilie (Shad Amethyst) (Jan 18 2024 at 22:05):
In the proof of Rubin's theorem, I have this awkward structure, where IsAlgebraicallyDisjoint f g
means ∀ h, ¬Commute f h → BigThing g h
and where BigThing
translates to "there exists a pair i₁, i₂
such that i₁
, i₂
and ⁅i₁, ⁅i₂, h⁆⁆
commute with g
and ⁅i₁, ⁅i₂, h⁆⁆ ≠ 1
".
Obviously I can't just have one big equation with everything, but at the same time I can't see an easy way to split this relationship into multiples parts.
The "cleanest" solution I had found so far was to create a separate structure for BigThing
, which stores i₁
, i₂
and their properties.
My issue is that BigThing
is then not a Prop (it contains data), and so IsAlgebraicallyDisjoint f g
isn't a Prop either, so I can't use it in Iff
relationships, for instance. I know I'll never need to compute what's in this pair i₁, i₂
.
Is there a clean way to make IsAlgebraicallyDisjoint
a Prop? Right now the best I can come up with is to have ∃ _ : BigThing g h, True
Anatole Dedecker (Jan 18 2024 at 22:08):
The typical way would be to use docs#Nonempty. Internally it would be exactly the same trick, but it has a nicer API
Yury G. Kudryashov (Jan 18 2024 at 22:54):
Another way is to create a Prop
-values IsBigThing g h i₁ i₂
and use ∀ h, ¬Commute f h → ∃ i₁ i₂, IsBigThing g h i₁ i₂
. The choice between 2 approaches depends on how you want to deal with API about BigThing
do you want it to contain data or pass i₁, i₂
as implicit arguments around?
Yury G. Kudryashov (Jan 18 2024 at 22:58):
E.g., if you're going to prove something assuming (h : IsBigThing g h i₁ i₂) (h' : IsBigThing g h i₂ i₃)
, then it looks much better like this, not like (a b : BigThing g h) (hab : a.i2 = b.i1)
.
Emilie (Shad Amethyst) (Jan 18 2024 at 23:24):
I don't need to know about the contents of BigThing
outside of any proof, really
Joachim Breitner (Jan 19 2024 at 11:58):
Could you use an imductive
with a single constructor rather than a structure? Then you can let it live in Prop
.
Kyle Miller (Jan 19 2024 at 12:01):
Do you mean something different from using structure A : Prop where ...
syntax? That's a Prop-valued structure.
Kyle Miller (Jan 19 2024 at 12:01):
Oh right, I forgot that this isn't allowed if the fields aren't themselves Props
Joachim Breitner (Jan 19 2024 at 12:24):
Right, that’s what I tried and found too. But
inductive BigThing : Prop where
| mk : ∀ i1 i2, … -> BigThing
does work and at least gives you pattern-matching syntax. Although not much is gained over
def BigThing := ∃ i1 i2, (… \and …)
I guess.
Emilie (Shad Amethyst) (Jan 19 2024 at 17:34):
Nonempty
is exactly defined as a forgetful inductive type :)
Last updated: May 02 2025 at 03:31 UTC