在Isabelle中,偶尔会遇到有重复子目标的情况。例如,假设以下证明脚本:
lemma "a ∧ a"
apply (rule conjI)
目标:
proof (prove): step 1
goal (2 subgoals):
1. a
2. a
有没有办法在原地消除重复的子目标,所以不需要重复证明?
答案 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)
确实删除了重复的子目标。
这不是一个错误,它是一个功能; - )。