将简化器应用于任意术语

时间:2015-01-26 14:56:27

标签: isabelle

我有一个术语,说"foo 1 2 a b",我想知道Isabelle能否为我简化它。我想写点像

simplify "foo 1 2 a b"

并在输出缓冲区中打印简化术语。这可能吗?

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

lemma "foo 1 2 a b = blah"
apply simp

工作正常,但看起来有点hacky。

什么不起作用(在我的情况下)是:

value "foo 1 2 a b"

因为ab是未绑定的变量,并且因为我的foo涉及无限集和其他花哨的东西,代码生成器会扼杀它。

2 个答案:

答案 0 :(得分:3)

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

或者,您可以通过属性[simplified]调用简化器。这可以通过thm命令在所有上下文中工作,并在输出缓冲区中生成输出。首先,必须将该术语注入一个定理,然后您可以将simplify应用于该定理并使用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]

并在输出窗口中查看简化术语。

评估机制可能不是您想要的,因为评估使用的是一组不同的重写规则(即代码方程式),而不是简化器通常使用的(simpset)。因此,这可能会通过应用简化器来评估不同的术语。要查看差异,请在code_simp的方法中应用simp而不是lemma "foo 1 2 a b = blah"。证明方法code_simp使用的代码方程就像value [simp]一样。

答案 1 :(得分:1)

使用value命令时,参数的评估由注册评估员进行(参见Isabelle2013-2的Reference Manual)。

以前可以通过为value命令提供额外的参数来明确选择以前版本的Isabelle中的评估者(例如,Isabelle2013-2)。如,

value [simp] "foo 1 2 a b"

似乎在Isabelle2014中这个参数被删除,并且根据Isabelle2014的Reference Manual,该策略现在固定为首次使用ML代码生成,如果失败,则通过评估进行标准化。

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

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