我试图根据以下函数证明对无类型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中引入函数必须终止的前提条件?
答案 0 :(得分:3)
我没有意识到引入一个前提条件的方法,该前提条件明确说明"此函数终止(在给出的参数处)"。你应该试着找出一个更高级别的谓词,它等同于那个。在你的情况下,这不会成功,因为你不能提供一个可计算的谓词,用于确定无类型lambda演算中的一个术语是否具有正常形式。
虽然并非一切都失败了:通常的方法是引入额外的"燃料" BigInt
类型的参数。它表示要执行的最大减少步骤数。在每个步骤中,您将燃油减少一个。如果燃料为零,则中止递归并返回None
。这将使你的函数终止。
然而,你总是需要提供一个足够大的"汽油。通常燃料将是一个参数,引理的前提是eval(fuel, t) = Some(u)
。