Zulip Chat Archive
Stream: new members
Topic: application at variables
Horatiu Cheval (Feb 26 2021 at 13:58):
How can I apply terms to variables in defs (or create variables defined respectively to other variables, so to say), in the following sense?
-- I have a general definition like this
def seq : ∀ {α : Type} (a : α), ℕ → α := sorry
-- then I declare variables for some of its arguments
variables {X : Type} (a₀ : X)
-- now I want to consider seq partially applied at a₀,
-- so that I get something of type `ℕ → α`
def x := seq a₀
#check x
-- but it still has type ?M_1 → ℕ → ?M_1
Kevin Buzzard (Feb 26 2021 at 14:09):
That's because a variable is not actually a variable in the sense that it's defined once and for all, for the rest of the file -- a variable is just a trick whereby in your definition of x
Lean thinks "crumbs -- what is a_0? Oh -- I see the user declared it as a variable, so I'll just stick "for all a_0 : X" in that def -- oh crumbs -- what is X? Oh that's a variable too, so I'll just stick "for all {X : Type}" in as well"
Kevin Buzzard (Feb 26 2021 at 14:11):
-- I have a general definition like this
def seq : ∀ {α : Type} (a : α), ℕ → α := sorry
-- then I declare constants for some of its arguments
constants {X : Type} (a₀ : X)
-- now I want to consider seq partially applied at a₀,
-- so that I get something of type `ℕ → α`
noncomputable def x := seq a₀
#check x -- x : ℕ → X
Note that there are no constant
s in mathlib -- you can easily prove false statements if you start throwing constants around. If you actually know what you want a_0 to be, then let it be that, and if you don't, then actually you might want it as a variable in Lean's sense.
Kevin Buzzard (Feb 26 2021 at 14:13):
If you really don't want variables then this is safer than using constants:
-- I have a general definition like this
def seq : ∀ {α : Type} (a : α), ℕ → α := sorry
-- then I declare sorried definitions for some of its arguments
def X : Type := sorry
def a₀ : X := sorry
-- now I want to consider seq partially applied at a₀,
-- so that I get something of type `ℕ → α`
def x := seq a₀
#check x -- x : ℕ → X
This time Lean emits a warning saying that you cheated, so proofs of false are known not to be trusted.
Horatiu Cheval (Feb 26 2021 at 14:20):
Thanks for the insight on how variables work! I knew defining constants is not recommended, plus it doesn't seem to represent the intention. Essentially, I defined some sorts of recursive sequences, having the initial value as argument, and then I wanted to have an initial point and a sequences starting at that point as variables, to reduce verbosity.
def seq : ∀ {α : Type} (a : α), ℕ → α := sorry
variables {X : Type} (a₀ : X)
local notation `x` := seq a₀
#check x
I guess this works best, but reserving the token x
didn't seem the best idea.
Eric Wieser (Feb 26 2021 at 16:58):
parameters {X : Type} {a₀ : X}
may work for you too
Last updated: Dec 20 2023 at 11:08 UTC