question is posed on the IsaUserList如何证明lemma
:
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所做的一些事情以及我得到的结果之间存在一些差异。
Introduced fixed type variable(s): 'c in "b__"
时收到警告obtain
,并使用证明by
的{{1}}语句}。我可以摆脱这个警告吗?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毫秒。
答案 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 5
。 print_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