Isabelle 证明更复杂集合的基数

Isabelle 证明更复杂集合的基数,isabelle,Isabelle,假设我有一个包含三个连词的集合,你的命题是不正确的。你描述的集合实际上是空的,如“gcd 36=3”。Sledgehammer可以毫无问题地证明基数为零,尽管结果证明还是有点难看,就像Sledgehammer证明一样: lemma "card {k::nat. 2<k ∧ k ≤ 7 ∧ gcd 3 k = 2} = 0" by (metis (mono_tags, lifting) card.empty coprime_Suc_nat empty_Collect_e

假设我有一个包含三个连词的集合,你的命题是不正确的。你描述的集合实际上是空的,如“
gcd 36=3
”。Sledgehammer可以毫无问题地证明基数为零,尽管结果证明还是有点难看,就像Sledgehammer证明一样:

lemma "card {k::nat. 2<k ∧ k ≤ 7 ∧ gcd 3 k = 2} = 0"
  by (metis (mono_tags, lifting) card.empty coprime_Suc_nat 
        empty_Collect_eq eval_nat_numeral(3) gcd_nat.left_idem 
        numeral_One numeral_eq_iff semiring_norm(85))
请注意,我必须先对集合进行一点按摩(使用
set.filter
而不是集合理解),以便
eval
接受它。(代码生成可能有点棘手)

更新:

对于评论中的其他陈述,证据必须如下所示:

lemma "{k::nat. 0<k ∧ k ≤ 5 ∧ gcd 5 k = 1} = {1,2,3,4}"
proof (intro equalityI subsetI)
  fix x :: nat
  assume x: "x ∈ {k. 0 < k ∧ k ≤ 5 ∧ coprime 5 k}"
  from x have "x = 1 ∨ x = 2 ∨ x = 3 ∨ x = 4 ∨ x = 5" by auto
  with x show "x ∈ {1,2,3,4}" by (auto simp: gcd_non_0_nat)
qed (auto simp: gcd_non_0_nat)

引理“{k::nat.0你的命题是不正确的。你描述的集合实际上是空的,如
gcd 3 6=3
。Sledgehammer可以毫无问题地证明基数为零,尽管得到的证明也有点难看,就像Sledgehammer证明的情况一样:

lemma "card {k::nat. 2<k ∧ k ≤ 7 ∧ gcd 3 k = 2} = 0"
  by (metis (mono_tags, lifting) card.empty coprime_Suc_nat 
        empty_Collect_eq eval_nat_numeral(3) gcd_nat.left_idem 
        numeral_One numeral_eq_iff semiring_norm(85))
请注意,我必须先对集合进行一点按摩(使用
set.filter
而不是集合理解),以便
eval
接受它。(代码生成可能有点棘手)

更新:

对于评论中的其他陈述,证据必须如下所示:

lemma "{k::nat. 0<k ∧ k ≤ 5 ∧ gcd 5 k = 1} = {1,2,3,4}"
proof (intro equalityI subsetI)
  fix x :: nat
  assume x: "x ∈ {k. 0 < k ∧ k ≤ 5 ∧ coprime 5 k}"
  from x have "x = 1 ∨ x = 2 ∨ x = 3 ∨ x = 4 ∨ x = 5" by auto
  with x show "x ∈ {1,2,3,4}" by (auto simp: gcd_non_0_nat)
qed (auto simp: gcd_non_0_nat)

lemma“{k::nat.0
nitpick
也会找到一个反例。它只显示“空赋值”,这不是很有用。但它可能表明你的引理可能是错误的。
nitpick
也会找到一个反例。它只显示“空赋值”这不是很有用。但它可能表明你的引理可能是错误的。这是一个多么有启发性的答案!(我仍然很惊讶“易变”的程度)Sledgehammer是——起初,即使引理的公式正确,它也不起作用,我必须重新启动Isabelle才能让它工作。你知道如何在ATP超时之前将时间限制设置为60秒而不是默认的30秒吗?)如果
-
,在手工证明中,你使用
安全
而不是
-
的原因是什么?如果我对结构化证明中的数字进行一些处理,然后选择,例如
引理{k::nat.0
gcd_non_0_nat
仍然适用。这条规则只是用来计算像
gcd52
这样的表达式;它最终通过反复使用
mod
减少一个参数来运行欧几里德算法,直到达到0。您的证明失败的原因可能不同;我更新了我的答案屋顶
,您必须给出一个应用于转换目标状态的初始证明方法。通常,这类似于
案例
归纳
,但更常见的是,它只是
-
,根本不起任何作用。我在这里使用了
安全
,它应用了所有“安全”引入规则(即已声明为
intro!:
。例如,它去除了所有类型的逻辑连接词和量词;不幸的是,如果您有一个类似
x的目标∈ {1,2}
,它将其拆分为笨拙的
x≠ 1.⟹ x≠ 2.⟹ x∈ {}
。多么有启发性的答案!(我仍然惊讶于大锤的“易变性”——起初,即使引理的公式正确,它也不起作用,我必须重新启动Isabelle才能让它工作。在ATP超时之前,你知道如何将时间限制设置为60秒而不是默认的30秒吗?)如果
-
,在手工证明中,你使用
安全
而不是
-
的原因是什么?如果我对结构化证明中的数字进行一些处理,然后选择,例如
引理{k::nat.0
gcd_non_0_nat
仍然适用。这条规则只是用来计算像
gcd52
这样的表达式;它最终通过反复使用
mod
减少一个参数来运行欧几里德算法,直到达到0。您的证明失败的原因可能不同;我更新了我的答案屋顶
,您必须给出一个应用于转换目标状态的初始证明方法。通常,这类似于
案例
归纳
,但更常见的是,它只是
-
,根本不起任何作用。我在这里使用了
安全
,它应用了所有“安全”引入规则(即已声明为
intro!:
。例如,它去除了所有类型的逻辑连接词和量词;不幸的是,如果您有一个类似
x的目标∈ {1,2}
,它将其拆分为笨拙的
x≠ 1.⟹ x≠ 2.⟹ x∈ {}