我正在关注Isabelle教程。在页25上它引用了素数的定义。我这样写了:
definition prime :: "nat ⇒ bool" where "prime p ≡ 1 < p ∧ (∀m. m dvd p ⟶ m = 1 ∨ m = p)"
是伊莎贝尔接受的。但是当我尝试
时value "prime (Suc 0)"
它给出错误
Wellsortedness error
(in code equation prime ?p ≡
ord_nat_inst.less_nat one_nat_inst.one_nat ?p ∧
(∀m. m dvd ?p ⟶
equal_nat_inst.equal_nat m one_nat_inst.one_nat ∨
equal_nat_inst.equal_nat m ?p),
with dependency "Pure.dummy_pattern" -> "prime"):
Type nat not of sort enum
No type arity nat :: enum
我做错了什么?
谢谢, 佩德罗
答案 0 :(得分:1)
您在该定义中有一个通用量词。 Isabelle无法评估涉及具有无限多值的类型的通用量词的谓词(在本例中为nat
),这就是这个有点神秘的错误消息:nat
不是排序{{ 1}}。 enum
是一个类型类,它基本上表明存在一个包含该类型所有值的可计算有限列表。
如果您想使用代码生成器评估enum
函数,则需要将定义更改为可执行文件或提供代码方程式,以表明它等同于可计算的内容,例如:像这样:
prime
这是可执行的原因是通用量词是有界的;它的范围超过有限集lemma prime_code [code]:
"prime p = (1 < p ∧ (∀m∈{1..p}. m dvd p ⟶ m = 1 ∨ m = p))"
proof safe
assume p: "p > 1" "∀m∈{1..p}. m dvd p ⟶ m = 1 ∨ m = p"
show "prime p" unfolding prime_def
proof (intro conjI allI impI)
fix m assume m: "m dvd p"
with p have "m ≠ 0" by (intro notI) simp
moreover from p m have "m ≤ p" by (simp add: dvd_imp_le)
ultimately show "m = 1 ∨ m = p" using p m by auto
qed fact+
qed (auto simp: prime_def)
value "prime 5"
(* "True" :: "bool" *)
。 (你不需要通过大于所谓的素数的数字来检查可分性)