说我有一个引理mylem: foo ?a = bar ?a
,我需要将它应用于有两次出现foo
的目标,例如baz (foo (f p q)) (foo (g r s))
,但仅限于其中一个职位。我知道有两种方法可以做到这一点,而不必写出所有p
,q
...,这可能是复杂的表达式。
apply (subst mylem)
后跟适当数量(此处为0或1)的back
命令。apply (subst mylem[where a = 'foo x y', standard])
,其中x
和y
是未绑定的名称。此处使用subst
仅用于演示;我真的想修改引理,例如如果有多个可能的匹配项我希望以这种方式消除歧义,则将其与rule
一起使用。
对我来说,这两种方法看起来都很糟糕。有没有更好的方法来实现这一目标?
答案 0 :(得分:1)
您可以告诉subst
应该替换哪个匹配项:subst (i) mylem
在mylem
匹配匹配项下展开i
。这样可以省去back
步骤。您还可以在subst (1 2) mylem
中列出多个职位。如果您想在场所展开mylem
,请使用subst (asm) (1 2) mylem
。
一般来说,我不知道在apply
脚本中实现所需的方法。在理论层面,您可以使用lemmas
和for
子句来概括本地引入的变量:
lemmas mylem' = mylem[where a="f x y"] for x y
在结构化证明中,你可以像这样明确地做到:
{ fix x y note mylem[where a="f x y"] }
note mylem' = this