Dafny参考手册的第11.1.2节提供了极端谓词的这些例子:
inductive predicate g(x: int) { x == 0 || g(x-2) }
copredicate G(x: int) { x == 0 || G(x-2) }
第11.1.3节然后给出了一些关于它们的示例证明:
lemma EvenNat(x: int)
requires g(x)
ensures 0 <= x && x % 2 == 0
{
var k: nat :| g#[k](x); EvenNatAux(k, x);
}
lemma EvenNatAux(k: nat, x: int)
requires g#[k](x)
ensures 0 <= x && x % 2 == 0
{
if x == 0 {
} else {
EvenNatAux(k-1, x-2);
}
}
lemma Always(x: int)
ensures G(x)
{ forall k: nat { AlwaysAux(k, x); } }
lemma AlwaysAux(k: nat, x: int)
ensures G#[k](x)
{ }
这些词条don't type-check。前缀调用符号g#[k](x)
触发此错误:
参数0的类型不匹配(函数需要
ORDINAL
,得到nat
)
第11.1.4节中相应的inductive lemma
和colemma
示例正常工作。我的问题是关于11.1.3。
这一定已经改变了。为什么序数比自然更好?这两种类型是否有可能产生不同的固定点,如果是这样,那么为顺序产生的固定点是否真的是最不稳定的点?
我有点担心我可能会为
这样的东西定义一个归纳谓词inductive predicate isProvable(x) {
isAxiom(x) || exists w :: isProvable(w) && implies(w, x)
}
并且结果表明一些荒谬的东西,允许implies
的无限链,因为索引是序数。我有点担心吗?