A Theory of Pure Categories
Overview
Two new types are introduced in HOL, C and F of pure categories and functors respectively. Axioms are asserted to make these into a foundation for mathematics with strength similar to ZFC + infinitely many inaccessibles. The initial stages of the development of mathematics in this system are presented.
A new "pc" theory is created as a child of "hol".
This is a place holder.
Introduction
A new "pc" theory is created as a child of "hol".
The Theory pc
The new theory is first created, together with a proof context which we will build up as we develop the theory.
xl-sml
open_theory "hol";
force_new_theory "pc";
force_new_pc "pc";
merge_pcs ["xl_cs_exist.gif_conv"] "pc";
set_merge_pcs ["hol", "pc"];

New Types

xl-sml
new_type("C",0);
new_type("F",0);

Composition and Application

In this theory we have available both composition and application. Probably one can manage with only composition, but its easier for me to have both.


xl-sml
declare_infix (240, "o");
new_const("o",qqco.gifF rarr.gif F rarr.gif Fqqter.gif);
declare_infix (240, "a");
new_const("a",qqco.gifF rarr.gif F rarr.gif Fqqter.gif);

We also have a membership relation which asserts that a morphism is a member of a category.
xl-sml
declare_infix (240, "isin.giff");
new_const("isin.giff",qqco.gifF rarr.gif C rarr.gif BOOLqqter.gif);

Before we can say much at all we also need the domain and codomain functions. These yield objects (categories) not morphisms (functors) and an injection morphism function is also provided.
xl-sml
new_const("dom",qqco.gifF rarr.gif Cqqter.gif);
new_const("cod",qqco.gifF rarr.gif Cqqter.gif);
new_const("inj",qqco.gifC rarr.gif (F rarr.gif BOOL) rarr.gif Fqqter.gif);

Identity functors are special cases of injections defined as follows:
xl-holconst
╷ id: C rarr.gif F
forall.gifc: Cbull.gif id c = inj c (lambda.giffbull.gifT)
We are now in a position to give the first axioms. First we assert that functors and categories are extensional.
xl-sml
val cat_ext_axiom = new_axiom (["cat_ext_axiom"], qqtel.gif
ftbr forall.gifc1 c2:Cbull.gif (forall.giff:Fbull.gif f isin.giff c1 equiv.gif f isin.giff c2) ruarr.gif c1=c2
qqter.gif);
val fun_ext_axiom = new_axiom (["fun_ext_axiom"], qqtel.gif
ftbr forall.giff1 f2:Fbull.gif dom f1 = dom f2 and.gif cod f1 = cod f2
fttaband.gif (forall.gifg:Fbull.gif g isin.giff dom f1 ruarr.gif f1 a g = f2 a g)
fttabruarr.gif f1=f2
qqter.gif);

Composition is given as a total function rather than a partial one. The axioms will however speak only about the values of the function in the cases where the partial composition we expect in categories would be defined. That is reflected first in the axiom which asserts that composition is associative.
xl-sml
val comp_assoc_axiom = new_axiom (["comp_assoc_axiom"], qqtel.gif
ftbr forall.giff1 f2 f3:Fbull.gif cod f1 = dom f2 and.gif cod f2 = dom f3
fttabruarr.gif (f1 o f2) o f3 = f1 o (f2 o f3)
qqter.gif);

Two key properties of categories and functors respectively are now asserted, viz. that categories are closed under composition and functors respect composition.
xl-sml
val cat_comp_axiom = new_axiom (["cat_comp_axiom"], qqtel.gif
ftbr forall.gifc: C; f1 f2:Fbull.gif f1 isin.giff c and.gif f2 isin.giff c and.gif cod f1 = dom f2
fttabruarr.gif (f1 o f2) isin.giff c
qqter.gif);
val func_comp_axiom = new_axiom (["func_comp_axiom"], qqtel.gif
ftbr forall.giff f1 f2:Fbull.gif f1 isin.giff (dom f) and.gif f2 isin.giff (dom f) and.gif cod f1 = dom f2
fttabruarr.gif f a (f1 o f2) = (f a f1) o (f a f2)
qqter.gif);

Categories are also closed under left and right identity. First we define membership as a relation between categories.
xl-sml
declare_infix (240, "isin.gifc");


xl-holconst
╷ $isin.gifc: C rarr.gif C rarr.gif BOOL
forall.gifc1 c2: Cbull.gif c1 isin.gifc c2 equiv.gif (id c1) isin.giff c2

xl-sml
val cat_id_axiom = new_axiom (["cat_id_axiom"], qqtel.gif
ftbr forall.gifc: C; f:Fbull.gif f isin.giff c
fttabruarr.gif (dom f) isin.gifc c and.gif (cod f) isin.gifc c
qqter.gif);

The following axiom tells us that, given a category c and a predicate p over functors which defines a subcategory of c, qqtel.gifinj c pqqter.gif is a functor which injects that subcategory into c. This is not only an injection in the sense of a one-one function, but also an identity functor.
xl-sml
val injection_axiom = new_axiom (["injection_axiom"], qqtel.gif
ftbr forall.gifc: C; p: F rarr.gif BOOLbull.gif
fttab(forall.giff g: Fbull.gif f isin.giff c and.gif g isin.giff c and.gif p f and.gif p g ruarr.gif p (f o g))
fttaband.gif (forall.giff: Fbull.gif f isin.giff c and.gif p f ruarr.gif p (id (dom f)) and.gif p (id (cod f)))
fttabruarr.gif (forall.giff: Fbull.gif f isin.giff (dom (inj c p)) equiv.gif p f)
fttaband.gif (forall.giff: Fbull.gif f isin.giff (dom (inj c p)) ruarr.gif (inj c p) a f = f)
fttaband.gif cod (inj c p) = c
qqter.gif);

The next axiom asserts well-foundedness. It is probably unnecessary for the development of mathematics in this system, but is valuable in giving insight into the underlying model which has inspired the rest of the axioms.
xl-sml
val well_founded_axiom = new_axiom (["well_founded_axiom"], qqtel.gif
ftbr forall.gifpc:C rarr.gif BOOL; pf: F rarr.gif BOOLbull.gif
fttab(forall.gifc:Cbull.gif (forall.giff:Fbull.gif f isin.giff c ruarr.gif pf f) ruarr.gif pc c)
ftbr and.giffttab(forall.giff:Fbull.gif (pc (dom f) and.gif pc (cod f)) ruarr.gif pf f)
fttabruarr.gif (forall.gifc:Cbull.gif pc c) and.gif (forall.giff:Fbull.gif pf f)
qqter.gif);

Dependent Functor Spaces
The "dependent functor space constructor" plays a key role in getting this theory up to a decent level of strength.
The Constructor

The dependent function space constructor is an operator which takes a category and a function over that category assigning to each morphism in the category a category. The operator yields a new category which contains just two objects. The first object is the original category. The second object is the union of the the image of that category (considered as a set of morphisms) under the function. The arrows in the new category are "dependent functions".


xl-sml
new_const("lambda.gifc",qqco.gif(F rarr.gif F) rarr.gif C rarr.gif Fqqter.gif);
new_const("ulambda.gifc",qqco.gif(F rarr.gif C) rarr.gif C rarr.gif Cqqter.gif);


xl-sml
val beta_axiom = new_axiom (["beta_axiom"], qqtel.gif
ftbr forall.gifc:C; lam: F rarr.gif F; f:Fbull.gif
fttab(forall.gifg h:Fbull.gif g isin.giff c and.gif g isin.giff c and.gif cod g = dom h
fttabfttabruarr.gif cod (lam f) = dom (lam h)
fttabfttaband.gif lam (g o h) = (lam g) o (lam h))
fttaband.gif f isin.giff c ruarr.gif (lambda.gifc lam c) a f = lam f
qqter.gif);


xl-sml
val dfs_axiom = new_axiom (["dfs_axiom"], qqtel.gif
ftbr forall.gifc:C; l: F rarr.gif F; L: F rarr.gif Cbull.gif
fttab(forall.giff:Fbull.gif f isin.giff c ruarr.gif (l f) isin.giff (L f))
fttaband.gif (forall.gifg h:Fbull.gif g isin.giff c and.gif h isin.giff c
fttabfttabruarr.gif cod g = dom h ruarr.gif cod (l g) = dom (l h)
fttabfttaband.gif l (g o h) = (l g) o (l h))
fttabruarr.gif (lambda.gifc l c) isin.giff (ulambda.gifc L c)
qqter.gif);

The following infinity axiom incorporates a union axiom.
xl-sml
val infinity_axiom = new_axiom (["infinity_axiom"], qqtel.gif
ftbr forall.giff: Fbull.gif exist.gifc:Cbull.gif f isin.giff c
fttaband.gif (forall.gifL: F rarr.gif C; g: F; d: Cbull.gif
fttabfttabd = dom g
fttabfttaband.gif (forall.gifg:Fbull.gif g isin.giff d ruarr.gif (L g) isin.gifc c)
fttabfttabruarr.gif (ulambda.gifc L d) isin.gifc c
fttabfttaband.gif (exist.gifuf:Cbull.gif uf isin.gifc c
fttabfttabfttaband.gif forall.gifh1 h2:Fbull.gif h1 isin.giff cod f
fttabfttabfttaband.gif h2 isin.giff dom h1
fttabfttabfttabruarr.gif h2 isin.giff uf)
fttab)
qqter.gif);

Definitions and Proofs
The Empty Category and Functor

The empty category is obtainable by separation.


xl-holconst
empty.gifc :C
empty.gifc = dom(inj (epsilon.gifcbull.gifT) (lambda.giffbull.gifF))

xl-tex
<p>
The empty functor is the identity functor over the empty category.
</p>


xl-holconst
empty.giff :F
empty.giff = id empty.gifc
We may as well have the lambdas declared as binders.
xl-sml
declare_binder "lambda.gifc";
declare_binder "ulambda.gifc";

We now prove that the empty category is indeed empty.
xl-sml
set_goal([], qqtel.gifforall.gif f:Fbull.gif not.giff isin.giff empty.gifcqqter.gif);
a (strip_tac
fttabTHEN rewrite_tac [get_spec qqtel.gifempty.gifcqqter.gif]);
a (strip_asm_tac injection_axiom);
a (LIST_SPEC_NTH_ASM_T 1 [qqtel.gifepsilon.gif c:Cbull.gif Tqqter.gif, qqtel.giflambda.gif f:Fbull.gif Fqqter.gif]
fttab(fn x=> strip_asm_tac (rewrite_rule[] x)));
a (asm_rewrite_tac[]);
val empty_cat_thm = save_pop_thm "empty_cat_thm";

The following theorems permit the extensionality axioms to be used as rewrites.
xl-sml
set_goal([], qqtel.gif
ftbr forall.gifc1 c2:Cbull.gif c1=c2 equiv.gif (forall.giff:Fbull.gif f isin.giff c1 equiv.gif f isin.giff c2)
qqter.gif);
a (REPEAT_N 4 strip_tac);
(* *** Goal "1" *** *)
a (strip_tac THEN asm_rewrite_tac[]);
(* *** Goal "2" *** *)
a (rewrite_tac [cat_ext_axiom]);
val cat_ext_thm = save_pop_thm "cat_ext_thm";


xl-sml
set_goal ([], qqtel.gif
ftbr forall.giff1 f2:Fbull.gif f1=f2 equiv.gif dom f1 = dom f2 and.gif cod f1 = cod f2
fttaband.gif (forall.gifg:Fbull.gif g isin.giff dom f1 ruarr.gif f1 a g = f2 a g)
qqter.gif);
a (REPEAT_N 4 strip_tac);
(* *** Goal "1" *** *)
a (strip_tac THEN asm_rewrite_tac[]);
(* *** Goal "2" *** *)
a (rewrite_tac [fun_ext_axiom]);
val fun_ext_thm = save_pop_thm "fun_ext_thm";

We now prove that the empty category is an initial object in our domain of categories.
xl-sml
set_goal([], qqtel.gifforall.gifc:Cbull.gif exist.gif1 f:Fbull.gif dom f = empty.gifc and.gif cod f = cqqter.gif);
a (strip_tac THEN exist.gif1_tac qqtel.gifinj c (lambda.giffbull.gifF)qqter.gif);
a (strip_asm_tac injection_axiom);
a (LIST_SPEC_NTH_ASM_T 1 [qqtel.gifcqqter.gif, qqtel.giflambda.gif f:Fbull.gif Fqqter.gif]
fttab(fn x=> strip_asm_tac (rewrite_rule[] x)));
a (REPEAT strip_tac);
(* *** Goal "1" *** *)
a (rewrite_tac [cat_ext_thm]);
a (REPEAT_N 2 strip_tac);
a (asm_rewrite_tac[empty_cat_thm]);
(* *** Goal "2" *** *)
a (once_rewrite_tac [fun_ext_thm]);
a (REPEAT strip_tac THEN_TRY asm_rewrite_tac[]);
(* *** Goal "2.1" *** *)
a (asm_rewrite_tac [cat_ext_thm, empty_cat_thm]);
(* *** Goal "2.2" *** *)
a (swap_nth_asm_concl_tac 1);
a (GET_NTH_ASM_T 3 rewrite_thm_tac);
a (rewrite_tac [empty_cat_thm]);
val empty_cat_initial_thm = save_pop_thm "empty_cat_initial_thm";

Finite Discrete Categories

Any finite collection of categories can be made into a discrete category.

Proof Context
This is a place holder.
Proof Context

up quick index © RBJ

$Id: pure_categories.xml,v 1.3 2008/04/15 18:21:36 rbj01 Exp $

V