单值关系(由single_valued
理论中的Relation
定义)允许从成员关系中推导出均等性。我想知道是否有办法利用这个来重写目标中的术语(然后合并这些成员关系)。
作为一个例子,这里有一个目标,如果没有辅助定理,无法用auto或force解决:
lemma
assumes "single_valued A"
assumes "(a,b) ∈ A" and "(a,b') ∈ A"
shows "b = b'"
using assms
by (metis single_valued_def)
这里的平等直接在目标中,但在假设中重写也是很好的。
另外,我在这里谈论对的集合,但我有一个更复杂的应用程序与另一种类似属性的关系,这种假设很常见,我正在寻找一种简化它们的方法。 / p>
在我看来,自动方法可以从这样的功能中受益匪浅。
我之前已经写了一些简单的东西,在我看来,如果我们可以在触发simproc后访问一组假设,我们可以在这里使用它们,我不知道这是否可行。例如,一旦“(a,b)∈A”触发了simproc,我们可以检查是否有任何假设包含“(a,_)∈A”?但它可能太昂贵了......
有什么想法吗?
答案 0 :(得分:3)
这是一个能够做你想做的事情:
lemma single_valuedD_eq:
"⟦ single_valued A; (x, a) ∈ A ⟧ ⟹ (x, b) ∈ A ⟷ b = a"
by(auto dest: single_valuedD)
simproc_setup single_valued ("(x, y) ∈ A") = {*
(fn phi => fn ctxt => fn redex => case term_of redex of
Const (@{const_name "Set.member"},
Type (@{type_name fun},
[Txy as Type (@{type_name prod}, [Tx, Ty]),
Type (@{type_name fun}, [TA, _])])) $
(Const (@{const_name "Pair"}, _) $ tx $ ty) $
tA =>
let
val thy = Proof_Context.theory_of ctxt;
val prems = Simplifier.prems_of ctxt;
fun mk_stmt t = t |> HOLogic.mk_Trueprop |> Thm.cterm_of thy |> Goal.init
fun mk_thm tac t =
case SINGLE (tac 1) (mk_stmt t) of
SOME thm => SOME (Goal.finish (Syntax.init_pretty_global (Thm.theory_of_thm thm)) thm)
| NONE => NONE;
val svA = Const (@{const_name single_valued}, TA --> @{typ bool}) $ tA
val [z] = Name.invent (Variable.names_of ctxt) "z" 1
val xzA =
Const (@{const_name Set.member}, Txy --> TA --> @{typ bool})
$ (Const (@{const_name Pair}, Tx --> Ty --> Txy)
$ tx $ Var ((z, 0), Ty))
$ tA
in
case mk_thm (resolve_tac prems) svA of NONE => NONE
| SOME thm_svA => case mk_thm (resolve_tac prems) xzA of NONE => NONE
| SOME thm_xzA =>
SOME (@{thm single_valuedD_eq[THEN eq_reflection]} OF [thm_svA, thm_xzA])
end
| _ => NONE)
*}
当它触发模式(_, _) ∈ _
的术语时,例如(x, y) ∈ A
,它会检查当前目标中是否存在假设single_valued A
和(x, ?z) ∈ A
。如果是,则使用它们实例化single_valuedD_eq
定义,并将(x, y) ∈ A
重写为y = ?z
并?z
进行适当的实例化。
以下是一个例子:
lemma
"⟦ single_valued A; (x, b) ∈ A; (x, c) ∈ A ⟧
⟹ map (λy. (x, y) ∈ A) xs = foo"
apply simp
NEW GOAL:
1. ⟦single_valued A; b = c; (x, c) ∈ A⟧ ⟹ map (λy. y = c) xs = foo
请注意single_valued A
必须是目标的假设。在某处将single_valued A
作为[simp]规则是不够的。这是因为使用resolve_tac prems
而不是完整的简化器调用来查找假设。