ATS 证明:如果需要大于或等于,为什么这个是静态的?
ATS Proof: Why does this static if need greater than or equal to?
我正在写 a*0=0
的证明,我偶然发现了一些奇怪的东西。为什么第 7 行的 sif a >= 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 () = ()
直觉上,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' 失败时。
我正在写 a*0=0
的证明,我偶然发现了一些奇怪的东西。为什么第 7 行的 sif a >= 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 () = ()
直觉上,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' 失败时。