объектов 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).
свойства программы на Coq. Однако основной код (runtime) должен быть реализован как Haskell программа. Прямой перенос типизации из Coq в Haskell при экстракции неприемлем ввиду, например, алгоритмической неэффективности арифметики Пеано. Как перенести код с возможными заменами Coq типов на другие и быть уверенным, что свойства программы останутся?
(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 }.
функторов, например: • List a -> List a • List a -> Maybe a • List a -> a (= Id a) “Трансфуцирование” таких функций можно рассмотреть в более конструктивном ключе, рассмотрев диаграмму естественного преобразования.
для двух функторов F,G : C → D естественным преобразованием называется совокупность отображений X : F(X) → G(X) в категории D, делающих следующую диаграмму коммутативной:
(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рансфуцирование” подобных преобразований сводится к выбору экземпляра выведенного типа
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 |}.
(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. Примеры генераторов
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. Примеры генераторов