在Isabelle中加倍列表的功能

时间:2014-10-19 14:28:03

标签: list isabelle

我想在Isabelle / HOL中定义一个将列表加倍的函数

fun double :: "'a list => 'a list" where
...

这样double [x1, x2, ...] = [x1, x1, x2, x2, ...]

我尝试了以下内容:

fun double :: " 'a list ⇒ 'a list" where
"double [] = []" |
"double [x#[l]] = x # x # double [l]"

以及其他一些定义。我收到了错误

  

类型统一失败

     

应用程序中的类型错误:不兼容的操作数类型

我的功能出了什么问题?

1 个答案:

答案 0 :(得分:3)

实际上错误消息包含一些进一步的信息。即

Operator:  double :: 'a list ⇒ 'a list
Operand:   [[x, l]] :: ??'a list list

告诉我们[[x, l]]属于?'a list list类型,即列表列表。如果你想把它作为double的参数给出,它需要一个'a list类型的参数,你会得到类型错误。

错误消息中术语[[x, l]]的来源是定义的第二行

`double [x # [l]]`

其中x#[l]打印为等效的[x, l]

输入中有几个多余的括号。请注意,与Isabelle中的非正式数学文本(非正式含义在纸上;))相比,您不能使用括号[]显式嵌套。请尝试以下方法。

fun double :: " 'a list ⇒ 'a list"
where
  "double [] = []" |
  "double (x#xs) = x # x # double xs"