Lectures onType Theory
Chapter 202
Chapter 202Core route

Coverings, van Kampen, and the Fundamental Group

The constructor loop:base=base does not reduce an arbitrary loop of the circle to a visible power of loop. A family over the circle can, however, record how many times transport winds around that constructor. Building such a family turns the missing normal form into the calculation Ω(S1)Z.

Pointed types and homotopy groups

A loop space is based at a chosen point. We therefore work with pairs (A,a0), where a0:A.

Convention 69.1 — Ambient theory; basepoints

Throughout this chapter the ambient theory is that of part IV: the intensional base with univalence (definition 65.6), truncations (definition 66.33 and the n-truncations of chapter 66), and the higher inductive types of chapter 68. Spheres carry the suspension presentation S0:=2, Sn+1:=Susp(Sn), pointed at N; the equivalence between Susp2 and the higher inductive circle of definition 68.8 is written eS:Susp2S1, with eS(N)=base; pointed statements are transported explicitly along this equivalence when the presentations are compared.

Definition 69.2 — Pointed types and maps

Use the pointed types and loop spaces of definition 62.15 and the based-map type Map of definition 68.22. We write f:(X,x0)(Y,y0) for an element of Map((X,x0),(Y,y0)); such an element is a pointed map, a map together with a path carrying the chosen source point to the chosen target point. The zero map 0:(X,x0)(Y,y0) is (λx.y0,refly0). A pointed equivalence is a pointed map whose underlying map is an equivalence (definition 62.21).

Definition 69.4 — Homotopy groups

Let (A,a0) be a pointed type. For n1 the n-th homotopy group of A at a0 is the set πn(A,a0):=Ωn(A,a0)0, the 0-truncation of the underlying type of the n-fold loop space. We further set π0(A):=A0; it is a pointed set when A is pointed, but carries no group structure and needs no basepoint to be defined. For a pointed type whose point has already been named a0, we write πn(A) for πn(A,a0).

Proposition 69.5 — Group structure

For n1, path concatenation and inversion descend to πn(A,a0), making it a group with unit |refl|0.

Proof of Proposition 69.5 — Group structure

Proof. Write X:=Ωn(A,a0). Since X0 is a set, the map λp.λq.|pq|0:XXX0 extends along the truncation in each argument by 0-truncation recursion (chapter 66), giving a binary operation on X0; inversion extends likewise. Each group law is an equality in the set X0, hence a proposition, so by truncation induction it suffices to verify it on elements of the form |p|0, where it follows from the groupoid laws of the identity type (theorem 30.20). ◻

A double loop can be composed vertically or horizontally. The whiskering operations and their interchange law were constructed in construction 62.3, lemma 62.4; their Eckmann–Hilton application is theorem 62.17. We record only the new descent through set truncation.

Construction 69.6 — Whiskering and horizontal composition

The operations used here are exactly those of construction 62.3: right whiskering, left whiskering, and the two horizontal composites. This paragraph introduces no second convention.

Lemma 69.7 — Interchange

The two horizontal composites agree. At a doubly reflexive boundary they reduce, respectively, to the two orders of vertical composition.

Proof of Lemma 69.7 — Interchange

Proof. This is lemma 62.4, followed by the reflexivity computations displayed in the proof of theorem 62.17. ◻

Theorem 69.8 — Eckmann–Hilton

For every pointed type (A,a0) and all α,β:Ω2(A,a0) we have αβ=βα.

Proof of Theorem 69.8 — Eckmann–Hilton

Proof. This is theorem 62.17 at (A,a0). ◻

Corollary 69.9

For n2, the group πn(A,a0) is abelian.

Proof of Corollary 69.9

Proof. πn(A,a0)=Ω2(Ωn2(A,a0))0, and by theorem 62.17 concatenation on this double loop space is commutative; commutativity descends to the truncation as in proposition 69.5. ◻

Lemma 69.10 — Truncation and loop spaces

For every type A, points a,b:A, and n1, a=Abn(|a|n+1=An+1|b|n+1). In particular Ω(A,a)nΩ(An+1,|a|n+1).

Proof of Lemma 69.10 — Truncation and loop spaces

Proof. Apply theorem 66.56 to a,b:A. Its encode–decode equivalence sends |p|n to ap||n+1(p) and is the displayed map. ◻

Corollary 69.11

For k0, πk(A,a0)Ωk(Ak,|a0|k).

Proof of Corollary 69.11

Proof. Iterate lemma 69.10 k times: Ωk(A)0Ω(Ωk1(A)1)Ωk(Ak). ◻

Construction 69.12 — Functoriality

A pointed map f:(X,x0)(Y,y0) induces a pointed map Ωf:Ω(X,x0)Ω(Y,y0),(Ωf)(p):=f01apf(p)f0, At reflexivity this term is f01reflf0=f01f0=refly0 by the unit and inverse laws; this path is the pointing witness. Iterating and truncating yields πn(f):=Ωnf0:πn(X,x0)πn(Y,y0), a group homomorphism for n1.

Proof of Construction 69.12 — Functoriality

Proof. The identity-type functoriality law apf(pq)=apf(p)apf(q) follows by path induction on p,q. Expanding the two conjugations in (Ωf)(p)(Ωf)(q), the adjacent f0f01 cancels by theorem 30.20, leaving (Ωf)(pq). Iteration preserves this equation. Double truncation induction then proves that πn(f) preserves the group operation; the unit follows from the same calculation at reflexivity. ◻

Proposition 69.13 — Homotopy invariance

If f:(X,x0)(Y,y0) is a pointed equivalence, then πn(f) is an isomorphism for every n1, and π0(f) is a bijection.

Proof of Proposition 69.13 — Homotopy invariance

Proof. If f is an equivalence then so is apf on each path space (chapter 62), hence so is Ωf (composition with the invertible conjugation by f0), hence so is Ωnf by iteration, hence so is Ωnf0, since truncation preserves equivalences (chapter 66). A bijective homomorphism is an isomorphism. ◻

Example 69.14

If A is contractible, then πn(A,a0)=0 for all n1 and π0(A)=1: contractibility is preserved by Ω and by truncation. More generally proposition 69.13 computes the homotopy groups of any type equivalent to a known one.

Example 69.15

For pointed types (A,a0) and (B,b0) there is an isomorphism πn(A×B)πn(A)×πn(B) for n1. The nondependent case of theorem 62.30 gives the pointed equivalence Ω(A×B,(a0,b0))Ω(A,a0)×Ω(B,b0),p(appr1p,appr2p). Its inverse pairs two paths; path induction on both inputs proves the two inverse homotopies. Iterating gives the equivalence of n-fold loop spaces, and set truncation preserves products and equivalences. Concatenation is componentwise, so the induced bijection is a group isomorphism.

Exercise 69.1

★★☆ Starting from construction 62.3, write out the path inductions for the whiskerings recalled in construction 69.6, state their computation rules at reflexivity, and reconstruct the proof of lemma 69.7.

Exercise 69.2

★★☆ Prove that πn(f) of construction 69.12 is a group homomorphism for n1, that πn(id)=id, and that πn(gf)=πn(g)πn(f) for composable pointed maps.

Exercise 69.3

★☆☆ Using theorem 62.30, construct a pointed equivalence Ω(A×B)Ω(A)×Ω(B) and deduce the isomorphism of example 69.15.

The fundamental group of the circle

We use a concrete integer type rather than importing an abstract algebraic construction. Put Z:=N+1+N with constructors pos(n) for n+1, 0 for the middle summand, and neg(n) for (n+1). Define successor and predecessor by coproduct and natural-number elimination: zpos(n)0neg(0)neg(n+1)sucZ(z)pos(n+1)pos(0)0neg(n)predZ(z){0n=0,pos(m)n=m+1,neg(0)neg(1)neg(n+2) The two rows are mutually inverse by case analysis, so sucZ:ZZ has chosen inverse predZ. These displayed case equations are judgmental computation rules for the chosen coproduct presentation.

For j,k:Z, define j+k by integer induction on k: start at j+0j, iterate sucZ through the positive summand, and iterate predZ through the negative summand. Consequently j+(k+1)=sucZ(j+k),j+(k1)=predZ(j+k), with judgmental equalities after exposing the corresponding constructor of k. The unit and associativity laws, and the facts that 1 and 1 act by successor and predecessor, follow by integer induction. Later calculations use only these equations.

The successor equivalence sucZ:ZZ determines a family code:S1U with code(base):=Z and monodromy sucZ. Transport in this family records a loop’s winding number. We use the displayed coproduct eliminator in the induction below.

Lemma 69.16 — Integer induction

Let P:ZU with d0:P(0), d+:n:NP(n)P(n+1), and d:n:NP(n)P((n+1)). Then there is f:k:ZP(k) with f(0)d0, f(n+1)d+(n,f(n)), and f((n+1))d(n,f(n)) for n:N.

Proof of Lemma 69.16 — Integer induction

Proof. Take Z:=N+1+N, with the middle summand representing 0, the left summand n+1, and the right summand (n+1). Eliminate the coproduct. Use d0 in the middle case; in the positive and negative summands, use ordinary natural-number induction with steps d+ and d respectively. The three equations are the coproduct and natural-number computation rules. ◻

One cannot define a winding-number function Ω(S1,base)Z by path induction: path induction varies an endpoint, whereas a loop fixes both endpoints at base, and its reflexivity case would collapse the generator. The repair is to define a family over a variable endpoint and let transport in that family record the winding. This is the universal cover below.

Definition 69.17 — Universal cover of the circle

Define code:S1U0 by circle recursion (definition 68.8): code(base):=Z,apcode(loop):=ua(sucZ), where ua converts the successor equivalence into a path in the universe (construction 65.8).

The fiber of this family over base is Z; transporting along loop moves one step up the fiber. The element k:Z will code the path that winds k times around the circle. Univalence is essential here: it converts the nontrivial automorphism sucZ of Z into a nontrivial path in U0.

Lemma 69.18 — Transport in the cover

For all k:Z, trloopcode(k)=k+1andtrloop1code(k)=k1.

Proof of Lemma 69.18 — Transport in the cover

Proof. For the first equation, trloopcode(k)=trapcode(loop)XX(k)(composite-family transport)=trua(sucZ)XX(k)(circle recursion)=k+1(theorem 65.9(i)). The last equality is an identity in Z, not a judgmental reduction of ua. Since trpP and trp1P are mutually inverse (theorem 30.20 and functoriality of transport), the second equation follows: trloop1code is inverse to the successor, i.e. the predecessor. ◻

Construction 69.19 — Encoding

Define encode:x:S1(base=S1x)code(x) by encodex(p):=trpcode(0).

Construction 69.20 — Integer powers of the loop

By lemma 69.16, define loop():Z(base=S1base) by loop0:=reflbase,loopn+1:=loopnloop,loop(n+1):=loopnloop1(n:N).

Lemma 69.21

For all k:Z, loopk1loop=loopk.

Proof of Lemma 69.21

Proof. By lemma 69.16 on k. For k=n+1 with n0 this is the defining equation. For k=0 and k=n, unfold the definition of the negative powers and cancel loop1loop by the groupoid laws (theorem 30.20). ◻

Lemma 202.21 — Addition of winding powers

For all j,k:Z, loopj+k=loopjloopk.

Proof of Lemma 202.21 — Addition of winding powers

Proof. Use integer induction on k. At 0 the claim is the right-unit law. For the positive step, unfold loopk+1=loopkloop, apply the induction hypothesis, and reassociate. From lemma 69.21, cancellation gives loopm1=loopmloop1 for every m. The negative step now follows from the induction hypothesis by appending loop1 and reassociating. All cancellations and associations are laws of theorem 30.20. ◻

Construction 69.22 — Decoding

Put F(x):=code(x)(base=x). Circle induction defines decode:x:S1code(x)(base=S1x). At base take loop(); the loop case asks for a path trloopF(loop())=loop().

Proof of Construction 69.22 — Decoding

Proof. Put r(q):=qloop and s(k):=k1. For the required coherence, compute trloopF(loop())=rloop()s(function-family transport)=λk.loopk1loop=λk.loopk(lemma 69.21), The first equality also uses transport in path families and lemma 69.18. The last step uses function extensionality (theorem 65.18). This is the loop coherence required by circle induction, which therefore defines decode. ◻

Lemma 69.23

For all x:S1 and p:base=S1x, decodex(encodex(p))=p.

Proof of Lemma 69.23

Proof. By path induction it suffices to consider xbase, preflbase. Then encodebase(refl)trreflcode(0)0 and decodebase(0)loop0reflbase. ◻

Lemma 69.24

For all x:S1 and c:code(x), encodex(decodex(c))=c.

Proof of Lemma 69.24

Proof. Put P(x):=c:code(x)encodex(decodex(c))=c. Each P(x) is a proposition because code(x) is a set. Hence the two endpoints required for the loop case are equal, and circle induction reduces the proof to P(base). There we show encodebase(loopk)=k for all k:Z, by lemma 69.16:

  • k=0: both sides are 0 by definition.

  • k=n+1: encodebase(loopn+1)=trloopnloopcode(0)=trloopcode(trloopncode(0))(functoriality of transport)=trloopncode(0)+1(lemma 69.18)=n+1(inductive hypothesis).

  • k=(n+1): put qn:=loopn and zn:=encodebase(loop(n+1)). Then zn=trqnloop1code(0)=trloop1code(trqncode(0))(functoriality of transport)=trqncode(0)1(lemma 69.18)=n1(inductive hypothesis)=(n+1).

 ◻

Theorem 69.25 — The fundamental group of the circle

There is a family of equivalences x:S1 (base=S1x)code(x). Consequently Ω(S1,base)Z; this equivalence carries concatenation to addition, so π1(S1,base)Zandπn(S1,base)=0(n>1).

Proof of Theorem 69.25 — The fundamental group of the circle

Proof. By lemma 69.23, lemma 69.24, encodex and decodex are quasi-inverse, hence encodex is an equivalence (chapter 62). Instantiating at x:=base gives Ω(S1)Z, with inverse loop(). By lemma 202.21, loopj+k=loopjloopk, so loop() is a bijective homomorphism (Z,+)Ω(S1); applying 0 and noting that Z is a set yields π1(S1)Z0Z.

For n2: the pointed equivalence Ω(S1)(Z,0) induces, by proposition 69.13, Ωn(S1)Ωn1(Z,0). Since Z is a set, Ω(Z,0)=(0=Z0) is an inhabited proposition, hence contractible, and so are all its iterated loop spaces; therefore πn(S1)=Ωn(S1)0=0 by example 69.14. ◻

Remark 69.26 — Winding numbers

The proof is computational in content: for a concrete loop such as looploop1loop, the function encode transports 0 through the composite sucZpredZsucZ and returns the winding number 1. In the axiomatic theory of part IV the computation is a chain of propositional equalities, since ua does not reduce.

Remark 69.27 — Univalence is necessary

Without univalence, Ω(S1)Z is not provable in the displayed circle signature. Interpret its point constructor by the unique point of 1 and its loop constructor by reflexivity. Given a set X, a point x:X, and a loop p:x=x, proof irrelevance makes p=reflx, so the required circle recursor is the constant map at x and satisfies the propositional loop equation. Thus the set model of definition 48.30 extends to precisely these circle rules and interprets Ω(S1) as 1. Univalence gives the nontrivial path ua(sucZ) in the universe that the cover transports along.

Alternatively, the total space x:S1code(x) is contractible. Since encode induces an equivalence between this total space and the contractible singleton total space of based paths, its fiber maps are equivalences. This is Shulman’s helix argument; the direct calculation above is Licata’s encode–decode proof.

Exercise 69.4

★★☆ Fix a construction of Z (say N+1+N) and prove lemma 69.16, including the three computation rules.

Exercise 69.5

★☆☆ Prove that loopj+k=loopjloopk for all j,k:Z, by integer induction on k using lemma 69.21 and theorem 30.20.

Exercise 69.6

★★☆ Prove that x:S1code(x) is contractible. Conclude again that encodex is a family of equivalences, using the fact that a fiberwise map between families with equivalent total spaces over the same base is a fiberwise equivalence.

Exercise 69.7

★☆☆ Compute π1(S1×S1)Z×Z using theorem 69.25 and example 69.15.

Set-valued coverings

A family of sets over A is determined by its fibers and the transport action of paths in A. For the circle this reduces a covering to one set equipped with one automorphism.

Definition 202.28 — Set-valued coverings

A set-valued covering of a type A is a family P:AU0 together with x:AisSet(P(x)). Its total space is x:AP(x), projected to A. Every path p:x=y acts on the fibers by the transport equivalence trpP:P(x)P(y); functoriality of transport makes concatenation act by composition.

Here “covering” means only a type family with set-valued fibers; no topology or local-triviality structure is part of the definition.

Theorem 202.29 — Coverings of the circle

There is an equivalence (P:S1U0x:S1isSet(P(x)))(S:U0isSet(S)×(SS)). Under this equivalence the universal cover definition 69.17 corresponds to (Z,sucZ).

Proof of Theorem 202.29 — Coverings of the circle

Proof. Evaluate a family P at base and transport along loop: P(P(base),trloopP:P(base)P(base)). The circle universal property identifies maps S1U0 with pairs (S,p) where S:U0 and p:S=S. Univalence identifies the latter path with an equivalence SS. Since isSet() is a proposition and is preserved by equivalence, circle induction shows that a proof that every fiber is a set is determined by its value at base; its loop coherence is automatic. Conversely, from a set S and e:SS, circle recursion with loop image ua(e) constructs the family, and circle induction constructs its fiberwise set proof.

The two composites are the identity by the uniqueness clause of circle recursion and the two inverse laws for univalence. For P:=code, lemma 69.18 computes the selected automorphism as successor on Z. ◻

Corollary 202.30 — Monodromy classification

Set-valued coverings of S1 are equivalently sets equipped with an action of the group Z.

Proof of Corollary 202.30 — Monodromy classification

Proof. An automorphism e:SS defines ks:=ek(s) using integer powers; the action laws follow by integer induction and the equivalence laws. Conversely, an action restricts at 1:Z to an automorphism, with inverse the action of 1. The unit and multiplication laws show that these constructions are inverse. Compose this equivalence with theorem 202.29. ◻

Example 202.31 — The universal action

The universal cover carries the regular translation action kn:=n+k on Z. Its fiber records the winding number under the encode map.

Exercise 202.8

★★☆ For a set-valued covering P:AU0 and basepoint a0:A, prove that ptrpP sends reflexivity to the identity equivalence and concatenation to composition. Explain why it descends to an action of π1(A,a0) on P(a0).

Exercise 202.9

★★☆ Classify the coverings of S1 with fiber 2 by listing the automorphisms of 2. Compute the monodromy of the nontrivial cover on both Boolean points and show that traversing the generating loop twice acts as the identity.

Pushout path codes and van Kampen

This section is an exact, optional import of the HoTT Book’s naive van Kampen construction. The four mutually indexed word types and their double-pushout coherence form a substantial independent development; the specimen below records only its input and conclusion. The chapter’s core results are independent of the imported theorem and its two consequences.

Let f:AB and g:AC, and let W be their higher-inductive pushout, with constructors inA:BW, inB:CW, and gluea:inA(f(a))=inB(g(a)). Write Π1X(x,y):=x=Xy0 for the fundamental groupoid hom-set.

The failed direct approach is to eliminate a path in W and hope that its constructor history remains visible. Path induction forgets that history immediately. Encode–decode instead defines a set of words first and makes transport append one generator at a time.

Convention 202.32 — Imported pushout path words

For endpoints u,v:W, VK(u,v) denotes the family code(u,v) of the HoTT Book, §8.7.1, pp. 292–294 [Uni13]. The imported package contains the four endpoint-indexed set quotients of finite alternating path words, the four crossing equivalences, and their commuting square (8.7.2). For orientation only, a word from inA(b) to inA(b) has the shape (p0,a1,q1,a1,p1,,an,qn,an,pn), where p0:Π1B(b,f(a1)),qk:Π1C(g(ak),g(ak)),pk:Π1B(f(ak),f(ak+1))(k<n),pn:Π1B(f(an),b). The CC clause reverses the roles of B,C and of the p,q pieces; the BC and CB clauses change the parity so that a word begins and ends in the indicated summands. The two quotient generators delete a reflexive B-piece between adjacent C-pieces, or a reflexive C-piece between adjacent B-pieces, and compose the newly adjacent paths. The four crossing equivalences append or remove the appropriate reflexive crossing at either end. Thus VK names the source’s complete package; the displayed BB shape is not a local definition of it.

The code family is defined by double pushout induction. Transport in the second endpoint along a path in B or C concatenates that path onto the last word component; transport along gluea appends the crossing labelled by a. The overlap equations hold in a set, so no higher word coherence remains.

Theorem 202.33 — Imported: naive van Kampen; path-space form

For every span BfAgC and all u,v:W, there is an equivalence Π1W(u,v)VK(u,v).

Proof of Theorem 202.33 — Imported: naive van Kampen; path-space form

Proof. This is imported exactly as HoTT Book Theorem 8.7.4 [Uni13], in the higher-inductive and set-truncation signature of convention 69.1. Its proof defines encode by transport from the reflexive word and decode by concatenating the images of word components; double pushout induction and quotient induction prove the two round trips. Those inductions, including square (8.7.2), belong to the cited proof and are not claimed as local derivations here. The theorem assumes neither connectedness, choice, nor excluded middle. ◻

Definition 202.34 — Alternating-word free product

Let G and H be groups. Form finite words whose letters are tagged elements ιG(g) or ιH(h). Quotient these words by the least congruence containing wιG(1)www,wιH(1)www,wιG(g)ιG(g)wwιG(gg)w,wιH(h)ιH(h)wwιH(hh)w. The quotient is denoted GH. Multiplication is concatenation, the unit is the empty word, and inversion reverses a word and inverts each letter.

Lemma 202.35

The operations of definition 202.34 are well defined and make GH a group.

Proof of Lemma 202.35

Proof. Concatenating the same prefix and suffix preserves each generating relation, so concatenation descends to the congruence quotient. Reversal with letterwise inversion sends an identity-deletion relation to another identity-deletion relation and sends a multiplication relation in one factor to the corresponding multiplication relation in reverse order. It therefore also descends. Associativity and the unit laws descend from lists. In the product of a word with its reversed inverse, adjacent inverse letters reduce successively to identities and then disappear; the same reduction in the opposite order proves the other inverse law. ◻

Corollary 202.36 — van Kampen for a wedge

For pointed connected types (B,b0) and (C,c0), π1(BC)π1(B)π1(C), where is the free product of groups.

Proof of Corollary 202.36 — van Kampen for a wedge

Proof. Specialize theorem 202.33 to A:=1, f():=b0, and g():=c0. Every crossing label is then , so a loop code is an alternating word of elements of π1(B) and π1(C). The two quotient generators delete identity letters and multiply adjacent letters from the same factor. By definition 202.34, the resulting quotient is π1(B)π1(C). Decoding concatenates the two inclusions of loops, hence preserves multiplication, so the equivalence of sets in theorem 202.33 is a group isomorphism. ◻

Example 202.37 — A wedge of two circles

By theorem 69.25, corollary 202.36, π1(S1S1)ZZ, the free group on the two generating loops. The word inA(loop)inB(loop)inA(loop)1 is already reduced; the code remembers its three alternating letters rather than merely an integer winding number.

Exercise 202.10

★★☆ Write the four endpoint forms of VK(u,v) and their reflexive words. Check that transport along a B-path appends to the last B-component and that decoding this transported word concatenates the image of that path.

Exercise 202.11

★☆☆ For the wedge of two circles, reduce the words aa1b, abb1, and aba1b1 using only the two quotient generators of convention 202.32. Which word represents the commutator?

Suggested first pass.

Begin with exercise 69.5, exercise 202.8, continue with exercise 202.9, exercise 202.10, and finish with exercise 202.11. None of these problems is a premise of a later theorem.

The practical project is a reduced-word evaluator for π1(S1S1). Represent the two generators and their inverses by four constructors. Implement insertion with cancellation of adjacent inverse letters, and test that concatenation followed by reduction respects the quotient generators of convention 202.32. The mathematical invariant is that the output has no adjacent inverse pair and decodes to the same loop as the input.

Exercise 202.12

★★★ Starting only from circle recursion and univalence, reconstruct both directions of theorem 202.29. Mark the single point where proof irrelevance of isSet(S) discharges a loop coherence.

Exercise 202.13

★★★ Practical project.van-kampen-word-reducer Specify the reduced-word evaluator above as a terminating recursion on lists. Prove preservation of decoding for one cancellation step and then for the whole evaluator. Give inputs whose reductions are the empty word, a one-letter word, and the four-letter commutator.

Bibliographic notes

The circle cover and its encode–decode calculation follow the HoTT Book’s Chapter 8.1 development. The classification of set-valued circle families is the monodromy form of the same construction. The path-word proof of van Kampen is the HoTT Book’s Theorem 8.7.4; its wedge specialization is the classical free-product calculation internalized through set truncation [Uni13].

Search the book

Type to search the local edition.