locale中的code_pred

时间:2013-03-09 15:55:21

标签: isabelle

我想在inductive中创建可执行文件locale。如果没有locale,一切正常:

definition "P a b = True"

inductive test :: "'a ⇒ 'a ⇒ bool" where
  "test a a" |
  "test a b ⟹ P b c ⟹ test a c" 

code_pred test .

但是,当我在locale中尝试相同时,它不起作用:

locale localTest
begin
definition "P' a b = True"

inductive test' :: "'a ⇒ 'a ⇒ bool" where
  "test' a a" |
  "test' a b ⟹ P' b c ⟹ test' a c" 

code_pred test' 
end

语言环境中的code_pred行返回以下错误:

Not a constant: test'

3 个答案:

答案 0 :(得分:2)

表达得很糟糕,locales是一种抽象机制,允许相对于满足假设属性的某些假设常量引入新常量,而代码生成更具体(您需要实现函数所需的所有信息,而不仅仅是它的抽象规范)。

因此,在生成代码之前,首先需要解释语言环境。当然,在你的例子中没有假设的常量和属性,因此解释是微不足道的

interpretation test: localTest .

之后,您可以使用

code_pred test.test' .

答案 1 :(得分:2)

您可以提供其他介绍规则(请参阅isabelle doc codegen第4.2节:替代介绍规则),从而避免解释。这也适用于带参数的语言环境(甚至适用于未定义的常量)。您的示例的变体有一个参数:

locale l =
  fixes A :: "'a set"
begin
definition "P a b = True"

inductive test :: "'a ⇒ 'a ⇒ bool" where
  "a ∈ A ⟹ test a a" |
  "test a b ⟹ P b c ⟹ test a c" 
end

我们引入一个新常量

definition "foo A = l.test A"

并证明其引入规则(因此新的常数是旧的常数。)

lemma [code_pred_intro]:
  "a ∈ A ⟹ foo A a a"
  "foo A a b ⟹ l.P b c ⟹ foo A a c"
  unfolding foo_def by (fact l.test.intros)+

最后,我们必须证明新常量也是完整的w.r.t.旧的:

code_pred foo by (unfold foo_def) (metis l.test.simps)

答案 2 :(得分:0)

在这里完成猜测,但我想知道将test重命名为test'是否已经搞砸了。 (考虑将code_pred test'更改为code_pred "test'"。)