我想在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'
答案 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'"
。)