Math 用RHS作为函数定义的Idris证明

Math 用RHS作为函数定义的Idris证明,math,proof,idris,Math,Proof,Idris,我试图通过证明计算三角形数的计算方法与它们的闭合形式的等价性来了解一些简单的证明。到目前为止,我所能做到的就是: total tn_eval : (n : Nat) -> Nat tn_eval Z = Z tn_eval (S k) = (S k) + tn_eval k total tn_closed : (n: Nat) -> Nat tn_closed Z = Z tn_closed (S k) = div ((S k) * ((S k) - 1)) 2 total

我试图通过证明计算三角形数的计算方法与它们的闭合形式的等价性来了解一些简单的证明。到目前为止,我所能做到的就是:

total 
tn_eval : (n : Nat) -> Nat
tn_eval Z = Z
tn_eval (S k)  = (S k) + tn_eval k

total 
tn_closed : (n: Nat) -> Nat
tn_closed Z = Z
tn_closed (S k) = div ((S k) * ((S k) - 1)) 2

total 
tn_closed_proof : (n : Nat) -> (tn_closed n) = (tn_eval n)
tn_closed_proof Z = ?strange_hole
tn_closed_proof (S k) = ?more_difficult_hole
然而,我一直在思考
“奇怪的洞”
的可能定义应该是什么。检查该类型将给出:

Idris: Type of strange_hole
--------------------------------------
strange_hole : tn_closed 0 = 0
这(据我所知)是
tn_closed Z
的字面定义,因此,这应该可以用
Refl
证明,因为
tn_closed 0
在定义上等同于
0

但是,这是不对的,因为当我尝试此操作时,会出现一个类型错误:

When checking right hand side of tn_closed_proof with expected type
        tn_closed 0 = tn_eval 0

Type mismatch between
        0 = 0 (Type of Refl)
and
        tn_closed 0 = 0 (Expected type)

Specifically:
        Type mismatch between
                0
        and
                tn_closed 0
连同全食警告:

Arith.tn_closed is possibly not total due to: Prelude.Nat.Nat implementation of Prelude.Interfaces.Integral

我觉得后者可能是前者的原因,但除此之外,我完全被卡住了!据我所知,
tn_closed 0
0
在定义上是等价的,因此任何需要
tn_closed 0=0
的证明都应该是微不足道的,或者可以用
Refl
证明,但似乎我错了

我一问这个问题,就设法解决了

据我所知,问题在于
tn_closed
的定义,具体而言:

tn_closed (S k) = div ((S k) * ((S k) - 1)) 2
这一定义意味着伊德里斯(出于某种原因)不理解该部门是完全的。将此定义替换为以下内容:

tn_closed (S k) = divNatNZ ((S k) * ((S k) - 1)) 2 SIsNotZ
给出了一个更容易接近的洞:

Idris: Type of hole
--------------------------------------
hole : 0 = 0

这是相当简单的解决与Refl

整数Nat使用divNat作为其实现,而divNat不是total,因为它只为大于零的除数定义。因此,根据定义,tn_closed不是total,您已经收到了警告。Idris不进行推理,例如,它不会为您计算2大于0,如果您需要,您使用divNatNZ是正确的,它要求您证明2不是0。