我有一个抽象的堆栈类型如下
abstract class Stack[T] {
def empty : Stack[T]
def pop () : (Option[T], Stack[T])
def push (e : T) : Stack[T]
def size : BigInt
}
我想验证pop
返回最后推送的元素:
// ok
def test_v1[T] (e : T, s : Stack[T]) : Boolean = {
s.push(e).pop()._1 match {
case Some(e2) => e == e2
case _ => false
}
} holds
// failed
def test_v2[T] (e : T, s : Stack[T]) : Boolean = {
s.push(e).pop()._1 == Some(e)
} holds
这两个引理是等价的,但 Leon 无法识别第二个引理中的类型参数。Stack
有趣的是,Leon 在具体或非泛型时都没有问题
(请参阅下面的链接以获取示例)。这是 Leon 的功能还是只是一个错误?
完整的示例代码可以在这里找到。