通用抽象类型的问题

时间:2015-10-29 09:37:55

标签: scala leon

我有一个抽象的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

1 个答案:

答案 0 :(得分:1)

我在你的gist链接中尝试了这个例子(在"可以找到 here ")并且它在当前版本的Leon中工作,无论是在线还是在git存储库中。所以,如果这是一个错误,现在就修复了。如果您有任何相关问题,我们很乐意回答,因为Leon此时仅支持对象和案例类,因此与完整的Scala相比存在差异。