Zulip Chat Archive
Stream: new members
Topic: I'm missing something basic about construction in theorems
Matt Pillsbury (Dec 04 2022 at 00:57):
I tripped over an error message as I've been working my way through the exercises in *Theorem Proving in Lean 4*. This simple attempt at a proof...
variable (α : Type) (p q : α → Prop)
example : (∀ x, p x) ∧ (∀ x, q x) → (∀ x, p x ∧ q x) :=
(fun ⟨hp, hq⟩ =>
fun x => (hp x) ∧ (hq x))
...gives me this error message that I'm very puzzled by:
application type mismatch
And (_ : p x)
argument
hp x
has type p x : Prop
but is expected to have type Prop : Type
However, this seemingly equivalent approach works:
#check And.intro -- And.intro : ?m.21 → ?m.22 → ?m.21 ∧ ?m.22
example : (∀ x, p x) ∧ (∀ x, q x) → (∀ x, p x ∧ q x) :=
(fun ⟨hp, hq⟩ =>
fun x => And.intro (hp x) (hq x))
Where is the difference in the two proofs that breaks the first one?
Kevin Buzzard (Dec 04 2022 at 01:00):
And.intro
makes the term. (hp x) ∧ (hq x)
is the type. You can't prove a theorem by stating the theorem.
Kevin Buzzard (Dec 04 2022 at 01:02):
In fact (hp x) ∧ (hq x)
is just a mess. If P
and Q
have type Prop
then P ∧ Q
has type Prop
and it's the theorem statement. hp x
is a proof, so it has type P
for some P
of type Prop
. You're confusing types and terms.
Kevin Buzzard (Dec 04 2022 at 01:03):
def foo := 2 + 2 = 5
. Do you understand what that means and why it works? I ask because I was confused about this when I was a beginner. Another example is def f := Nat -> Nat
.
Matt Pillsbury (Dec 04 2022 at 01:27):
I think I get it now, especially based on the last bit. I was confusing the type of And.intro
with the term And.intro
.
Thanks!
Last updated: Dec 20 2023 at 11:08 UTC