Isabelle 对任意项应用简化器

Isabelle 对任意项应用简化器,isabelle,Isabelle,我脑子里有一个词,比如说“foo 1 2 a b”,我想知道伊莎贝尔能否为我简化一下。我想写一些像这样的东西 simplify "foo 1 2 a b" 并在输出缓冲区中打印简化术语。这可能吗 我目前的“解决办法”是: lemma "foo 1 2 a b = blah" apply simp 它工作正常,但看起来有点粗糙 不起作用的(就我而言)是: 因为a和b是未绑定的变量,而且因为myfoo涉及无限集和其他奇特的东西,代码生成器会阻塞这些东西。当使用value命令时,参数的求值是由注册

我脑子里有一个词,比如说
“foo 1 2 a b”
,我想知道伊莎贝尔能否为我简化一下。我想写一些像这样的东西

simplify "foo 1 2 a b"
并在输出缓冲区中打印简化术语。这可能吗

我目前的“解决办法”是:

lemma "foo 1 2 a b = blah"
apply simp
它工作正常,但看起来有点粗糙

不起作用的(就我而言)是:


因为
a
b
是未绑定的变量,而且因为my
foo
涉及无限集和其他奇特的东西,代码生成器会阻塞这些东西。

当使用
value
命令时,参数的求值是由注册的求值器进行的(请参见Isabelle 2013-2的说明)

在以前版本的Isabelle(例如,Isabelle2013-2)中,通过为
value
命令提供额外参数,可以显式选择计算器。例如:

value [simp] "foo 1 2 a b"
在Isabelle2014中,似乎删除了该参数,根据Isabelle2014的定义,该策略现在固定为首先使用ML代码生成,如果失败,则通过评估进行规范化

从Isabelle开发版本(e82c72f3b227)中的文件来看,似乎在即将发布的Isabelle版本中将再次启用此参数


更新:正如Andreas指出的那样,
value[simp]
没有使用与
apply simp
相同的简化规则集。因此,即使可用,我上面描述的解决方案也很可能不会产生您想要的结果。

AFAIK没有内置功能,但有几种方法可以实现这一点。您已经发现了其中之一,即将术语表示为引理,然后调用简化器。缺点是这不能在所有上下文中使用,例如,不能在apply-proof脚本中使用

或者,您可以通过属性
[simplified]
调用简化器。它通过thm命令在所有上下文中工作,并在输出缓冲区中生成输出。首先,必须将该项注入到定理中,然后可以将
简化
应用于该定理,并使用
thm
显示结果。这是一些准备材料,可以进入你的杂七杂八的理论

definition simp :: "'a ⇒ bool" where "simp _ = True"
notation (output) simp ("_")
lemma simp: "simp x" by(simp add: simp_def)
然后,你就可以写了

thm simp[of "foo 1 2 a b", simplified]
并查看输出窗口中的简化术语


求值机制可能不是您想要的,因为求值使用的重写规则集(即代码方程)与Simplier通常使用的重写规则集(simpset)不同。因此,与应用简化器相比,这可能是一个不同的术语。要查看差异,请在使用
引理“foo 1 2 a b=blah”的方法中应用
code\u simp
而不是
simp
。证明方法
code\u simp
使用的代码方程与以前的
value[simp]
一样。

谢谢chris。我原以为
value[simp]
会起作用,并且几乎把它包括在我的“我尝试过的事情列表”中,所以你的答案说明了为什么它不起作用,这对我很有帮助。
thm simp[of "foo 1 2 a b", simplified]