首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何用Isar证明淘汰规则?

如何用Isar证明淘汰规则?
EN

Stack Overflow用户
提问于 2018-12-13 06:37:10
回答 1查看 86关注 0票数 1

以下是一个简单的理论:

代码语言:javascript
复制
datatype t1 = A | B | C
datatype t2 = D | E t1 | F | G

inductive R where
  "R A B"
| "R B C"

inductive_cases [elim]: "R x B" "R x A" "R x C"

inductive S where
  "S D (E _)"
| "R x y ⟹ S (E x) (E y)"

inductive_cases [elim]: "S x D" "S x (E y)"

我可以用两个辅助引理证明引理elim

代码语言:javascript
复制
lemma tranclp_S_x_E:
  "S⇧+⇧+ x (E y) ⟹ x = D ∨ (∃z. x = E z)"
  by (induct rule: converse_tranclp_induct; auto)

(* Let's assume that it's proven *)
lemma reflect_tranclp_E:
  "S⇧+⇧+ (E x) (E y) ⟹ R⇧+⇧+ x y"
  sorry

lemma elim:
  "S⇧+⇧+ x (E y) ⟹
   (x = D ⟹ P) ⟹ (⋀z. x = E z ⟹ R⇧+⇧+ z y ⟹ P) ⟹ P"
  using reflect_tranclp_E tranclp_S_x_E by blast

我需要使用Isar证明elim

代码语言:javascript
复制
lemma elim:
  assumes "S⇧+⇧+ x (E y)"
    shows "(x = D ⟹ P) ⟹ (⋀z. x = E z ⟹ R⇧+⇧+ z y ⟹ P) ⟹ P"
proof -
  assume "S⇧+⇧+ x (E y)"
  then obtain z where "x = D ∨ x = E z"
    by (induct rule: converse_tranclp_induct; auto)
  also have "S⇧+⇧+ (E z) (E y) ⟹ R⇧+⇧+ z y"
    sorry
  finally show ?thesis

但我得到了以下错误:

代码语言:javascript
复制
No matching trans rules for calculation:
    x = D ∨ x = E z
    S⇧+⇧+ (E z) (E y) ⟹ R⇧+⇧+ z y

Failed to refine any pending goal 
Local statement fails to refine any pending goal
Failed attempt to solve goal by exported rule:
  (S⇧+⇧+ x (E y)) ⟹ P

如何修复它们?

我想这个引理可以有一个更简单的证明。但我需要分两步来证明:

  1. 显示x的可能值
  2. 表明E反映了传递闭包

我也认为这个引理可以用x上的例子来证明。但我的真实数据类型有太多的案例。所以,这不是首选的解决方案。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-12-13 12:03:17

这个变体似乎奏效了:

代码语言:javascript
复制
lemma elim:
  assumes "S⇧+⇧+ x (E y)"
      and "x = D ⟹ P"
      and "⋀z. x = E z ⟹ R⇧+⇧+ z y ⟹ P"
    shows "P"
proof -
  have "S⇧+⇧+ x (E y)" by (simp add: assms(1))
  then obtain z where "x = D ∨ x = E z"
    by (induct rule: converse_tranclp_induct; auto)
  moreover
  have "S⇧+⇧+ (E z) (E y) ⟹ R⇧+⇧+ z y"
    sorry
  ultimately show ?thesis
    using assms by auto
qed
  • 假设应与目标分开。
  • 作为第一个语句,我应该使用have而不是assume。这不是一个新的假设,只是一个现有的假设。
  • 而不是finally,我应该使用ultimately。似乎后者有一个更简单的应用逻辑。
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53756249

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档