伊莎贝尔/伊萨尔邦的仿函子构造

时间:2019-03-06 19:08:57

标签: isabelle isar

这是一个数学小定理:

假设u不是A的元素,v不是B的元素,并且f是从A到B的内射函数。令A'=联合{u},B'= B联合{v} ,并定义g:如果x在A中且g(u)= v,则通过g(x)= f(x)定义A'-> B'。

如果我正在编写类似OCaml的代码,则将A和B表示为类型,将f表示为A-> B函数,类似

module type Q = 
  sig
   type 'a
   type 'b
   val f: 'a -> 'b
  end

然后定义一个函子

module Extend (M : Q) : Q = 
  struct
    type a = OrdinaryA of M.a | ExoticA
    type b = OrdinaryB of M.b | ExoticB
    let f x = match x with
        OrdinaryA t -> OrdinaryB ( M.f t)
      | Exotic A -> ExoticB
  end;;

和我的定理是,如果Q.f是内生的,那么(Extend Q).f也是内射的,我希望我的语法大致正确。

我想在Isabelle / Isar中做同样的事情。通常,这意味着写类似

的东西
definition injective :: "('a  ⇒ 'b)  ⇒ bool"
  where "injective f  ⟷ ( ∀ P Q.  (f(P) = f(Q)) ⟷ (P = Q))" 

proposition: "injective f ⟹ injective (Q(f))"

Q是……。我不知道如何在Isabelle中进行类似于OCaml中的仿函数Q的单个操作,该操作创建两个新的数据类型以及它们之间的函数。内射性的证明似乎很简单-仅是四格拆分。但在给定功能Q f的情况下,我想帮助定义我称为f的新功能。

1 个答案:

答案 0 :(得分:1)

这是一个解决方案。我试图为函数Q定义一个“定义”,但是不能这样做;相反,创建一个常数Q(与map十分相似)让我陈述和证明定理:

theory Extensions
  imports Main
begin
text ‹We show that if we have f: 'a → 'b that's injective, and we extend 
both the domain and codomain types by a new element, and extend f in the 
obvious way, then the resulting function is still injective.›
  definition injective :: "('a  ⇒ 'b)  ⇒ bool"
    where "injective f  ⟷ ( ∀ P Q.  (f(P) = f(Q)) ⟷ (P = Q))" 

datatype 'a extension = Ordinary 'a | Exotic

fun Q ::  "('a  ⇒ 'b) ⇒ (('a extension)  ⇒ ('b extension))"  where 
   "Q f (Ordinary u) = Ordinary (f u)" |
   "Q f (Exotic) = Exotic"

lemma "⟦injective f⟧ ⟹ injective (Q f)"
  by (smt Q.elims extension.distinct(1) extension.inject injective_def)

end