我有一个术语,说"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"
因为a
和b
是未绑定的变量,并且因为我的foo
涉及无限集和其他花哨的东西,代码生成器会扼杀它。
答案 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
相同的简化规则集。因此,即使可用,我上面描述的解决方案也很可能不会产生您想要的结果。