考虑理论
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
显然,引理可以从prems
和comp
显示。事实上,乍一看,人们可以预期它可以通过
by (intro prems comp)
但这只是循环。原因是comp
与目标的一个可能的统一是f = (λa. a)
和g = (λ x. f (g (h x)))
(通过使用apply (rule comp)
可以看出)并且没有取得进展。
我知道这是rule
代表的有效行为。 intro
。然而,从实用的角度来看,我经常遇到简化或引入规则,这些规则在匹配(λx. x)
时匹配除之外的所有情况下都非常有用。
有没有办法说明comp
,以便Isabelle的匹配器不考虑f
或g
为(λx. x)
的解决方案?< / p>
如果没有,为什么不是这样的技术和/或理论原因是什么?
答案 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)+
或者,您可以编写自己的rule
或intros
包装器,它会丢弃结果序列的头部。
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))
*})