我有一个抽象的Stack类型如下
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无法识别第二个引理中的类型参数。有趣的是,Leon没有问题
Stack
具体或非通用(请参阅下面的链接以获取示例)。这是Leon的特色还是只是一个bug?
可以找到完整的示例代码here。
答案 0 :(得分:1)
我在你的gist链接中尝试了这个例子(在"可以找到 here ")并且它在当前版本的Leon中工作,无论是在线还是在git存储库中。所以,如果这是一个错误,现在就修复了。如果您有任何相关问题,我们很乐意回答,因为Leon此时仅支持对象和案例类,因此与完整的Scala相比存在差异。