引入终止作为Leon / Stainless的先决条件

时间:2017-02-25 17:51:19

标签: scala formal-verification leon

我试图根据以下函数证明对无类型lambda演算的评估:

 def eval(t: Term): Option[Term] = t match {
    case App(t1, t2) => eval(t1) match {
      case Some(Abs(x, body)) => eval(t2) match {
        case Some(v2) => eval(subst(x, v2, body))
        case None() => None[Term]()
      }
      case _ => None[Term]() // stuck
    }
    case _ => Some(t) // Abs or Var, already a value
  }

返回None或值。但是,我被指出这个功能可能不会终止。我的问题是如何在Leon / Stainless中引入函数必须终止的前提条件?

1 个答案:

答案 0 :(得分:3)

我没有意识到引入一个前提条件的方法,该前提条件明确说明"此函数终止(在给出的参数处)"。你应该试着找出一个更高级别的谓词,它等同于那个。在你的情况下,这不会成功,因为你不能提供一个可计算的谓词,用于确定无类型lambda演算中的一个术语是否具有正常形式。

虽然并非一切都失败了:通常的方法是引入额外的"燃料" BigInt类型的参数。它表示要执行的最大减少步骤数。在每个步骤中,您将燃油减少一个。如果燃料为零,则中止递归并返回None。这将使你的函数终止。

然而,你总是需要提供一个足够大的"汽油。通常燃料将是一个参数,引理的前提是eval(fuel, t) = Some(u)