If statement ATS证明:如果需要大于或等于,为什么静态?

If statement ATS证明:如果需要大于或等于,为什么静态?,if-statement,theorem-proving,ats,If Statement,Theorem Proving,Ats,我正在写一个a*0=0的证明,我偶然发现了一些奇怪之处。为什么第7行上的sifa>=0需要是=,并且当它只是sif>0时不编译 prfn mul_ax0_0 {a:int} () : MUL(a,0,0) = let prfun auxnat {a:nat} .<a>. () : MUL(a,0,0) = sif a == 0 then MULbas() else MULind(auxnat{a-1}()) in sif a >=

我正在写一个
a*0=0
的证明,我偶然发现了一些奇怪之处。为什么第7行上的
sifa>=0
需要是
=
,并且当它只是
sif>0
时不编译

prfn mul_ax0_0 {a:int} () : MUL(a,0,0) =
let
    prfun auxnat {a:nat} .<a>. () : MUL(a,0,0) =
        sif a == 0 then MULbas()
        else MULind(auxnat{a-1}())
in
    sif a >= 0 then auxnat{a}() // line 7
    else MULneg(auxnat{~a}())
end

implement main0 () = ()
prfn mul_ax0_0{a:int}():mul(a,0,0)=
让
prfun auxnat{a:nat}。。():MUL(a,0,0)=
sif a==0,则MULbas()
else-MULind(auxnat{a-1}())
在里面
如果a>=0,则auxnat{a}()//第7行
else-MULneg(auxnat{~a}())
结束
实现main0()=()
直观地说,
a=0
应该通过任何一条路径都可以很好地处理,但只有第一条路径可以工作。
为什么?

MULneg声明如下:

  | {m:pos}{n:int}{p:int}
    MULneg (~(m), n, ~(p)) of MUL_prop (m, n, p)
请注意,“m”必须为正。在你的例子中,“m”是“~a”。如果 如果使用“>”而不是“>=”,则无法推断“~a>0”适用 当测试“a>0”失败时