我开始学习伊莎贝尔,想尝试在伊莎贝尔中定义一个幺半群,但不知道如何。
在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中使用类型参数定义归纳谓词?
答案 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
类型类,然后将其实例化为具体类型,如nat
,int
,{{1等等。
有关归纳谓词,语言环境和类型类的更多信息,请参阅这些工具的文档:http://isabelle.in.tum.de/documentation.html