如何删除Isabelle中的重复子目标?

时间:2013-03-25 05:43:40

标签: isabelle

在Isabelle中,偶尔会遇到有重复子目标的情况。例如,假设以下证明脚本:

lemma "a ∧ a"
  apply (rule conjI)

目标:

proof (prove): step 1

goal (2 subgoals):
 1. a
 2. a    

有没有办法在原地消除重复的子目标,所以不需要重复证明?

3 个答案:

答案 0 :(得分:7)

distinct_subgoals_tac中的ML级战术Pure/tactic.ML删除了重复的子目标,可以按如下方式使用:

lemma "a ∧ a"
  apply (rule conjI)
  apply (tactic {* distinct_subgoals_tac *})

离去:

proof (prove): step 2

goal (1 subgoal):
 1. a

不幸的是,似乎没有一种方法没有进入ML世界。

答案 1 :(得分:1)

除了davidg的答案外,如果出于某种原因不想使用tactic,将distinct_subgoals_tac转换为方法也很容易:

method_setup distinct_subgoals =
  ‹Scan.succeed (K (SIMPLE_METHOD distinct_subgoals_tac))›

lemma P and P and P
  (* here there are three goals P *)
  apply distinct_subgoals
  (* now there is only one goal P *)

答案 2 :(得分:0)

我遇到了类似的行为,作为应用于任何定理的subst方法的副作用,例如refl。然后apply (subst refl)确实删除了重复的子目标。

这不是一个错误,它是一个功能; - )。