如何使用solve_direct建议的规则? (通过(规则......)并不总是有效)

时间:2013-08-29 12:59:24

标签: solver proof isabelle theorem-proving

有时<statement> solve_direct(我通常通过<statement> try调用)列出了许多库定理并说“当前目标可以直接用以下方法解决:......”。

<theorem>成为solve_direct的一个搜索结果,然后在大多数情况下,我可以证明<statement> by (rule theorem)

但是,有时候不接受这样的证明,导致错误消息“无法应用初始证明方法”。

是否有一种通用的,不同的技术可以重用solve_direct找到的定理?

还是取决于个人情况?我可以尝试找出一个最小的例子并将其附加到这个问题上。

3 个答案:

答案 0 :(得分:4)

就个人而言,我只是倾向于使用:

apply (metis thm)

大部分时间都可以工作,而不会强迫我思考(但如果需要棘手的解决方案,仍会偶尔失败)。

其他通常也有效的方法包括:

apply (rule thm)                 (* If "thm" has no premises. *)
apply (erule thm)                (* If "thm" has a single premise. *)
apply (erule thm, assumption+)   (* If "thm" has multiple premises. *)

为什么没有一个答案?答案有点复杂:

在内部,solve_direct调用find_theorems solves,然后执行以下操作:

fun etacn thm i = Seq.take (! tac_limit) o etac thm i;
(* ... *)
if Thm.no_prems thm then rtac thm 1 goal
else (etacn thm THEN_ALL_NEW (Goal.norm_hhf_tac THEN' Method.assm_tac ctxt)) 1 goal;

如果规则上没有前提,则这是与rule thm类似的ML代码,或者:

apply (erule thm, assumption+)

如果规则上有多个前提。正如Brian在您提出的问题上所评论的那样,如果假设中存在复杂的元逻辑连接词,那么上述内容可能仍会失败(norm_hhf_tac处理的内容,但据我所知,并未直接公开为Isabelle方法)。

如果您愿意,可以编写一个新方法直接公开find_theorems使用的策略,如下所示:

ML {*
  fun solve_direct_tac thm ctxt goal =
  if Thm.no_prems thm then rtac thm 1 goal
  else (etac thm THEN_ALL_NEW (Goal.norm_hhf_tac THEN' Method.assm_tac ctxt)) 1 goal;
*}

method_setup solve =
  {* Attrib.thm >> (fn thm => fn ctxt =>
        SIMPLE_METHOD' (K (solve_direct_tac thm ctxt ))) *}
  "directly solve a rule"

然后可以按如下方式使用:

lemma "⟦ a; b ⟧ ⟹ a ∧ b"
  by (solve conjI)

应该有希望解决任何问题solve_direct

答案 1 :(得分:1)

我找到了另一种方法solve_direct使用by rule的建议。当建议来自库的某些非常基本的规则时,例如Hilbert_Choice.someI2,似乎上下文中的一个事实实际上是一个规则本身,这可能是适用的。至少在两个具体情况下(source),以下内容对我有用:

  1. 重新检查“规则”事实,其他事实(如果有的话)和目标
  2. 如有必要,重新排序其他事实
  3. 做证明using <other_facts> ... by (rule <rule-like-fact>)

答案 2 :(得分:0)

您可以尝试factrule_tac。如果我没记错的话,rule有时候在其他事实存在的情况下无法应用给定的规则,我不完全确定原因;那个问题必须由比我更熟悉这些方法的实施细节的人来回答。