Function 用于量化列表的函数:语法和类型错误(Isabelle)
我目前正在进行的“量化列表”练习来自。它要求“使用原语递归在列表上定义一个通用量词和一个存在量词”。表达式@{term“alls P xs”}应 当{term“px}适用于 @{term xs}…' 这一尝试在我看来是可信的: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
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的自动化非常擅长推理连词。