List 函数将Isabelle中的列表加倍

List 函数将Isabelle中的列表加倍,list,isabelle,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

我想在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]"
以及其他一些定义。我得到了错误

类型统一失败

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


我的函数有什么问题?

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

Operator:  double :: 'a list ⇒ 'a list
Operand:   [[x, l]] :: ??'a list list
这告诉我们,
[[x,l]]
是一个列表类型,即列表列表。当您希望将其作为参数提供给
double
,该参数需要一个类型为
的参数列表,您会得到类型错误

错误消息中术语
[[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"