如何在语言环境中定义归纳谓词?

时间:2017-09-05 12:41:25

标签: isabelle

以下是一个简单的语言环境示例:

locale test =
  fixes test_less_eq :: "'a ⇒ 'a ⇒ bool"
begin

inductive test_eq where
  "test_less_eq x y ⟹ test_less_eq y x ⟹ test_eq x y"

end

它定义了归纳test_eq。它可以使用definition定义,但我需要它作为归纳谓词。

然后我定义了对语言环境的简单解释并尝试使用它:

interpretation interp: test "op <" .

inductive some_pred where
  "interp.test_eq x y ⟹
   some_pred x y"

code_pred [show_modes] some_pred .

问题是我收到code_pred的以下错误:

Type mismatch of predicate test.test_eq (trying to match ?'a
                   ⇒ ?'a ⇒ bool and ('a ⇒ 'a ⇒ bool)
                                      ⇒ 'a ⇒ 'a ⇒ bool) in ?x1 < ?y1 ⟹
          ?y1 < ?x1 ⟹ interp.test_eq ?x1 ?y1

错误的原因是什么以及如何解决?

1 个答案:

答案 0 :(得分:1)

谓词编译器从未被本地化,即它不能直接处理在语言环境中定义的谓词。不过,有两种方法可以完成这项工作。

或者,使用带有global_interpretation子句的defines为谓词引入新常量(plain interpretation仅引入缩写)。然后,您还必须将引入规则重新声明为code_pred并证明相应的排除规则。

global_interpretation interp: test "op <" 
  defines interp_test_eq = interp.test_eq .

declare interp.test_eq.intros[code_pred_intro]

code_pred interp_test_eq by(rule interp.test_eq.cases)

或者,将解释保留为原样,并重新声明内部常量的引入规则,区域设置中的定义将映射到该规则。这是<locale_name>.<predicate_name>,即您的test.test_eq。这仅适用于您的语言环境没有假设的情况。

declare test.test_eq.intros[code_pred_intro]

code_pred test.test_eq by(rule test.test_eq.cases)