Agda 如何证明正有理数上的减半函数总是存在的? 使用打开导入数据.Nat(ℕ;suc;零) 打开导入数据.Rational 打开导入数据。产品 打开导入关系。空值 使用(Bool;false;true)打开导入数据.Bool 减半:ℕ → ℚ 减半0=1ℚ 减半(suc p)=½*减半p ∃-减半:∀ {a b}→ 0ℚ < A.→ aq。(证明:使用有理数上的排序定义和一点代数。)

Agda 如何证明正有理数上的减半函数总是存在的? 使用打开导入数据.Nat(ℕ;suc;零) 打开导入数据.Rational 打开导入数据。产品 打开导入关系。空值 使用(Bool;false;true)打开导入数据.Bool 减半:ℕ → ℚ 减半0=1ℚ 减半(suc p)=½*减半p ∃-减半:∀ {a b}→ 0ℚ < A.→ aq。(证明:使用有理数上的排序定义和一点代数。),agda,rational-number,Agda,Rational Number,当你陷入这样一个引理时,一个好的一般原则是暂时忘记Agda及其技术细节。你将如何在普通的人类可读的数学散文中以尽可能简单的方式证明它 您的“迭代减半”函数正在计算b/(2^p)。所以你们试图证明:对于任何正理性a,b,有一些自然的p,使得b/(2^p)b/a。你可以分为两个步骤:找到一些天然n≥ b/a,然后找到一些p,使得2^p>n 如评论中所述,找到此类数字的自然方法是实现天花板功能和log_2功能。但正如你所说,这将是相当多的工作,你不需要他们在这里;你只需要这些数字的存在。因此,您可以分

当你陷入这样一个引理时,一个好的一般原则是暂时忘记Agda及其技术细节。你将如何在普通的人类可读的数学散文中以尽可能简单的方式证明它

您的“迭代减半”函数正在计算b/(2^p)。所以你们试图证明:对于任何正理性a,b,有一些自然的p,使得b/(2^p)b/a。你可以分为两个步骤:找到一些天然n≥ b/a,然后找到一些p,使得2^p>n

如评论中所述,找到此类数字的自然方法是实现天花板功能和log_2功能。但正如你所说,这将是相当多的工作,你不需要他们在这里;你只需要这些数字的存在。因此,您可以分三步进行上述证明,每一步都是基本的,足以进行独立的Agda证明,只需要非常基本的代数事实作为背景:

  • 引理1:对于任何有理q,都有一些自然的n>q。(证明:使用有理数上的排序定义和一点代数。)

  • 引理2:对于任何自然n,都有一些自然p,使得2^p>n。(证明:例如p:=(n+1);通过对n的归纳证明2^(n+1)>n。)

  • 引理3:这些加在一起意味着你想要的减半定理。(证明:一点有理数代数,表明b/(2^p)b/a,并表明迭代的减半函数得到b/2^p。)


您的示例是独立的吗?我只是复制粘贴了它,它没有打字检查。还有,你想用“halve”实现什么,因为我觉得你计算的
1/2^n
与函数名不匹配。它失败是因为它没有通过终止检查还是因为其他原因?如您所述,
halve
函数用于计算
1/2^n
。可以把它看作是迭代的减半。你试图解出1/2^n*blog₂。如果我这样做,毫无疑问我会遇到
log的终止问题₂。因为我研究的是理性而不是实数,
log₂
必须将精度作为参数(类似于),我将一直试图证明
n
有效。
open import Data.Nat using (ℕ;suc;zero)
open import Data.Rational
open import Data.Product
open import Relation.Nullary
open import Data.Bool using (Bool;false;true)

halve : ℕ → ℚ
halve zero = 1ℚ
halve (suc p) = ½ * halve p

∃-halve : ∀ {a b} → 0ℚ < a → a < b → ∃[ p ] (halve p * b < a)
∃-halve {a} {b} 0<a a<b = h 1 where
  h : ℕ → ∃[ p ] (halve p * b < a)
  h p with halve p * b <? a
  h p | .true because ofʸ b'<a = p , b'<a
  h p | .false because ofⁿ ¬b'<a = h (suc p)