Upgrade to Pro — share decks privately, control downloads, hide ads and more …

IsoTypes or Formalization of the isomorphism of...

IsoTypes or Formalization of the isomorphism of typed constructs of the different computing environments (namely Coq and Haskell)

Sergey Kazenyuk

April 27, 2017
Tweet

More Decks by Sergey Kazenyuk

Other Decks in Research

Transcript

  1. Категория (recall) Категорией C называется следующая совокупность определений: • Класс

    объектов Ob c (|C|); • Каждой паре объектов A,B из Ob c ставится в соответствие множество морфизмов (или стрелок) Hom(A,B); • Для каждой пары морфизмов f∈Hom(A,B), g∈Hom(B,C) определен морфизм, называемый композицией f∘g∈Hom(A,C); • Для каждого объекта A существует тождественный морфизм id A ∈Hom(A,A). Данный факт, в частности, позволяет обойтись без отдельного класса объектов, считая что они заданы своими тождественными морфизмами; • Операция композиции ассоциативна f∘(g∘h) = (f∘g)∘h; • Тождественная стрелка действует тривиально f∘id A = id B ∘f = f, f∈Hom(A,B).
  2. Вычислительные среды Например, Coq <-> Haskell Задача: Разработана и доказаны

    свойства программы на Coq. Однако основной код (runtime) должен быть реализован как Haskell программа. Прямой перенос типизации из Coq в Haskell при экстракции неприемлем ввиду, например, алгоритмической неэффективности арифметики Пеано. Как перенести код с возможными заменами Coq типов на другие и быть уверенным, что свойства программы останутся?
  3. Изотипы Class IsoTypes (X Y: Type) := { x2y: X

    -> Y; (*функция*) y2x: Y -> X; x2x: x2y ∘ y2x = id; (*свойство*) y2y: y2x ∘ x2y = id }. Например X = Z@Coq, Y = Integer@Haskell
  4. Изофункции Class IsoFunctions {X1 Y1 X2 Y2} `{IsoTypes X1 X2}`{IsoTypes

    Y1 Y2} (f: X1 -> Y1) (g: X2 -> Y2) := { fg: x2y ∘ f = g ∘ x2y; gf: y2x ∘ g = f ∘ y2x }.
  5. Стрелочные изотипы Lemma isofunx {X1 Y1 X2 Y2 : Type}`{IsoTypes

    X1 X2}`{IsoTypes Y1 Y2}: (fun f : X1 → Y1 ⇒ x2y ∘ f ∘ y2x) ∘ (fun g : X2 → Y2 ⇒ y2x ∘ g ∘ x2y) = id. Lemma isofuny {X1 Y1 X2 Y2 : Type}`{IsoTypes X1 X2}`{IsoTypes Y1 Y2}: (fun g : X2 → Y2 ⇒ y2x ∘ g ∘ x2y) ∘ (fun f : X1 → Y1 ⇒ x2y ∘ f ∘ y2x) = id. Instance isofun (X1 Y1 X2 Y2 : Type)`{IsoTypes X1 X2}`{IsoTypes Y1 Y2}: IsoTypes (X1 → Y1) (X2 → Y2) := { x2y := fun f ⇒ x2y ∘ f ∘ y2x; y2x := fun g ⇒ y2x ∘ g ∘ x2y; x2x := isofunx; y2y := isofuny }.
  6. Трансфуцирование Definition transfun {X Y}`{IsoTypes X Y} (f: X) :

    Y := x2y f. Lemma isotrans1 {X1 Y1 X2 Y2}`{IsoTypes X1 X2}`{IsoTypes Y1 Y2}: ∀ (f: X1 → Y1), x2y ∘ f = (transfun f) ∘ x2y. Lemma isotrans2 {X1 Y1 X2 Y2}`{IsoTypes X1 X2}`{IsoTypes Y1 Y2} : ∀ (f: X1 → Y1), y2x ∘ (transfun f) = f ∘ y2x. Instance isotrans {X1 Y1 X2 Y2}`{IsoTypes X1 X2}`{IsoTypes Y1 Y2} (f: X1 → Y1): IsoFunctions f (transfun f) := { fg := isotrans1 f; gf := isotrans2 f }.
  7. Тождественность свойств Lemma isoprop {X Y}`{IsoTypes X Y} (P: X

    → Prop) (x: X): P x ↔ (transfun P) (x2y x). Proof. split. intros. unfold transfun. unfold x2y. unfold isofun. destruct H. unfold x2y. unfold isoid. unfold y2x. unfold compose. unfold id. replace (y2x0 (x2y0 x)) with ((y2x0 ∘ x2y0) x). rewrite y2y0. auto. auto. unfold transfun. unfold x2y. unfold isofun. destruct H. unfold x2y. unfold isoid. unfold y2x. unfold compose. unfold id. replace (y2x0 (x2y0 x)) with ((y2x0 ∘ x2y0) x). rewrite y2y0. auto. auto. Qed.
  8. Полиморфные функции Lemma isofa1: ∀ {F Y1 Y2}`{IsoTypes Y1 Y2},

    (fun (f: ∀ (T:Type), F T → Y1) ⇒ (fun t x ⇒ x2y (f t x))) ∘ (fun g ⇒ (fun t y ⇒ y2x (g t y))) = id. Lemma isofa2: ∀ {F Y1 Y2}`{IsoTypes Y1 Y2}, (fun g ⇒ (fun t y ⇒ y2x (g t y))) ∘ (fun (f: ∀ (T:Type), F T → Y1) ⇒ (fun t x ⇒ x2y (f t x))) = id. Instance isoforall {F Y1 Y2}`{IsoTypes Y1 Y2}: IsoTypes (∀ (T: Type), F T → Y1) (∀ (T: Type), F T → Y2) | 1:= { x2y := fun f ⇒ (fun t x ⇒ x2y (f t x)); y2x := fun g ⇒ (fun t y ⇒ y2x (g t y)); x2x := isofa1 ; y2y := isofa2 }.
  9. Полиморфные функции и функторы Специальным видом полиморфных функций являются преобразования

    функторов, например: • List a -> List a • List a -> Maybe a • List a -> a (= Id a) “Трансфуцирование” таких функций можно рассмотреть в более конструктивном ключе, рассмотрев диаграмму естественного преобразования.
  10. Естественное преобразование (recall) Связь между функторами выражает понятие естественного преобразования:

    для двух функторов F,G : C → D естественным преобразованием называется совокупность отображений X : F(X) → G(X) в категории D, делающих следующую диаграмму коммутативной:
  11. Лемма Йонеды на примерах Как “конструктивно“ представить такие преобразования 1.

    (List n) a -> Id a (=a). Nat (HFin n, Id) = Id (Fin n) = Fin n. Каждое преобразование соответствует какому-то из элементов с определенным индексом. 2. (List n) a -> (List m) a. Nat (HFin n, HFin m) = HFin m (Fin n) = Fin (nm). 3. CoList a -> CoList a Nat (Hnat, Hnat) = Hnat (nat) = Auto (nat). 4. CoList a -> Maybe a Nat (Hnat, Maybe) = Maybe nat “Tрансфуцирование” подобных преобразований сводится к выбору экземпляра выведенного типа
  12. Coq → Haskell Extraction Definition on_cmpMaybeX_false_hs := @on_cmpMaybeX_false HBool HMaybe

    maybeFunRec. Extraction Language Haskell. Extraction "../out/Demo.hs" demo0_hs on_cmpMaybeX_false_hs. Parameters HInteger HString HBool: Type. Parameter HList : Type → Type. Parameter HMaybe : Type → Type. Parameter HProd : Type → Type → Type.
  13. Generators: Bool Class boolFunRec_gen (XBool: Type) := { xBoolFalse: XBool;

    xBoolTrue: XBool; xBoolIfElse: ∀ {X}, XBool → X → X → X }. Instance boolFunRec : boolFunRec_gen HBool := {| xBoolFalse := hBoolFalse; xBoolTrue := hBoolTrue; xBoolIfElse := @hBoolIfElse |}. Instance boolFunRec : boolFunRec_gen bool := {| xBoolFalse := false; xBoolTrue := true; xBoolIfElse := fun _ b x y ⇒ if b then x else y |}.
  14. Instance intFunRec : intFunRec_gen HInteger := {| xInt0 := intConst0;

    xIntPlus := hIntPlus; xIntMinus := hIntMinus; xIntMax := hIntMax; xIntLtb := hIntLtb; xIntLeb := hIntLeb; xIntGeb := hIntGeb; xIntGtb := hIntGtb; xIntEqb := hIntEqb |}. Generators: Int Class intFunRec_gen {XBool: Type} (XInteger: Type) := { xiBoolFunRec :> boolFunRec_gen XBool; xInt0: XInteger; xIntPlus: XInteger → XInteger → XInteger; xIntMinus: XInteger → XInteger → XInteger; xIntMax: XInteger → XInteger → XInteger; xIntLtb: XInteger → XInteger → XBool; xIntLeb: XInteger → XInteger → XBool; xIntEqb: XInteger → XInteger → XBool; xIntGtb: XInteger → XInteger → XBool; xIntGeb: XInteger → XInteger → XBool }. Instance intFunRec : intFunRec_gen Z := {| xInt0 := 0%Z; xIntPlus := Z.add; xIntMinus := Z.sub; xIntMax := Z.max; xIntLtb := Z.ltb; xIntLeb := Z.leb; xIntEqb := Z.eqb; xIntGtb := Z.gtb; xIntGeb := Z.geb |}.
  15. Generators: Maybe Class maybeFunRec_gen {XBool: Type} (XMaybe: Type → Type)

    := { xmBoolFunRec :> boolFunRec_gen XBool; xMaybeIsNone: ∀ {A: Type}, XMaybe A → XBool; xMaybeIsSome: ∀ {A: Type}, XMaybe A → XBool; xMaybeNone: ∀ {A: Type}, XMaybe A; xMaybeSome: ∀ {A: Type}, A → XMaybe A; xMaybeMap: ∀ {A B : Type}, (A → B) → XMaybe A → XMaybe B; xMaybeMaybe: ∀ {A: Type}, XMaybe (XMaybe A) → XMaybe A; xMaybeMapDefault: ∀ {A B : Type}, (A → B) → XMaybe A → B → B; xMaybeMap2Strict: ∀ {A B C}, (A → B → C) → XMaybe A → XMaybe B → XMaybe C; xMaybeWeakCmp: ∀ {A}, (A → A → XBool) → XMaybe A → XMaybe A → XMaybe XBool; xMaybeStrictCmp: ∀ {A}, (A → A → XBool) → XMaybe A → XMaybe A → XBool }. Instance maybeFunRec : maybeFunRec_gen HMaybe := {| xMaybeIsNone := @hMaybeIsNone; xMaybeIsSome := @hMaybeIsSome; xMaybeNone := @hMaybeNone; xMaybeSome := @hMaybeSome; xMaybeMap := @hMaybeMap; xMaybeMapDefault := @hMaybeMapDefault; xMaybeMaybe := @hMaybeMaybe; xMaybeWeakCmp := @hMaybeWeakCmp; xMaybeStrictCmp := @hMaybeStrictCmp; xMaybeMap2Strict := @hMaybeMap2Strict |}.
  16. Generators: List Class listFunRec_gen {XBool XInteger: Type} {XMaybe: Type →

    Type} (XList: Type → Type) := { xlBoolFunRec :> boolFunRec_gen XBool; xlMaybeFunRec :> @maybeFunRec_gen XBool XMaybe; xlIntFunRec :> @intFunRec_gen XBool XInteger; xListNil: ∀ {A: Type}, XList A; xListPut: ∀ {X}, X → XList X; xListCons: ∀ {X}, X → XList X → XList X; xListIsNil: ∀ {A: Type}, XList A → XBool; xListIn: ∀ {A: Type}, (A → A → XBool) → A → XList A → XBool; xListOptionIn: ∀ {A: Type}, (A → A → XBool) → XMaybe A → XList A → XBool; xListFoldLeft: ∀ {A B : Type}, (A → B → A) → XList B → A → A; xListApp: ∀ {A : Type}, XList A → XList A → XList A; xListMap: ∀ {A B : Type}, (A → B) → XList A → XList B; xListFilter: ∀ {A : Type}, (A → XBool) → XList A → XList A; xListHead : ∀ {A : Type}, XList A → XMaybe A; xListLength : ∀ {A : Type}, XList A → XInteger }. Instance listFunRec : listFunRec_gen HList := {| xListNil := @hListNil; xListPut := @hListPut; xListCons := @hListCons; xListIsNil := @hListIsNil; xListIn := @hListIn; xListOptionIn := @hListOptionIn; xListFoldLeft := @hListFoldLeft; xListApp := @hListApp; xListMap := @hListMap; xListFilter := @hListFilter; xListHead := @hListHead; xListLength := @hListLength |}.
  17. Definition on_cmpMaybeX_bool {XBool XMaybe} `{maybeFunRec_gen XBool XMaybe} {X} (xcmp: X

    → X → XBool) (xBool: XBool) (ma : XMaybe X) (mb: XMaybe X) : XBool := xMaybeMapDefault (fun b ⇒ xMaybeMapDefault (fun a ⇒ xcmp a b) ma xBool) mb xBoolTrue. Definition on_cmpMaybeX_false {XBool XMaybe} `{maybeFunRec_gen XBool XMaybe} {X} cmp := on_cmpMaybeX_bool (X:=X) cmp xBoolFalse. @on_cmpMaybeX_false HBool HMaybe maybeFunRec
  18. Definition somefun_gen (xInt: Type) (xPlus: xInt → xInt → xInt)

    (a b: xInt) := xPlus a (xPlus a b). Lemma somefun_trans_fg {X Y} (ixy: IsoTypes X Y) (f: X → X → X) (g: Y → Y → Y): g = transfun f → transfun (somefun_gen X f) = (somefun_gen Y g). Proof. intros. rewrite H. compute. destruct ixy. extensionality a. extensionality b. replace (y2x0 (x2y0 (f (y2x0 a) (y2x0 b)))) with ((y2x0 ∘ x2y0) (f (y2x0 a) (y2x0 b))). rewrite y2y0. auto. auto. Qed. Примеры генераторов
  19. Definition argStrictMaxListStart {XBool XInteger XMaybe XList} `{listFunRec_gen XBool XInteger XMaybe

    XList} {X Y} (yGte: Y → Y → XBool) (stv: XMaybe X) (f : X → Y) (l: XList X) : XMaybe X := xListFoldLeft (fun res p ⇒ let b := xMaybeMapDefault (fun r ⇒ yGte (f r) (f p)) res xBoolFalse in xBoolIfElse b res (xMaybeSome p)) l stv. Definition argStrictMaxList {XBool XInteger XMaybe XList} `{listFunRec_gen XBool XInteger XMaybe XList} {X Y} (yGte: Y → Y → XBool) (f : X → Y) (l: XList X) : XMaybe X := argStrictMaxListStart yGte xMaybeNone f l. Примеры генераторов