Isabelle中Prime的定义

时间:2016-12-01 15:06:33

标签: isabelle

我正在关注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

我做错了什么?

谢谢, 佩德罗

1 个答案:

答案 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" *) 。 (你不需要通过大于所谓的素数的数字来检查可分性)