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

时间:2016-08-10 13:22:59

标签: function recursion isabelle

我目前正在使用量化列表'来自http://isabelle.in.tum.de/exercises/的练习。它要求使用原始递归在列表上定义通用和存在量词。表达@ {term" alls P xs"}应该 if {@ term" P x"}适用于@ {term x}的每个元素 @ {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)"

我试图用数学符号来表达我所表达的内容:

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

alls(P,[x,...])= {if Px then alls(P,[...])否则为假。

然而,Isabelle说,统一中存在“类型”错误'并显示假定x具有类型'a list。我觉得我没有正确地表达语法,但我不确定它应该如何改变。

1 个答案:

答案 0 :(得分:2)

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

然而,这不是故事的结尾:在应用上述修复后,您将收到错误Nonprimitive pattern in left-hand side at "alls P [x]" ...违规模式为x # [],与单个元素列表匹配。

列表是使用两个构造函数NilCons定义的,primrec不允许非基本构造函数,包括单元素列表(看起来像Cons x Nil) 。可以用primrec替换fun以避免此错误,但如果您想要定义一个总函数,也就是处理空列表也会更深入。

为了解决这个问题,该函数应该具有原始构造函数NilCons的模式:

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

有意遗漏部分...,以便您可以使用适当的值填充它。