替换 Isabelle 中的 lambda 表达式

Substituting for the lambda expression in Isabelle

给定函数 f:

definition f :: "real => real"
where "f x = x"

我可以通过以下引理证明当 n 趋于 0 时,f(x+n) 趋于 f(x)

lemma "(λn. f(x+n)) -- 0 --> f x"
unfolding f_def
apply (auto intro!: tendsto_eq_intros)
done

作为下一步,我想证明当 (y-x) 趋于 0 时,f(x + (y-x)) 趋于 f(x)。本质上,让 n=y-x.

我无法解决这个问题,因为我无法替代 lambda 运算符,甚至无法让 n=y-x。

我该如何解决这个问题?

收敛总是需要一个函数来识别发生了什么变化。但是,语句“(y - x) 趋向于 0”并没有使变化的部分明确。哪些变量发生变化?如果x固定不变,y变化,那么可以表示为(%y. x - y),如果xy都变化,则为%(x, y). x - y.

一旦解决了这个问题,您就可以使用组合定理LIM_compose_eventually 来求极限了。但是请注意,-- _ --> 在内部使用的过滤器 at 不会评估目标点本身的函数。例如,(%n. f (x + n)) -- 0 --> f x 成立,而且 (%n. if n = 0 then 10000 else f (x + n)) -- 0 --> f x 成立。所以,如果函数%y. x - y在一个邻域内等于0,那么这个定理就不成立了。那样的话,你应该可以直接证明你的结果了。

你可以证明

"(λ(x,y).x-y) -- 0 --> (0::real)"

重写为:

"(λx.fst x - snd x) -- (0, 0) --> (0::real)"

那么 tendsto_eq_intros 应该可以工作。

简答

  • 永远陷入低级的东西中,我忘记了我所有的微积分,但我这样做了。
  • 我求助于 epsilon-delta 定义来尝试检查自己 (wiki epsilon-delta limit)
  • 我要求我只取 1-变量函数的极限。

您从极限的 h 形式delta-x 形式 开始。我在这里用我的非正式极限符号将它翻译成我认为 HOL 符号的意思:

 F1: limit[h -> 0]f(x + h) = f(x)

h = y - x。所以现在,定义了 delta-x。通过简单的替换,我得到这个:

F2: limit[(y - x) -> 0]f(x + (y - x)) = f(x)

为了理解它,我这样说:

for a fixed value of x, y varies to x, and so |y - x| goes to zero, with a limit of f(x).

在长答案中,我用 epsilon-delta 定义展开 F2 以检查极限公式是否有效。

将所有内容转换为 HOL,并使用非缩写符号,我得到:

lemma "(((λy x. f(x + (y - x))) x) ---> f x) (at (0::real))"
  apply(simp add: f_def )
  by(metis tendsto_const)

您可以查看我的长回答中的详细信息和评论,看看我是否正确。有注释的公式f(x + (y - x)) = f(y).

长答案

我在底部包含了一个完整的理论,但先详细说明一下。

正如 A. Lochbihler 提到的那样,我认为出发点是确定我们正在研究什么 space。它是 1 变量微积分还是 2 变量微积分?

你的函数f是1-变量的,所以我把它作为一个硬性要求。这意味着我会尽最大努力不求助于 2 变量函数的极限。

我认为问题主要在于将标准极限表示法与 HOL 极限表示法相匹配。

我切换到非缩写的 HOL 表示法以获得限制:(f ---> L) (at a)。这是我自己的,来自 Topological_Spaces.thy#l1868:

(*abbreviation
  LIM :: "('a::topological_space ⇒ 'b::topological_space) ⇒ 'a ⇒ 'b ⇒ bool"
        ("((_)/ -- (_)/ --> (_))" [60, 0, 60] 60) where
  "f -- a --> L ≡ (f ---> L) (at a)" *)

在这里,我现在给出两种不同形式的极限,使用我自己的符号:

F0: limit[x -> c]f(x) = f(c)

F1: limit[h -> 0]f(x + h) = f(x)

我通过简单代入得到了第三种形式,如上图:

F2: limit[(y - x) -> 0]f(x + (y - x)) = f(x)

理论底部有两种F2的HOL形式,它们是:

lemma "(((λy x. f(x + (y - x))) x) ---> f x) (at (0::real))"
  apply(simp add: f_def )
  by(metis tendsto_const)

lemma
  fixes g :: "real => real => real"
  assumes "g = (λy x. f(x + (y - x)))"
  shows "((g x) ---> f x) (at (0::real))"
    apply(simp add: f_def assms)
  by(metis tendsto_const)

这里是从Notepad++复制过来的理论,所以都是ASCII字符。

theory i150128a_limits
imports Complex_Main begin
(*abbreviation
  LIM :: "('a::topological_space => 'b::topological_space) => 'a => 'b => bool"
        ("((_)/ -- (_)/ --> (_))" [60, 0, 60] 60) where
  "f -- a --> L \<equiv> (f ---> L) (at a)" *)
  
--{*| F0: limit[x -> c]f(x) = f(c) |*}
    (*Constant c is fixed, and x will vary to c, so (x - c) or (c - x) goes 
      to 0.*)
      
--{*| F1: limit[h -> 0]f(x + h) = f(x) |*}
    (*For a fixed value of variable 'x', 'h' will vary to 0, so 
      '(x + h)' will go to x.
     Limit definition for this limit:     
     ALL e > 0. EX d > 0. if 0 < |h - 0| < d then |f(x + h) - f(x)| < e. 
     So, if 'f x = x', then 0 < |h| < d --> |x + h - x| = |h| < e. Let d = e.*)
  
--{*| HAVE: f definition |*}
  definition "f x = (x::real)"
      
--{*| HAVE: The lemma formula. It appears to match up with F1 above. For a
      fixed value of variable 'x', the bound variable 'h' in  formula 
      '(\<lambda>h. f(x + h))' will vary to 0. |*}
      
  term "((\<lambda>h. f(x + h)) ---> f x) (at (0::real))"
  
--{*| LET: h = y - x.                              |*}
--{*| By substitution in F1:                       |*}
--{*| F2: limit[(y - x) -> 0]f(x + (y - x)) = f(x) |*}
    (*Similar to F1, for a fixed x, y goes to x, so (x - y) and (y - x) will 
      go to zero.*)     
        
    (* ALL e > 0. EX d > 0. 
         if 0 < |(y - x) - 0| < d then |f(x + (y - x)) - f(x)| < e. 
       If 'f x = x' then if 0 < |y - x| < d 
         then |x + (y - x) - x| = |y - x| < e. Again, let d = e. *)

--{*| In the next lemma, 'g = ((\<lambda>y x. f(x + (y - x))) x)' is a  
      1-variablefunction in which 'y' varies to 'x', as in F2 above.  
      There is'x' in the 'shows' formula, which is a free variable. Though
       it is a variable, for a fixed 'x', the 'x' in 'g' is the same 'x' as 
       in 'f x'.|*}    
  lemma
    fixes g :: "real => real => real"
    assumes "g = (\<lambda>y x. f(x + (y - x)))"
    shows "((g x) ---> f x) (at (0::real))"
      apply(simp add: f_def assms)
    by(metis tendsto_const)

--{*| The consolidated form. |*}
  lemma "(((\<lambda>y x. f(x + (y - x))) x) ---> f x) (at (0::real))"
    apply(simp add: f_def )
    by(metis tendsto_const)
    
end

更新我的另一个答案:我的 HOL 公式是错误的

我不解释为什么我这样操作,但是我无法编辑其他答案,而且HOL公式是错误的。纠正这样的事情最终会导致混乱,所以我会尽量远离这一切。

我的更正最终变得过长,这可能会被视为制造了更多的混乱。如果我的 2 个答案被删除,我真的不在乎。我只是尝试以多种方式纠正自己。早些时候,我提交了对第一个答案的编辑。如果它通过了,事情会变得更加混乱。

关于错误的简短回答是,在 lambda 演算函数中,我有一个 y x 我应该放一个 x y,这不允许 lemma待证。一个教训是,一个人无法证明任何不真实的东西(假设 HOL 的一致性),但一个人可以证明一些无意义的东西,我已经知道,已经证明了许多无意义的东西。

更正,是这样的:

--{*| The consolidated form CORRECTED AND BOGUS. |*}
  lemma "(((%x y. f(x + (y - x))) x) ---> f x) (at (0::real))"
    apply(simp add: f_def )
  (*GOAL: (%y::real. y) -- 0::real --> x*)
  oops

我以前试图调查 h 作为 delta x

在我看来,问题的基础是试图在标准极限公式中明确 h 的含义。

我认为这是一个合法的练习。不同的极限公式是等价的是显而易见的,但是,对于特定的人来说,不知道如何在 HOL 中形式化这些琐碎的事情会使事情变得不平凡,最终结果甚至可能是 "this is a trivial problem, why isn't it's formalization trivial?"

h form 转化为 x - c 形式,未能在 HOL form

中得到全部

在我看来,这主要与两个问题有关:

  • 在标准极限公式的使用中,他们定义了类似h = x - c的东西,其中c是一个常数,但是
    • 在我的搜索中,我找不到任何地方有人明确用 x - c 代替 h
    • 所以我无法权威地检查自己的替换是否遵循标准的符号约定,
    • 而且我没有时间去翻阅真正的分析书籍来确保我对所涉及的任何和所有符号都有准确的理解。
  • 此外,1-变量微积分的标准极限符号需要转换为 HOL 极限函数,但是
    • 我不知道该怎么做。我通常喜欢在 健康的偏执狂 下操作,但在这里,我最终需要一个了解 HOL,但又对微积分和真实分析记忆犹新的人。

进入正题(混淆点第 1 部分)

我不知道 OP 到底是什么,在想什么,但我以 1 变量连续函数的极限为起点,因为他的 f 等价于 id.在这里,我使用我的非正式符号:

F0: limit[x -> c]f(x) = f(c).

在我的第一个问题中,我说了类似 "for a fixed x, y varies to x" 的内容。然而,这是 1 变量微积分,所以只有一件事是变化的,那就是 x。公式中,c为常数。有 健康的偏执狂 ,现在,我正在寻找我的私人数学家说,"Yes, of course. That's trivial." 如果我第一次感到部分困惑,那说明了什么?可能又是似曾相识。

我想用 delta x 来思考,所以我让 h = x - c,然后用 F1 替换 F0 :

F1: limit[h -> 0]f(c + h) = f(c).

我一点都不喜欢这个。 h 的使用通常在衍生品之前不会发挥作用。我的回答越来越长,因为我不得不说 "I see stuff similar to this calculus books, but I want to find where it's completely formalized. I looked in Apostol's real analysis book at the limits and derivatives sections, and I didn't see any sloppy use of h, but then I didn't see any use of h for the short time I looked, and I don't have time to keep looking."

无论如何,我想明确说明 h 是什么,所以我明白了:

  F2: limit[(x - c) -> 0]f(c + (x - c)) = f(c).
= F3: limit[(x - c) -> 0]f(x) = f(c). 

基于 Stewart 教科书的 "typical calculus book",作者将阐明什么是 h,这是 Stewart 在使用 h -> 0 的限制下所做的一点:

Notice that as x approaches c [actually, 'a' in the book], h approaches 0 (because h = x - c) and so the expressions for the slope... [Stewart, 6th, page 145]

形式化都在他括号中的短语“(因为h = x - c)”中,这根本就不是形式化。但是,他的书并不意味着是一本关于实分析的完全正式的书,尽管它在很大程度上是严谨的。

重点是什么? (终于到了最后的混淆点)

有点两难,h的目的是为了强调f(c + h),即h会变成0。但是如果你做代入,那么你最终仅 f(x),如 F3。替换后,f 中没有变量变为 0。我们回到 x 变为 c,就像我的起点 F0.

最后,考虑这个 HOL 引理:

lemma 
    "((%x. f(c + (x - c))) ---> f c) (at (0::real))"
  apply(simp add: f_def )
(*GOAL: (%x::real. x) -- 0::real --> c*)
  oops

那不是我需要的,但它代表了我的需要。我需要一个固定常数 c。单独的 0 是不好的,因为这基本上是说 x 将变为 0。我需要的是说 x - c 将变为 0。

我不知道如何解决这一切。

其中涉及一些微不足道的简化,例如 f(c + (x - c)) = f(x),但对我来说正确答案不是,"Well, it' trivially equal, can't you see that?" 我认为是,但我也可能犯最微不足道的错误。