就个人而言,我只是倾向于使用:
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+)
如果规则上有多个前提。正如布赖恩对您的问题所评论的那样,如果假设中有复杂的元逻辑连接词(norm_hhf_tac
据我所知,它处理,但没有直接公开为伊莎贝尔方法),上述内容可能仍然会失败。
如果您愿意,您可以编写一个新方法来find_theorems
直接暴露 by 使用的策略,如下所示:
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
你遇到的任何问题。