使用获得产生固定类型变量警告

时间:2014-01-17 23:03:55

标签: isabelle

question is posed on the IsaUserList如何证明lemma

。{{3}}
lemma "dom (SOME b. dom b = A) = A" 

作为第一反应,P.Lammich说需要使用obtain

You have to show that there is such a beast b, ie,   
proof -
  obtain b where "dom b = A" ...
  thus ?thesis
sledgehammer (*Should find a proof now, using the rules for SOME, probably SomeI*)  

在这里,我有一个主要问题,一个次要问题,我想知道P.Lammich所说的事情,M.Eberl所做的一些事情以及我得到的结果之间存在一些差异。

  • Q1:我在使用Introduced fixed type variable(s): 'c in "b__"时收到警告obtain,并使用证明by的{​​{1}}语句}。我可以摆脱这个警告吗?
  • Q2:是否有三个点的命令obtain?我认为这意味着,"你的证据就在这里。"然而,它有时听起来像作家也在说," ...因为,毕竟,这里的证明非常简单。"我也知道....命令,by this..。另外,我认为by rule通常被认为是一些我应该知道的简单证据陈述,但不是。

以下来源将显示警告。可能我应该...某事。该来源还显示了我必须如何帮助fix,这就是我必须提出一个存在语句。

由于原理图变量的原因,我将错误留在原因中,以防有人对此感兴趣。

sledgehammer

我的Q1和Q2与上面的内容有关。作为我的奇迹的一部分,由于原理图变量,存在获取错误的问题。我可以将其报告为bug类型问题。

在他的IsaUserList回复中,M.Eberl说他获得了(* I HELP SLEDGEHAMMER with an exists statement. I can delete the exists statement after the `metis` proof is found. The `?'c1` below causes an error, but `by` still proves the goal. *) lemma "dom (SOME b. dom b = A) = A" proof- have "? x. x = (SOME b. dom b = A)" by(simp) from this obtain b where ob1: "dom b = A" (*WARNING: Orange squiggly under `obtain`. Message: Introduced fixed type variable(s): 'c in "b__".*) by(metis (full_types) dom_const dom_restrict inf_top_left) thus ?thesis using[[show_types]] (*Because of `show_types`, a schematic type variable `?'c1` will be part of the proof command that `sledgehammer` provides in the output panel.*) (*sledgehammer[minimize=smart,preplay_timeout=10,timeout=60,verbose=true, isar_proofs=smart,provers="z3 spass remote_vampire"]*) by(metis (lifting, full_types) `!!thesis::bool.(!!b::'a => ?'c1 option. dom b = (A::'a set) ==> thesis) ==> thesis` someI_ex) (*ERROR: Illegal schematic type variable: ?'c1::type. To get rid of the error, delete `?`, or use `ob1` as the fact.*) qed 的以下sledgehammer证明。他说证据很慢,而且确实如此。对我来说大约2秒钟。

obtain

by(metis (lifting, full_types) dom_const dom_restrict inf_top.left_neutral someI_ex) sledgehammer以上thus ?thesis找到的证据仅为4毫秒。

1 个答案:

答案 0 :(得分:2)

回答Q1

由于M.Eberl的评论,我做出了相当大的努力来弄清楚如何在不使用obtain的情况下获得证人。在这个过程中,我回答了我的主要问题。

我删除了使用'c而不是b :: "'a => 'b option"b作为类型变量引用的警告,如下所示:

lemma "dom (SOME b. dom b = A) = A"
proof-
obtain b :: "'a => 'b option" where "dom (b) = A"
  by(metis (full_types) dom_const dom_restrict inf_top_left)
thus ?thesis
  by(metis (lifting, full_types) exE_some)
qed

回答Q2

(更新140119)我终于在page 6 of isar-ref.pdf上找到了...的Isar语法。

  

term ... - 最后明确说明的结果的参数(对于中缀应用,这是右侧)

字符串...并不是一个友好的搜索字符串。找到意义是开始浏览第1章的结果。我现在看到isar-ref.pdf的第1章,第2章和第6章是关于如何使用Isar来做证明的一些帮助的关键章节。 (结束更新。)

关于因使用fix/assume替代obtain 而导致的错误

现在,我回到M.Eberl告诉我不应该使用obtain,这恰好是有益的。但它提出,尝试弄清楚如何使用该语言让PIDE高兴是一项重大努力。我在下面展示的最后一个来源是另一个学习如何让PIDE快乐的麻烦。在很大程度上,它只是使用示例来尝试找出语法和命令的正确组合。

P.Lammich说他在答案中使用obtain。我还在prog-prove.pdf page 42中查看obtain的使用情况,该问题与证人的使用有关。

我读了一些其他的东西,我认为这一切都告诉我obtain对于修复具有某些属性的变量或常量至关重要。

无论如何,我用def创建了一个见证人,所以我学到了一些新东西:

declare[[show_sorts,show_brackets]]
lemma "dom (SOME b. dom b = A) = A"
proof-
def w == "(SOME b::('a => 'b option). dom b = A)"
hence "dom w = A"
  by(metis (lifting, mono_tags) dom_const dom_restrict inf_top_left someI_ex)
  print_facts
thus ?thesis
  by(metis (lifting, full_types) dom_option_map exE_some)
qed

但是,我尝试使用fix/assume组合def,据说def是缩写,我得到了那个神秘且极其令人愤怒的信息,“无法改进任何待定目标“,这让我想知道为什么我要使用这种语言。

declare[[show_sorts,show_brackets]]
lemma "dom (SOME b. dom b = A) = A"
proof-
fix w assume w_def: "w == (SOME b::('a => 'b option). dom b = A)"
hence "dom w = A"
  by(metis (lifting, mono_tags) dom_const dom_restrict inf_top_left someI_ex)
  print_facts
thus ?thesis
oops

对于两个样张,当光标位于print_facts之前的行时,我在输出面板中看到的内容完全相同,而def证明显示proof (state): step 4除外,并且fix/assume证明显示proof (state): step 5print_facts的事实也是一样的。

通过搜索,我知道“未能完善任何待定目标”已成为许多人痛苦的根源。在过去,我终于找到了摆脱我正在做的事情的伎俩,但这里没有意义,也不是对我有意义。

更新140118_0054

L.Noschinski给出了IsaUserList 2012-11-13的微妙提示:

  

使用“fix”或“def”定义a时   变量,它们要么只是一般化(即变成原理图)   (修复)或用右手边代替(定义)   当一个块关闭/执行一个节目时。

因此,对于fix/assumes形式的证明,我将其中的一部分放在括号中,并且出于某种原因,它以所需的方式导出事实:

lemma "dom (SOME b. dom b = A) = A"
proof-
{
fix w assume "w == (SOME b::('a => 'b option). dom b = A)"
hence "dom w = A"
  by(metis (lifting, mono_tags) dom_const dom_restrict inf_top_left someI_ex)
}
thus ?thesis
  by(metis (lifting, full_types) dom_option_map exE_some)
qed

我继续投入let形式的证据。在没有查看M.Eberl的证据的情况下,我不会知道使用原理图变量?w

lemma "dom (SOME b. dom b = A) = A"
proof-
let ?w = "(SOME b::('a => 'b option). dom b = A)"
have "dom ?w = A"
  by(metis (lifting, mono_tags) dom_const dom_restrict inf_top_left someI_ex)
thus ?thesis
  by(metis (lifting, full_types) dom_option_map exE_some)
qed