Zulip Chat Archive
Stream: new members
Topic: Difference between constant and axioms
Abhimanyu Pallavi Sudhir (Dec 31 2018 at 06:38):
I just noticed that propext
is defined as a constant:
constant propext {a b : Prop} : (a ↔ b) → a = b
Is this an alternative to axiom
? What would change if I made it an axiom?
Kenny Lau (Dec 31 2018 at 06:41):
nothing at all
Abhimanyu Pallavi Sudhir (Dec 31 2018 at 06:45):
Why are there two different commands then? I would think it may make sense to use axiom
for things whose type has type Prop
and constant
for things whose type has some other type (like a function), but the two examples I've seen are exactly the opposite.
Abhimanyu Pallavi Sudhir (Dec 31 2018 at 06:47):
I.e. choice
defines a function and is an axiom
but propext
defines a (unproven) proof and is a constant
.
Kevin Buzzard (Dec 31 2018 at 09:25):
There's no difference between theorem
and lemma
of course. But for constants and axioms I thought the rule of thumb was that constants were for data and axioms for propositions. As you spotted, this convention does not seem to be being followed here
Kevin Buzzard (Dec 31 2018 at 09:37):
The main difference between data and propositions in Lean is that Lean remembers how you constructed data but throws away your proof of a proposition and just remembers that it's proved. But of course here with constants and axioms this information doesn't exist, so they feel a lot more similar to each other than theorems and definitions do. If you're brave enough to look at Lean's source code and know enough C++ to understand it then you could maybe just check to see what the difference is.
Gabriel Ebner (Dec 31 2018 at 09:41):
Interestingly enough, propext
was an axiom
four years ago: https://github.com/leanprover/lean/blob/0da4f191fc2a37e34d53179d5cf924021de4fd15/library/logic/axioms/propext.lean
But yeah, it doesn't matter that much. In the C++ code, you could tell the difference between axiom and constant, but this is not really used and not exposed to lean either. Another difference is that you can do meta constant
but not meta axiom
.
Abhimanyu Pallavi Sudhir (Dec 31 2018 at 10:22):
By the way, propext
and funext
together prove that all proofs (of a proposition) are equal, don't they? Since propext
shows that f(trivial) = trivial, g(trivial) = trivial
for any two functions f : true \to P
and g : true \to P
. So does that mean type theories in which proofs are distinct lack propext
?
Chris Hughes (Dec 31 2018 at 10:23):
You don't need any axioms to prove that.
Kevin Buzzard (Dec 31 2018 at 10:24):
I think the extra "axiom" is not just that all proofs of P are equal, but that they are definitionally equal.
Chris Hughes (Dec 31 2018 at 10:24):
look at the theorem proof_irrel
.
Abhimanyu Pallavi Sudhir (Dec 31 2018 at 10:25):
Oh. rfl
is just anti-climactic.
Kevin Buzzard (Dec 31 2018 at 10:26):
:-)
Chris Hughes (Dec 31 2018 at 10:26):
But I see actually, even if it wasn't definitional, then propext would imply that anyway.
Chris Hughes (Dec 31 2018 at 10:27):
Because every true Prop
would be equal to true
and true
has only one proof.
Chris Hughes (Dec 31 2018 at 10:29):
Proof relevant type theories tend to lack the type Prop
altogether I think. Proof irrelevance is the only thing distinguishing Prop
and Type
so propositions tend to be defined using Type
and some of them I think have an is_Prop
predicate that says that the type has only one element.
Kevin Buzzard (Dec 31 2018 at 10:29):
My recent thoughts about quot
, and Mario's comments about them (sparked by Chris' observation that I used quot.sound to prove quot'.sound) made all this a bit clearer to me. There is just a whole bunch of stuff which, if you don't have it, would make maths basically impossible to do, and the CS people have made what appears to a mathematician to be a random small set of this stuff into axioms and then deduced all the rest of it. I'm not sure that the fact that propext is an axiom is remotely important.
Abhimanyu Pallavi Sudhir (Dec 31 2018 at 10:36):
Because every true
Prop
would be equal totrue
andtrue
has only one proof.
When I try writing that proof, though, Lean just changes it to eq.refl H1
(when I print it).
Abhimanyu Pallavi Sudhir (Dec 31 2018 at 10:36):
lemma proof_irrel' {a : Prop} (H1 H2 : a) : H1 = H2 := begin have ta : a = true, apply propext, split, { intro, trivial }, { intro, exact H1 }, rw ta at H1 H2, end
Abhimanyu Pallavi Sudhir (Dec 31 2018 at 10:36):
(deleted)
Abhimanyu Pallavi Sudhir (Dec 31 2018 at 10:36):
(deleted)
Abhimanyu Pallavi Sudhir (Dec 31 2018 at 10:36):
Oh wait, I'm using a rewrite so it tries refl.
Abhimanyu Pallavi Sudhir (Dec 31 2018 at 10:38):
Wasn't there a version of rw
that didn't try refl
?
Kenny Lau (Dec 31 2018 at 10:39):
I think you can tweak the settings
Kevin Buzzard (Dec 31 2018 at 10:39):
I completely agree that it's a pain to experiment with stuff using rw
becasue of this refl thing. I think "dunfold" and "delta" unfold functions without trying refl at the end but I don't know about rw.
Chris Hughes (Dec 31 2018 at 10:39):
I'm not sure this proof would actually work. Substitutions using equality of types are far more complicated and subtle than they might appear.
Abhimanyu Pallavi Sudhir (Dec 31 2018 at 10:42):
I'm not sure this proof would actually work. Substitutions using equality of types are far more complicated and subtle than they might appear.
? Surely rewrite works on ↔
, which is equality of types. E.g.
example (P Q : Prop) (HP : P) (HPQ : P = Q) : sorry := by { rw HPQ at HP, sorry }
Chris Hughes (Dec 31 2018 at 10:44):
Actually, it definitely does work.
Chris Hughes (Dec 31 2018 at 10:45):
This is the easiest way.
lemma proof_irrel' {a : Prop} (H1 H2 : a) : H1 = H2 := begin have ta : a = true, apply propext, split, { intro, trivial }, { intro, exact H1 }, revert H1 H2, rw ta, end
Abhimanyu Pallavi Sudhir (Dec 31 2018 at 10:47):
And then use no_confusion
? Hm, true
doesn't have no_confusion.
Chris Hughes (Dec 31 2018 at 10:48):
That's because it's unnecessary. But if there was no proof irrelevance there would be.
Chris Hughes (Dec 31 2018 at 10:49):
Actually, this is what you should do.
lemma proof_irrel' {a : Prop} (H1 H2 : a) : H1 = H2 := begin have ta : a = true, apply propext, split, { intro, trivial }, { intro, exact H1 }, revert H1 H2, rw ta, assume H1 H2, cases H1, cases H2, refl end
Chris Hughes (Dec 31 2018 at 10:49):
no_confusion
is usually good for proving things are not equal.
Abhimanyu Pallavi Sudhir (Dec 31 2018 at 10:51):
Yeah, I got confused (between the uniqueness of the constructors and their exhaustiveness)
Chris Hughes (Dec 31 2018 at 10:51):
To illustrate how complicated proof relevant equality can be, try proving this example
without using eq
anywhere in the proof. (Hint: it's impossible)
inductive eq2 {α : Type*} (a : α) : α → Type | refl : eq2 a example {α : Type*} (a b : α) (h₁ h₂ : eq2 a b) : eq2 h₁ h₂ := sorry
Kenny Lau (Dec 31 2018 at 11:05):
prelude universe u notation `Prop` := Sort 0 structure iff (a b : Prop) : Prop := (mp : a → b) (mpr : b → a) inductive eq {α : Sort u} (a : α) : α → Prop | refl : eq a infix ` ↔ `:20 := iff infix ` = `:50 := eq @[elab_as_eliminator, subst] lemma eq.subst {α : Sort u} {P : α → Prop} {a b : α} (h₁ : a = b) (h₂ : P a) : P b := eq.rec h₂ h₁ infixr ` ▸ `:75 := eq.subst constant propext {a b : Prop} : (a ↔ b) → (a = b) inductive true : Prop | intro : true lemma proof_irrel {a : Prop} (H1 H2 : a) : H1 = H2 := have true = a, from propext ⟨λ _, H1, λ _, true.intro⟩, (this ▸ (λ H1 H2, true.drec_on H1 (true.drec_on H2 (eq.refl true.intro))) : ∀ H1 H2 : a, H1 = H2) H1 H2
Chris Hughes (Dec 31 2018 at 12:43):
What does the subst
attribute do?
Kevin Buzzard (Dec 31 2018 at 14:04):
Where is a complete list of all attributes and their explanations? Oh -- is [subst]
it only used in core? Are users not supposed to use it?
Kenny Lau (Dec 31 2018 at 14:06):
I have no idea, I just copied the code out of the core library
Patrick Massot (Dec 31 2018 at 14:32):
Proof relevant type theories tend to lack the type
Prop
altogether I think. Proof irrelevance is the only thing distinguishingProp
andType
so propositions tend to be defined usingType
and some of them I think have anis_Prop
predicate that says that the type has only one element.
This is not true. Impredicativity is also an important difference. I think Coq has Prop for this reason, and no definitional proof irrelevance
Chris Hughes (Dec 31 2018 at 15:09):
What do you mean precisely by impredicativity?
Kevin Buzzard (Dec 31 2018 at 15:12):
Coq has no definitional proof irrelevance? But does it have proof irrelevance?
Chris Hughes (Dec 31 2018 at 15:17):
I heard once it was an optional extra like propext
. Though I guess that means Prop
would still be special in the sense that any two proofs are not provably unequal.
Mario Carneiro (Dec 31 2018 at 18:26):
right, you have to have this property if impredicativity is to be consistent
Mario Carneiro (Dec 31 2018 at 18:27):
because if a type has two elements, then you can build a cantor's paradox sort of thing using impredicativity
Chris Hughes (Dec 31 2018 at 18:28):
What does impredicativity mean precisely?
Mario Carneiro (Dec 31 2018 at 18:35):
forall x : A, P : Prop
if P : Prop
Mario Carneiro (Dec 31 2018 at 18:35):
even if A : Type
Mario Carneiro (Dec 31 2018 at 18:36):
this means that propositions can quantify over themselves
Kevin Buzzard (Dec 31 2018 at 18:38):
(forall x : A, P) : Prop
is what we're talking about here, presumably. The universe isn't the max, it's the imax.
Mario Carneiro (Dec 31 2018 at 18:39):
in a predicative universe, the pi type has level max of the universe levels of the parts
Mario Carneiro (Dec 31 2018 at 18:39):
but we have this funny imax thing for level 0
Abhimanyu Pallavi Sudhir (Jan 01 2019 at 04:12):
this means that propositions can quantify over themselves
Isn't that just P → P
?
Abhimanyu Pallavi Sudhir (Jan 01 2019 at 04:13):
Even with functions between types, the type of P → Q
is the types of P
and Q
, so I don't understand why this makes Prop
special.
Mario Carneiro (Jan 01 2019 at 04:25):
I mean a function whose domain of quantification includes itself
Mario Carneiro (Jan 01 2019 at 04:30):
which permits self application
def p : ∀ ⦃p : Prop⦄, p → p = p := λ x _, rfl def X := p p
Mario Carneiro (Jan 01 2019 at 04:30):
you can use this to do a variety of diagonalization type arguments
Kenny Lau (Jan 01 2019 at 05:03):
@Abhimanyu Pallavi Sudhir if you quantify over all Type
, you get Type 1
Reid Barton (Jan 01 2019 at 13:36):
A classic example of an impredicative definition of a Prop is defining the subgroup generated by a subset S of a group G to be the intersection of all the subgroups of G which contain S
Reid Barton (Jan 01 2019 at 13:39):
which is to say def belongs_to_subgroup_generated_by (S : set G) (x : G) : Prop := \forall (P : G \to Prop), is_subgroup P \and (\forall y, S y \to P y) \to P x
Reid Barton (Jan 01 2019 at 13:40):
If Prop
had a universe hierarchy like Type
, you wouldn't be allowed to use the same Prop
on both sides of that equation
Chris Hughes (Jan 01 2019 at 13:41):
It hadn't occurred to me how important this was.
Kenny Lau (Jan 01 2019 at 13:47):
of course it hadn't, you guys don't even care about foundations / of course it hadn't, this is hard core logic stuff
Reid Barton (Jan 01 2019 at 13:48):
It's really hard to imagine from a classical perspective how anyone could object to the construction "take all the subsets of G, keep the ones which are subgroups containing S, and form their intersection".
Reid Barton (Jan 01 2019 at 13:48):
Before using Lean, I was not convinced that "impredicative" meant anything at all.
Kenny Lau (Jan 01 2019 at 13:49):
From a "classical perspective", you run into issues like Δ0-predicates are absolute
Kenny Lau (Jan 01 2019 at 13:50):
that somehow P(ω) (i.e. powerset of ω) is not absolute
Kenny Lau (Jan 01 2019 at 13:50):
because taking powerset is not a predicative thing to do
Reid Barton (Jan 01 2019 at 13:52):
Right, well, so the conclusion is that caring about predicativity is not a math thing to do.
Reid Barton (Jan 01 2019 at 13:53):
Especially since this example of an impredicative definition is something that one will encounter in a first course on algebra, it's not some scary thing involving universes or whatever.
Kenny Lau (Jan 01 2019 at 13:53):
mathematicians have gone too far, doing impredicative stuff like that
Kenny Lau (Jan 01 2019 at 13:54):
how are they going to compute their examples if their definitions are impredicative
Kevin Buzzard (Jan 01 2019 at 13:54):
who cares about examples? We want theorems!
Kenny Lau (Jan 01 2019 at 13:55):
what do you want theorems for?
Kevin Buzzard (Jan 01 2019 at 13:55):
fun
Kevin Buzzard (Jan 01 2019 at 13:55):
and promotion
Kenny Lau (Jan 01 2019 at 13:55):
wasn't number theory created to solve diophantine equations
Kevin Buzzard (Jan 01 2019 at 13:55):
yes but now its job is to create theorems explaining what the structure of the solutions is
Kevin Buzzard (Jan 01 2019 at 13:56):
because solving them all turned out to be too hard
Kenny Lau (Jan 01 2019 at 13:56):
but now your impredicative definitions are not helping us to solve the equations, because they are incomputable
Kevin Buzzard (Jan 01 2019 at 13:57):
yes but we don't care about solving them because that's too hard. We now care about whether the solutions lie on some union of simple subvarieties or something. Nobody will get promoted for solving a Diophantine equation.
Kenny Lau (Jan 01 2019 at 13:58):
Can you compute the integers of Q[X]/(X^3-3X+1)?
Kevin Buzzard (Jan 01 2019 at 13:59):
sure, I read an algorithm to do that once
Kenny Lau (Jan 01 2019 at 13:59):
that doesn't mean you can compute it
Kevin Buzzard (Jan 01 2019 at 13:59):
it's in Cohen's book on computational number theory
Kevin Buzzard (Jan 01 2019 at 13:59):
sure it means I can compute it
Kevin Buzzard (Jan 01 2019 at 13:59):
I just ask a PhD student to compute it for me
Kenny Lau (Jan 01 2019 at 13:59):
that isn't you computing it
Kevin Buzzard (Jan 01 2019 at 13:59):
I think you have a lot to learn about the real world
Chris Hughes (Jan 01 2019 at 14:18):
Lean is designed for computer science, so impredicative definitions can't be that useless from a computational perspective. You can't compute with them, but you can still use them to help prove your program does what it's supposed to.
Mario Carneiro (Jan 01 2019 at 15:20):
By the way, HoTT uses predicative universes only (in the usual setup), so if you thought it would be a great thing that solves all your problems then this is one place where it isn't all sunshine and roses
Mario Carneiro (Jan 01 2019 at 15:21):
Also Agda makes a big deal about being 100% predicative
Mario Carneiro (Jan 01 2019 at 15:24):
It's true that in regular math predicativity doesn't really come up, but it shows up in non-absoluteness like Kenny says, or in model theory where adding more ordinals causes new subsets of nat to appear... you have this weird situation where you've built the set but not the elements, and that's where things like Cohen reals come from
Mario Carneiro (Jan 01 2019 at 15:27):
Also, we've discussed impredicative encodings of inductive types before, like xnat : Type := \all X : Type, X -> (X -> X) -> X
, which doesn't typecheck in lean because Type
is predicative
Mario Carneiro (Jan 01 2019 at 15:29):
Or when we have an object that is "defined by a universal property" and we want to just write that property but it doesn't work because the universe quantifier isn't large enough, so instead we re-express it by some kind of construction "from below"... that's predicativity
Last updated: Dec 20 2023 at 11:08 UTC