为什么Dafny归纳谓词使用序数?

时间:2018-06-18 05:58:47

标签: induction dafny

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 lemmacolemma示例正常工作。我的问题是关于11.1.3。

这一定已经改变了。为什么序数比自然更好?这两种类型是否有可能产生不同的固定点,如果是这样,那么为顺序产生的固定点是否真的是最不稳定的点?

我有点担心我可能会为

这样的东西定义一个归纳谓词
inductive predicate isProvable(x) {
    isAxiom(x) || exists w :: isProvable(w) && implies(w, x)
}

并且结果表明一些荒谬的东西,允许implies的无限链,因为索引是序数。我有点担心吗?

0 个答案:

没有答案