我目前正在使用量化列表'来自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
。我觉得我没有正确地表达语法,但我不确定它应该如何改变。
答案 0 :(得分:2)
为了将x # foo
视为单个操作数,应将其括在括号中:(x # foo)
。
然而,这不是故事的结尾:在应用上述修复后,您将收到错误Nonprimitive pattern in left-hand side at "alls P [x]" ...
违规模式为x # []
,与单个元素列表匹配。
列表是使用两个构造函数Nil
和Cons
定义的,primrec
不允许非基本构造函数,包括单元素列表(看起来像Cons x Nil
) 。可以用primrec
替换fun
以避免此错误,但如果您想要定义一个总函数,也就是处理空列表也会更深入。
为了解决这个问题,该函数应该具有原始构造函数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)"
有意遗漏部分...
,以便您可以使用适当的值填充它。