Isabelle中具有类型参数的归纳谓词

时间:2015-02-12 07:28:35

标签: coq isabelle type-parameter

我开始学习伊莎贝尔,想尝试在伊莎贝尔中定义一个幺半群,但不知道如何。

在Coq,我会做这样的事情:

Inductive monoid (τ : Type) (op: τ -> τ -> τ) (i: τ): Prop :=
| axioms: (forall (e: τ), op e i = e) ->
          (forall (e: τ), op i e = e) ->
          monoid τ op i.

我不确定如何在伊莎贝尔做同样的事情。从概念上讲,我想到了这样的事情:

inductive 'a monoid "('a ⇒ 'a ⇒ 'a) ⇒ 'a ⇒ bool" for f i where
  axioms: "⟦f e i = e; f i e = e⟧ ⇒ monoid f i"

但是,这在Isabelle中无效。

如何在Isabelle中使用类型参数定义归纳谓词?

1 个答案:

答案 0 :(得分:6)

我对Coq知之甚少,但Isabelle的类型系统非常不同。 Isabelle值不采用'类型参数',而Isabelle类型不采用'值参数'。

在Isabelle中,您的示例是一个简单的多态定义,可以这样做:

inductive monoid :: "('a ⇒ 'a ⇒ 'a) ⇒ 'a ⇒ bool" for f i where
  axioms: "⟦f e i = e; f i e = e⟧ ⟹ monoid f i"

我必须指出,这意味着如果存在甚至一个 e,那么你就拥有了一个monoid。您可能想写的是

inductive monoid :: "('a ⇒ 'a ⇒ 'a) ⇒ 'a ⇒ bool" for f i where
  axioms: "⟦⋀e. f e i = e; ⋀e. f i e = e⟧ ⟹ monoid f i"

在这里,e在假设中被普遍量化,这意味着法律必须为所有 e保留才能构成一个幺半群。

这样做可以作为归纳定义,并且具有自动生成适当的引入/消除规则的优势(以及使用inductive_cases生成更多规则的能力)。但是,还有其他方法。

使用定义

但是,你也可以把它写成一个简单的定义:

definition monoid :: "('a ⇒ 'a ⇒ 'a) ⇒ 'a ⇒ bool" where
  "monoid f i = ((∀e. f e i = e) ∧ (∀e. f i e = e))"

这为您提供了monoid作为引理monoid_def的定义。如果你想要引入/删除规则,你必须自己推导它们。

使用区域设置

第三种,也许是最合适的解决方案是 locales 。区域设置是在上下文中保持某些固定变量和假设的方式。下面的示例演示如何将monoid定义为语言环境,在该语言环境中派生lemmas,然后解释具体示例monoid(即列表)的语言环境,并使用我们在语言环境中为它们证明的引理。

locale monoid =
  fixes i :: 'a and f :: "'a ⇒ 'a ⇒ 'a"
  assumes left_neutral:  "f i e = e"
      and right_neutral: "f e i = e"
begin
  lemma neutral_unique_left:
    assumes "⋀e. f i' e = e"
    shows   "i' = i"
  proof-
    from right_neutral have "i' = f i' i" by simp
    also from assms have "f i' i = i" by simp
    finally show "i' = i" .
  qed
end

thm monoid.neutral_unique_left
(* Output: monoid i f ⟹ (⋀e. f i' e = e) ⟹ i' = i *)

(* Let's interpret our monoid for the type "'a list", with [] 
   as neutral element and concatenation (_ @ _) as the operation. *)
interpretation list_monoid: monoid "[]" "λxs ys. xs @ ys"
  by default simp_all

thm list_monoid.neutral_unique_left
(* Output: (⋀e. i' @ e = e) ⟹ i' = [] *)

使用类型类

第四种可能性,类似于类型类的locales。 Isabelle支持类型类(如Haskell中的那些类,虽然限制性更强),您可以创建一个monoid类型类,然后将其实例化为具体类型,如natint,{{1等等。

更多信息

有关归纳谓词,语言环境和类型类的更多信息,请参阅这些工具的文档:http://isabelle.in.tum.de/documentation.html