Isabelle 如何简化数据类型上函数属性的证明?

Isabelle 如何简化数据类型上函数属性的证明?,isabelle,isar,Isabelle,Isar,我创建了一个小证明,旨在创建一个示例,用于在证明案例中使用next: theory RedGreen imports Main begin datatype color = RED | GREEN fun green :: "color => color" where "green RED = GREEN" | "green GREEN = GREEN" lemma disj_not: "P \<or> Q \<Longrightarro

我创建了一个小证明,旨在创建一个示例,用于在证明案例中使用
next

theory RedGreen 

imports Main 

begin 

datatype color = RED | GREEN 

fun green :: "color => color" 
where 
  "green RED   = GREEN" 
| "green GREEN = GREEN" 

lemma disj_not: "P \<or> Q \<Longrightarrow> \<not>P \<longrightarrow> Q" 
proof 
  assume disj: "P \<or> Q" 
  assume "\<not>P" 
  from this show "Q" using `P \<or> Q` by (simp) 
qed   

lemma redgreen: "x \<noteq> RED \<longrightarrow> x = GREEN" 
proof  
  assume notred: "x \<noteq> RED" 
  have "x = RED \<or> x = GREEN" by (simp only: color.nchotomy)  
  from this show "x = GREEN" using notred by (simp add:  disj_not) 
qed 

lemma "green x = GREEN" 
proof cases 
  assume "x = RED" 
  from this show "green x = GREEN" by (simp) 
next 
  assume "x \<noteq> RED" 
  from this have "x = GREEN" by (simp add: redgreen) 
  from this show "green x = GREEN" by (simp) 
qed 
理论红绿
主要进口
开始
数据类型颜色=红色|绿色
趣味绿色::“颜色=>颜色”
哪里
“绿-红=绿”
|“绿色=绿色”
引理不:“P\Q\\P\Q”
证明
假设disj:“P\Q”
假设“\P”
从本节目中使用'P\Q`by(simp)的“Q”
量化宽松
引理红绿:“x\RED\x=GREEN”
证明
假设不红色:“x\RED”
使用“x=RED\x=GREEN”(仅限simp:color.nchotomy)
从该显示中,使用notred by(simp add:disj_not)显示“x=GREEN”
量化宽松
引理“绿色x=绿色”
证明案例
假设“x=红色”
由(simp)主持的本节目“绿色x=绿色”
下一个
假设“x\RED”
从中选择“x=GREEN”by(simp add:redgreen)
由(simp)主持的本节目“绿色x=绿色”
量化宽松

这能在不丢失细节的情况下简化吗?使用一些魔术不是我想要的。改进Isar的使用风格是受欢迎的。

我的经验是,像您的
disj\u not
redgreen
这样的低级(特别)规则几乎没有用处。如果确实需要,这很可能是由于缺乏自动化(通过适当的
simp
intro
elim
dest
规则)。很高兴,在你的例子中,这些“中间引理”根本没有必要(我也不认为它们有特殊的教育价值)。来回答你关于简化版本的问题。我认为这样做的一个典型方式是:

lemma "green x = GREEN"
proof (cases x)
  case RED
  then show "green x = GREEN" by simp
next
  case GREEN
  then show "green x = GREEN" by simp
qed

其中,自动生成的事实
color.detain
用于对
color
类型的变量
x
进行案例证明,我要提出的另一个风格建议是,您可以说
然后通过simp显示?论文,这避免了一些重复<代码>?论文只是你试图证明的原始陈述的简写。@davidg:你当然是对的。为了可读性(如果目标很短),我有时会显式地编写show语句。在实际开发中,上述情况将通过(案例x)simp_all(无论如何)通过
得到证实