如何使用单值关系自动重写目标?

时间:2014-08-05 19:20:39

标签: isabelle

单值关系(由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”?但它可能太昂贵了......

有什么想法吗?

1 个答案:

答案 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而不是完整的简化器调用来查找假设。