避免匹配(λx.x)

时间:2014-05-15 08:01:05

标签: isabelle unification

考虑理论

theory Scratch imports Main
begin

notepad
begin
  fix P and f g h :: "int ⇒ int"
  assume prems: "P f" "P g" "P h"
  assume comp: "⋀ f g. P f ⟹ P g ⟹ P (λ x. f (g x))"

  have "P (λ x. f (g (h x)))"
    sorry
end
end

显然,引理可以从premscomp显示。事实上,乍一看,人们可以预期它可以通过

显示出来
by (intro prems comp)

但这只是循环。原因是comp与目标的一个可能的统一是f = (λa. a)g = (λ x. f (g (h x)))(通过使用apply (rule comp)可以看出)并且没有取得进展。

我知道这是rule代表的有效行为。 intro。然而,从实用的角度来看,我经常遇到简化或引入规则,这些规则在匹配(λx. x)时匹配之外的所有情况下都非常有用。

有没有办法说明comp,以便Isabelle的匹配器考虑fg(λx. x)的解决方案?< / p>

如果没有,为什么不是这样的技术和/或理论原因是什么?

1 个答案:

答案 0 :(得分:1)

Isabelle库中有许多关于功能组成的属性的例子,例如HOLCF和多变量分析的连续性。它们都有一般的合成规则,例如comp,但comp从未在规则应用程序中使用,因为它与%x. x匹配。相反,只使用专用实例,您可以使用THEN属性获取该实例。在您的示例中,这可能如下所示:

have "P (%x. f (g (h x)))"
  by(rule prems prems[THEN comp])+

如果您只是寻找单个方法表达式来证明这一点,您可以利用,回溯,即

have "P (%x. f (g (h x)))"
  by(rule prems|rule comp, rule prems)+

或者,您可以编写自己的ruleintros包装器,它会丢弃结果序列的头部。

have "P (%x. f (g (h x)))"
  apply(tactic {*
    REPEAT_FIRST (resolve_tac @{thms prems} ORELSE' 
                  (fn i => snd o Seq.chop 1 o resolve_tac @{thms comp} i))
  *})