Isabelle 获得更具体引理的标准方法

Isabelle 获得更具体引理的标准方法,isabelle,apply-script,Isabelle,Apply Script,假设我有一个引理mylem:foo?a=bar?a,我需要将它应用于两次出现foo的目标,例如baz(foo(fpq))(foo(grs)),但只在其中一个位置。我知道有两种方法可以不用写出所有的p,q…,它们可以是复杂的表达式 使用apply(subst mylem)后跟适当数量的back命令 使用apply(subst mylem[其中a='foo x y',standard]),其中x和y是未绑定的名称 这里使用subst只是为了演示;我真的很想修改引理,例如,当有多个可能的匹配时,我

假设我有一个引理
mylem:foo?a=bar?a
,我需要将它应用于两次出现
foo
的目标,例如
baz(foo(fpq))(foo(grs))
,但只在其中一个位置。我知道有两种方法可以不用写出所有的
p
q
…,它们可以是复杂的表达式

  • 使用
    apply(subst mylem)
    后跟适当数量的
    back
    命令
  • 使用
    apply(subst mylem[其中a='foo x y',standard])
    ,其中
    x
    y
    是未绑定的名称
这里使用
subst
只是为了演示;我真的很想修改引理,例如,当有多个可能的匹配时,我想用这种方式消除歧义,将它与
规则一起使用


在我看来,这两种方法都很糟糕。有没有更好的方法来实现这一点呢?

你可以告诉
subst
它应该替换哪个事件:
subst(i)mylem
在第
i
个匹配事件处展开
mylem
。这将为您节省
back
步骤。您还可以在
subst(1 2)mylem
中列出多个位置。如果要在premises中展开
mylem
,请使用
subst(asm)(1 2)mylem

一般来说,我不知道如何在
apply
脚本中实现您想要的内容。在理论层面上,您可以使用
引理
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

您可以告诉
subst
它应该替换哪个引用:
subst(i)mylem
在第
i
个匹配引用处展开
mylem
。这将为您节省
back
步骤。您还可以在
subst(1 2)mylem
中列出多个位置。如果要在premises中展开
mylem
,请使用
subst(asm)(1 2)mylem

一般来说,我不知道如何在
apply
脚本中实现您想要的内容。在理论层面上,您可以使用
引理
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

好的,这对subst有效。但是如果我想应用规则,比如说,
规则
,并且有多种方法将其与目标统一起来,那该怎么办?我以前不知道用这种方式来应用
。我可以在比
引理
解释
更多的位置使用它吗?你可以将
用于
定理
,这类似于
引理
;使用
感应式
感应式
来固定参数;以及出现在
解释(解释)
子本地化
语言环境中的内部语言环境表达式…=。。。为了+
。好的,这对subst有效。但是如果我想应用规则,比如说,
规则
,并且有多种方法将其与目标统一起来,该怎么办?我以前不知道用这种方法来应用
。我可以在比
引理
解释
更多的位置使用它吗?你可以将
用于
定理
,这类似于
引理
;使用
感应式
感应式
来固定参数;以及出现在
解释(解释)
子本地化
语言环境中的内部语言环境表达式…=。。。为了+