在精益证明中定义一个函数
Define a function inside of a proof in Lean
在精益中,我们可以这样定义一个函数
def f (n : ℕ) : ℕ := n + 1
然而,在证明中这不再可能。以下代码无效:
theorem exmpl (x : ℕ) : false :=
begin
def f (n : ℕ) : ℕ := n + 1,
end
我假设可以用 have
来代替,但尝试像
theorem exmpl (x : ℕ) : false :=
begin
have f (n : ℕ) : n := n + 1,
have f : ℕ → ℕ := --some definition,
end
对我不起作用。是否可以在精益证明中定义一个函数,您将如何实现?
(在上面的例子中,可以在证明之前定义它,但你也可以想象像f (n : ℕ) : ℕ := n + x
这样的函数,它只能在引入x
之后定义)
在策略证明中,您有 have
and let
新定义的策略。 have
策略会立即忘记除新定义类型之外的所有内容,它通常只用于命题。相比之下,let
策略会记住定义的值。
这些策略没有在冒号左侧包含参数的语法,但您可以使用 lambda 表达式:
theorem exmpl (x : ℕ) : false :=
begin
let f : ℕ → ℕ := λ n, n + 1,
end
(尝试将 let
更改为 have
以查看上下文如何变化。)
另一种方法是在策略证明之外使用 let
表达式。这些表达式在冒号之前确实有参数语法。例如,
theorem exmpl (x : ℕ) : false :=
let f (n : ℕ) : ℕ := n + x
in begin
end
在精益中,我们可以这样定义一个函数
def f (n : ℕ) : ℕ := n + 1
然而,在证明中这不再可能。以下代码无效:
theorem exmpl (x : ℕ) : false :=
begin
def f (n : ℕ) : ℕ := n + 1,
end
我假设可以用 have
来代替,但尝试像
theorem exmpl (x : ℕ) : false :=
begin
have f (n : ℕ) : n := n + 1,
have f : ℕ → ℕ := --some definition,
end
对我不起作用。是否可以在精益证明中定义一个函数,您将如何实现?
(在上面的例子中,可以在证明之前定义它,但你也可以想象像f (n : ℕ) : ℕ := n + x
这样的函数,它只能在引入x
之后定义)
在策略证明中,您有 have
and let
新定义的策略。 have
策略会立即忘记除新定义类型之外的所有内容,它通常只用于命题。相比之下,let
策略会记住定义的值。
这些策略没有在冒号左侧包含参数的语法,但您可以使用 lambda 表达式:
theorem exmpl (x : ℕ) : false :=
begin
let f : ℕ → ℕ := λ n, n + 1,
end
(尝试将 let
更改为 have
以查看上下文如何变化。)
另一种方法是在策略证明之外使用 let
表达式。这些表达式在冒号之前确实有参数语法。例如,
theorem exmpl (x : ℕ) : false :=
let f (n : ℕ) : ℕ := n + x
in begin
end