【发布时间】:2014-05-07 13:21:28
【问题描述】:
我试图证明,在我看来什么是合理的定理:
theorem1 : (n : Nat) -> (m : Nat) -> (n + (m - n)) = m
归纳证明到了我需要证明这一点的地步:
lemma1 : (n : Nat) -> (n - 0) = n
当我尝试使用交互式证明者来证明它(为了简单起见,引理)时会发生这种情况:
---------- Goal: ----------
{hole0} : (n : Nat) -> minus n 0 = n
> intros
---------- Other goals: ----------
{hole0}
---------- Assumptions: ----------
n : Nat
---------- Goal: ----------
{hole1} : minus n 0 = n
> trivial
Can't unify
n = n
with
minus n 0 = n
Specifically:
Can't unify
n
with
minus n 0
我觉得我一定错过了关于减号的定义,所以我在源代码中查找了它:
||| Subtract natural numbers. If the second number is larger than the first, return 0.
total minus : Nat -> Nat -> Nat
minus Z right = Z
minus left Z = left
minus (S left) (S right) = minus left right
我需要的定义就在那里! minus left Z = left。我的理解是,Idris 应该在这里用m 替换minus m 0,然后这是反身成立的。我错过了什么?
【问题讨论】:
-
Idris 是一种依赖类型的编程语言,由于 Curry-Howard 同构,它使证明和程序成为同义词。我需要在代码中证明这个定理,以便我的函数可以很好地键入(我把函数省略了,因为解释它会占用不必要的空间)。出于这个原因,Idris 附带了一个交互式证明器。所以问题是关于如何使用编程语言 Idris 的问题,而不是关于数学本身的问题。
-
对不起,如果这很明显,不熟悉该语言,但查看该语言的一些示例 - 这远不清楚。
0和Z是否总是被视为同义词,还是需要一些东西才能使其工作? -
数字字面量是多态重载的,就像在 Haskell 中一样。
Nat是Num类的成员,其中一个函数是fromInteger。和fromInteger 0 = Z。 (我认为在语言本身和终端中还有一些 Nat 的特殊外壳。)简而言之,我认为这不是问题,尽管我还不能完全确定。 -
顺便说一句:我不认为这是可以证明的。当然,这在数学上是有道理的,但减号在 Naturals 上的总体定义并不明确。一个失败的情况:如果 m 为零,并且 n 不为零 - 零减去任何东西都被定义为零。这样一来,您就只能尝试证明 (S k) + 0 = 0。也许我们需要更好地定义对 Nats 的“减”运算,否则请停止尝试将它们用于数学证明。