Function 用于量化列表的函数:语法和类型错误(Isabelle)

Function 用于量化列表的函数:语法和类型错误(Isabelle),function,recursion,isabelle,Function,Recursion,Isabelle,我目前正在进行的“量化列表”练习来自。它要求“使用原语递归在列表上定义一个通用量词和一个存在量词”。表达式@{term“alls P xs”}应 当{term“px}适用于 @{term xs}…' 这一尝试在我看来是可信的: primrec alls :: "('a ⇒ bool) ⇒ 'a list ⇒ bool" where "alls P x # [] = (if P x then True else False)" | "alls P x # xs = (if P x then all

我目前正在进行的“量化列表”练习来自。它要求“使用原语递归在列表上定义一个通用量词和一个存在量词”。表达式@{term“alls P xs”}应 当{term“px}适用于 @{term xs}…'

这一尝试在我看来是可信的:

primrec alls :: "('a ⇒ bool) ⇒ 'a list ⇒ bool" where
"alls P x # [] = (if P x then True else False)"
| "alls P x # xs = (if P x then alls P xs else False)"
我试着用数学符号来表示:

all(p[x])={如果Px为真,否则为假

all(p,[x,…])={如果是Px,那么all(p,[…])否则为false

然而,Isabelle说,统一中存在一个“类型错误”,并表明
x
被假定为有一个类型
“列表”
。我觉得我没有正确地表达语法,但我不确定应该如何更改它。

为了将
x#foo
视为单个操作数,它应该包含在parenthe中ses:
(x#foo)

然而,这并不是故事的结尾:在应用上面的修复之后,您将在左侧的“alls p[x]”处得到一个错误
非基本模式。…
有问题的模式是与单个元素列表匹配的
x#[]

列表使用两个构造函数定义
Nil
Cons
primrec
不允许使用非基本构造函数,包括单元素列表(看起来像
Cons x Nil
)。可以将
primrec
替换为
fun
,以避免此错误,但如果要定义一个total函数,即同时处理空列表,则问题更为严重

为了解决这个问题,函数应该有两个基本构造函数的模式
Nil
Cons

primrec alls :: "('a ⇒ bool) ⇒ 'a list ⇒ bool" where
  "alls P [] = ..."
| "alls P (x # xs) = (if P x then alls P xs else False)"
部分
故意丢失,以便您可以用适当的值填充它。

为了将
x#foo
视为单个操作数,应将其括在括号中:
(x#foo)

然而,这并不是故事的结尾:在应用上面的修复之后,您将在左侧的“alls p[x]”处得到一个错误
非基本模式。…
有问题的模式是与单个元素列表匹配的
x#[]

列表使用两个构造函数定义
Nil
Cons
primrec
不允许使用非基本构造函数,包括单元素列表(看起来像
Cons x Nil
)。可以将
primrec
替换为
fun
,以避免此错误,但如果要定义一个total函数,即同时处理空列表,则问题更为严重

为了解决这个问题,函数应该有两个基本构造函数的模式
Nil
Cons

primrec alls :: "('a ⇒ bool) ⇒ 'a list ⇒ bool" where
  "alls P [] = ..."
| "alls P (x # xs) = (if P x then alls P xs else False)"

部分
..
故意丢失,以便您可以用适当的值填充它。

谢谢!我现在已经解决了(
..
中的
True
)我知道在将来收到错误消息
非基本模式时如何响应。请注意
px∧ alls P xs
如果P x那么alls P xs else False
好,因为它避免了不必要的大小写拆分,而且Isabelle的自动化非常擅长推理连词。谢谢!我现在已经解决了(
中的
True
)将来当我收到错误消息
非基本模式时,我将知道如何响应∧ alls P xs
优于
如果P x那么alls P xs else False
,因为它避免了不必要的大小写拆分,而且Isabelle的自动化非常擅长推理连词。