The Haskell Road to Logic Maths and Programming Kees Doets all chapter instant download
The Haskell Road to Logic Maths and Programming Kees Doets all chapter instant download
com
https://textbookfull.com/product/the-haskell-road-to-logic-
maths-and-programming-kees-doets/
OR CLICK BUTTON
DOWNLOAD NOW
https://textbookfull.com/product/haskell-the-ultimate-beginner-s-
guide-to-learn-haskell-programming-step-by-step-1st-edition-claudia-
alves/
textboxfull.com
https://textbookfull.com/product/programming-in-haskell-2nd-edition-
graham-hutton/
textboxfull.com
https://textbookfull.com/product/sets-logic-and-maths-for-
computing-3rd-edition-makinson-d/
textboxfull.com
https://textbookfull.com/product/introduction-to-logic-
programming-1st-edition-michael-genesereth/
textboxfull.com
Programming in Haskell Second Edition, 5Th Printing
Edition Hutton
https://textbookfull.com/product/programming-in-haskell-second-
edition-5th-printing-edition-hutton/
textboxfull.com
https://textbookfull.com/product/thinking-with-types-type-level-
programming-in-haskell-sandy-maguire/
textboxfull.com
https://textbookfull.com/product/programmable-logic-controllers-
hardware-and-programming-4th-edition-max-rabiee/
textboxfull.com
https://textbookfull.com/product/scientific-integrity-the-rules-of-
academic-research-kees-schuyt/
textboxfull.com
https://textbookfull.com/product/4g-lte-advanced-pro-and-the-road-
to-5g-dahlman/
textboxfull.com
The Haskell Road to Logic,
Math and Programming
Kees Doets and Jan van Eijck
March 4, 2004
Contents
Preface v
1 Getting Started 1
1.1 Starting up the Haskell Interpreter . . . . . . . . . . . . . . . . . 2
1.2 Implementing a Prime Number Test . . . . . . . . . . . . . . . . 3
1.3 Haskell Type Declarations . . . . . . . . . . . . . . . . . . . . . 8
1.4 Identifiers in Haskell . . . . . . . . . . . . . . . . . . . . . . . . 11
1.5 Playing the Haskell Game . . . . . . . . . . . . . . . . . . . . . 12
1.6 Haskell Types . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17
1.7 The Prime Factorization Algorithm . . . . . . . . . . . . . . . . . 19
1.8 Themap andfilter Functions . . . . . . . . . . . . . . . . . . . 20
1.9 Haskell Equations and Equational Reasoning . . . . . . . . . . . 24
1.10 Further Reading . . . . . . . . . . . . . . . . . . . . . . . . . . . 26
i ii CONTENTS
3.5 Summary of the Proof Recipes . . . . . . . . . . . . . . . . . . . 96
3.6 Some Strategic Guidelines . . . . . . . . . . . . . . . . . . . . . 99
3.7 Reasoning and Computation with Primes . . . . . . . . . . . . . . 103
3.8 Further Reading . . . . . . . . . . . . . . . . . . . . . . . . . . . 111
5 Relations 161
5.1 The Notion of a Relation . . . . . . . . . . . . . . . . . . . . . . 162
5.2 Properties of Relations . . . . . . . . . . . . . . . . . . . . . . . 166
5.3 Implementing Relations as Sets of Pairs . . . . . . . . . . . . . . 175
5.4 Implementing Relations as Characteristic Functions . . . . . . . .
182
5.5 Equivalence Relations . . . . . . . . . . . . . . . . . . . . . . . . 188
5.6 Equivalence Classes and Partitions . . . . . . . . . . . . . . . . . 192
5.7 Integer Partitions . . . . . . . . . . . . . . . . . . . . . . . . . . 202
5.8 Further Reading . . . . . . . . . . . . . . . . . . . . . . . . . . . 204
6 Functions 205
6.1 Basic Notions . . . . . . . . . . . . . . . . . . . . . . . . . . . . 206
6.2 Surjections, Injections, Bijections . . . . . . . . . . . . . . . . . 218
6.3 Function Composition . . . . . . . . . . . . . . . . . . . . . . . 222
6.4 Inverse Function . . . . . . . . . . . . . . . . . . . . . . . . . . . 226
6.5 Partial Functions . . . . . . . . . . . . . . . . . . . . . . . . . . 229
6.6 Functions as Partitions . . . . . . . . . . . . . . . . . . . . . . . 232
6.7 Products . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 234
6.8 Congruences . . . . . . . . . . . . . . . . . . . . . . . . . . . . 236
6.9 Further Reading . . . . . . . . . . . . . . . . . . . . . . . . . . . 238
CONTENTS iii
9 Polynomials 331
9.1 Difference Analysis of Polynomial Sequences . . . . . . . . . . . 332
9.2 Gaussian Elimination . . . . . . . . . . . . . . . . . . . . . . . . 337
9.3 Polynomials and the Binomial Theorem . . . . . . . . . . . . . . 344
9.4 Polynomials for Combinatorial Reasoning . . . . . . . . . . . . . 352
9.5 Further Reading . . . . . . . . . . . . . . . . . . . . . . . . . . . 359
10 Corecursion 361
10.1 Corecursive Definitions . . . . . . . . . . . . . . . . . . . . . . . 362
10.2 Processes and Labeled Transition Systems . . . . . . . . . . . . .
365
10.3 Proof by Approximation . . . . . . . . . . . . . . . . . . . . . . 373
10.4 Proof by Coinduction . . . . . . . . . . . . . . . . . . . . . . . . 379
10.5 Power Series and Generating Functions . . . . . . . . . . . . . . 385
10.6 Exponential Generating Functions . . . . . . . . . . . . . . . . . 396
10.7 Further Reading . . . . . . . . . . . . . . . . . . . . . . . . . . . 398
Preface
Purpose
Long ago, when Alexander the Great asked the mathematician
Menaechmus for a crash course in geometry, he got the famous
reply “There is no royal road to mathematics.” Where there was no
shortcut for Alexander, there is no shortcut for us. Still, the fact that
we have access to computers and mature programming languages
means that there are avenues for us that were denied to the kings
and emperors of yore.
v vi
Logic in Practice
The subject of this book is the use of logic in practice, more in
particular the use of logic in reasoning about programming tasks.
Logic is not taught here as a mathematical discipline per se, but as
an aid in the understanding and construction of proofs, and as a tool
for reasoning about formal objects like numbers, lists, trees,
formulas, and so on. As we go along, we will introduce the concepts
and tools that form the set-theoretic basis of mathematics, and
demonstrate the role of these concepts and tools in
implementations. These implementations can be thought of as
representations of the mathematical concepts.
Although it may be argued that the logic that is needed for a proper
understanding of reasoning in reasoned programming will get
acquired more or less automatically in the process of learning
(applied) mathematics and/or programming, students nowadays
enter university without any experience whatsoever with
mathematical proof, the central notion of mathematics.
PREFACE vii
After having worked through the material in the book, i.e., after
having digested the text and having carried out a substantial number
of the exercises, the reader will be able to write interesting
programs, reason about their correctness, and document them in a
clear fashion. The reader will also have learned how to set up
mathematical proofs in a structured way, and how to read and digest
mathematical proofs written by others.
Chapter 8 tells the story of how the various number systems (natural
numbers, integers, rationals, reals, complex numbers) can be
thought of as constructed in stages from the natural numbers.
Everything gets linked to the implementations of the various Haskell
types for numerical computation.
Exercises
Parts of the text and exercises marked by a * are somewhat harder
than the rest of the book.
Readers who want to share their comments with the authors are
encouraged to get in touch with us at email [email protected].
PREFACE ix
Acknowledgments
Remarks from the people listed below have sparked off numerous
improvements. Thanks to Johan van Benthem, Jan Bergstra, Jacob
Brunekreef, Thierry Coquand (who found the lecture notes on the
internet and sent us his comments), Tim van Erven, Wan Fokkink,
Evan Goris, Robbert de Haan, Sandor Heman, Eva Hoogland, Rosalie
Iemhoff, Dick de Jongh, Anne Kaldewaij, Breannd´an ´O Nuall´ain,
Alban Ponse, Vincent van Oostrom, Piet Rodenburg, Jan Rutten,
Marco Swaen, Jan Terlouw, John Tromp, Yde Venema, Albert Visser
and Stephanie Wehner for suggestions and criticisms. The beautiful
implementation of the sieve of Eratosthenes in Section 3.7 was
suggested to us by Fer-Jan de Vries.
The course on which this book is based was developed at ILLC (the
Institute of Logic, Language and Computation of the University of
Amsterdam) with financial support from the Spinoza Logic in Action
initiative of Johan van Benthem, which is herewith gratefully
acknowledged. We also wish to thank ILLC and CWI (Centrum voor
Wiskunde en Informatica, or Centre for Mathematics and Computer
Science, also in Amsterdam), the home institute of the second
author, for providing us with a supportive working environment. CWI
has kindly granted permission to reuse material from [Doe96].
To save you the trouble of retyping, the code discussed in this book
can be retrieved from the book website. The program code is the
text intypewriterfont that you find in rectangular boxes throughout
the chapters. Boxes may also contain code that is not included in the
chapter modules, usually because it defines functions that are
already predefined by the Haskell system, or because it redefines a
function that is already defined elsewhere in the chapter.
Typewriter font is also used for pieces of interaction with the Haskell
interpreter, but these illustrations of how the interpreter behaves
when particular files are loaded and commands are given are not
boxed.
module GS where
Haskell 98 mode: Restart with command line option -98 to enable extensions
Type :? for help Prelude>
For a proof of the second item, suppose that n > 1,n is not a prime
and that p = LD(n). Then there is a natural numbera > 1 withn =
p·a. Thus,a dividesn. Sincep is the smallest divisor ofn withp > 1, we
have thatp a, and thereforep2 p·a = n, i.e.,(LD(n))2 n.
Using prefix notation, we define the operation divides that takes two
integer expressions and produces a truth value. The truth values
true and false are rendered in Haskell asTrue andFalse, respectively.
The integer expressions that the procedure needs to work with are
called the arguments of the procedure. The truth value that it
produces is called the value of the procedure.
Obviously,m dividesn if and only if the remainder of the process of
dividingn bym equals 0. The definition ofdivides can therefore be
phrased in terms of a predefined procedurerem for finding the
remainder of a division process:
divides d n = rem n d == 0
The definition illustrates that Haskell uses= for ‘is defined as’ and==
for identity. (The Haskell symbol for non-identity is/=.)
A line of Haskell code of the form foo t = ... (or foo t1 t2 = ..., or foo
t1 t2 t3 = ..., and so on) is called a Haskell equation. In such an
equation,foo is called the function, andt its argument.
The string Main> is the Haskell prompt, the rest of the first line is
what you type. When you press Enter the system answers with the
second line, followed by the Haskell prompt. You can then continue
with:
ld n = ldf 2 n
This leaves the implementationldfof LDF (details of the coding will be
explained below):
ldf k n | divides k n = k
| k^2 > n = n
| otherwise = ldf (k+1) n
The definition employs the Haskell operation^ for exponentiation,>
for ‘greater than’, and+ for addition.
The definition of ldf makes use of equation guarding. The first line of
theldf definition handles the case where the first argument divides
the second argument. Every next line assumes that the previous
lines do not apply. The second line handles the case where the first
argument does not divide the second argument, and the square of
the first argument is greater than the second argument. The third
line assumes that the first and second cases do not apply and
handles all other cases, i.e., the cases wherek does not dividen
andk2< n.
ldf k n | divides k n = k
ldf k n | k^2 > n = n
ldf k n = ldf (k+1) n
can be abbreviated as
Note that the procedure ldf is called again from the body of its own
definition. We will encounter such recursive procedure definitions
again and again in the course of this book (see in particular Chapter
7).
Exercise 1.4 Suppose in the definition ofldf we replace the
conditionk^2 > n byk^2 >= n, where>= expresses ‘greater than or
equal’. Would that make any difference to the meaning of the
program? Why (not)?
Exercise 1.5 Add these definitions to the file prime.hs and try them
out.
truth values are examples of types. See Section 2.1 for more on the
typeBool. Section 1.6 gives more information about types in general.
Arbitrary precision integers in Haskell have typeInteger. The
following line gives a so-called type declaration for thedivides
function.
divides :: Integer -> Integer -> Bool
Integer -> Integer -> Bool is short forInteger -> (Integer -> Bool).
A type of the forma -> b classifies a procedure that takes an
argument of typea to produce a result of typeb. Thus,divides takes
an argument of typeInteger and produces a result of typeInteger ->
Bool, i.e., a procedure that takes an argument of typeInteger, and
produces a result of typeBool.
The full code fordivides, including the type declaration, looks like
this:
divides :: Integer -> Integer -> Bool divides d n = rem n d == 0
Ifd is an expression of typeInteger, thendivides d is an expression of
type Integer -> Bool. The shorthand that we will use for
d is an expression of typeInteger
is:d :: Integer.
Exercise 1.6 Can you gather from the definition ofdivides what the
type declaration forrem would look like?
Exercise 1.7 The hugs system has a command for checking the
types of expressions. Can you explain the following (please try it
out; make sure that the file with the definition ofdivides is loaded,
together with the type declaration for divides):
Main> :t divides 5
divides 5 :: Integer -> Bool Main> :t divides 5 7
divides 5 7 :: Bool
Main>
The full code forld, including the type declaration, looks like this:
ld :: Integer -> Integer ld n = ldf 2 n
The full code forldf, including the type declaration, looks like this:
The first line of the code states that the operationldf takes two
integers and produces an integer.
The full code forprime0, including the type declaration, runs like this:
1.4. IDENTIFIERSINHASKELL 11
The first line of the code declares that the operationprime0 takes an
integer and produces (or returns, as programmers like to say) a
Boolean (truth value).
Prelude> :t rem
rem :: Integral a => a -> a -> a
In this particular case, the type judgment gives a type scheme rather
than a type. It means: ifa is a type of classIntegral, thenrem is of
typea -> a -> a. Here a is used as a variable ranging over types.
The type ofdivides can now be inferred from the definition. This is
what we get when we load the definition ofdivides without the type
declaration:
Main> :t divides
divides :: Integral a => a -> a -> Bool
case class data default deriving do else if import in infix infixl infixr
instance let module newtype of then type where
This uses the predefined function min for the minimum of two
integers. It also uses pattern matching for lists . The list pattern[]
matches only the empty list, the list pattern[x] matches any
singleton list, the list pattern(x:xs) matches any non-empty list. A
further subtlety is that pattern matching in Haskell is sensitive to
order. If the pattern[x] is found before(x:xs) then(x:xs) matches any
non-empty list that is not a unit list. See Section 4.6 for more
information on list pattern matching.
Prelude> primMinInt
-2147483648
Prelude> primMaxInt 2147483647
Prelude> max 4 5 5
Prelude> 4 ‘max‘ 5 5
m = mnmInt xs
in m : (srtInts’ (removeFst m xs))
Thelet construction uses the reserved keywordslet andin.
1
,...,n
k
is given by
n
1
+
···
+
n
2
k
. In general, averages are fractions, so the result
k
type of average should not beInt but the Haskell data-type for
floating point numbers, which isFloat. There are predefined
functionssum for the sum of a list of integers, andlength for the
length of a list. The Haskell operation for division / expects
arguments of typeFloat (or more precisely, ofFractional type, and
Exploring the Variety of Random
Documents with Different Content
The Project Gutenberg eBook of Ronda tanár
ur (regény)
This ebook is for the use of anyone anywhere in the United States
and most other parts of the world at no cost and with almost no
restrictions whatsoever. You may copy it, give it away or re-use it
under the terms of the Project Gutenberg License included with this
ebook or online at www.gutenberg.org. If you are not located in the
United States, you will have to check the laws of the country where
you are located before using this eBook.
Language: Hungarian
RONDA TANÁR UR
(REGÉNY)
FORDITOTTA:
KOSZTOLÁNYI DEZSŐ
1914
TEVAN-KIADÁS BÉKÉSCSABA
TEVAN ADOLF KÖNYVNYOMDÁJA BÉKÉSCSABA
I.
Mivel a neve Gonda volt, az egész iskola csak ugy hivta, hogy
Ronda. A többi professzor időnként változtatta a csufnevét. Uj
diákcsapat került egy-egy osztályba, vérszomjas tekintettel felfedezte
valamelyik tanárnak az elmult esztendőben még nem eléggé
méltányolt kómikus tulajdonságát és kiméletlenül csufnevet adott
neki. Ronda azonban már sok generáción keresztül viselte a magáét,
az egész város igy nevezte, a kollégái is igy hivták, a gimnáziumban
és a gimnáziumon kivül a háta mögött. Azok a tanárok, akik kosztos-
diákokat vagy privátosokat tartottak, naponta beszéltek növendékeik
előtt Ronda tanár urról. De az a megfigyelő, aki a hetedik osztály
osztályfőnökén valami ujat akart volna észrevenni és egy uj nevet
akart volna adni neki, sohase érte el a célját; már csak azért sem,
mert az öreg tanár rég megszokott csufneve olyan brilliánsul hatott,
mint huszonhat esztendővel ezelőtt. Mikor az iskola udvarán
keresztül ment, az egyik diák átkiabált a másiknak:
– Nem érzed, milyen ronda szag van itt?
Vagy:
– Phü, micsoda ronda bogár!
És azonnal hevesen rángani kezdett az öreg válla, mindig a jobb
válla és ferde-zöld tekintetet vetett pápaszeme mögül, amely tele
volt sanda félelemmel és boszuvággyal: egy rossz lelkiismeretü
zsarnok pillantása volt ez, aki köpenyek redőiben elrejtett tőrök után
szaglász. Gyér sárgásszürke szőrökkel fedett merev álla fel és
lebillent. Semmit sem tudott »bizonyitani« a kiabáló fiura és szó
nélkül kellett elódalognia, cingár és mégis trotyakos lábszáraival,
zsiros karimáju kőmüves kalapjával.
Tavaly, amikor jubileumát ülte, a gimnázium fáklyásmenetet
rendezett a tiszteletére. Ronda kiment a lakása erkélyére és
beszédet mondott. Mig minden fej meredt nyakkal bámult a
magasba, hogy hallja, hirtelen valami kellemetlen, nyivákoló hang
szólalt meg:
– Phü, de ronda szag van itt!
Mások ismételték:
– Phü, de ronda szag van itt!
– Phü, de ronda szag!
A professzor odafent elkezdett dadogni – bár előre sejtette az
incidenset – és valamennyi orditónak jól belelátott a tátott szájába. A
többi tanár ur a közelben állott; ő pedig érezte, hogy ujra nem tud
semmit »bizonyitani«; de az összes neveket beirta a fekete könyvbe.
És másnap a nyivákoló hang tulajdonosát – mert szegény nem tudta,
hol született az orleánsi szüz – jóindulatuan biztositotta, hogy még
sok kellemetlenséget szerez neki ebben az életben.
És csakugyan, Kieselackot nem engedte át a vizsgán. Vele együtt
hasaltak el mindazok, akik azon az emlékezetes jubileumi estén
orditoztak. Igy Ertzum is. Lohmann azonban nem orditott, mégis
megbukott. Az egyik a hanyagságával, a másik a
tehetségtelenségével segitette Ronda boszuját.
Félévvel később, egy őszi délelőtt 11 órakor, tiz perc alatt –
mielőtt iskolai dolgozatot irtunk volna az orleánsi szüzről – történt,
hogy Ertzum, aki még mindig nem tudott közelebb férkőzni a
szüzhöz és egy előrelátott katasztrófától félt, kétségbeesésében
felrántotta az ablakot és nyivákoló hangon – csak ugy találomra –
kiorditotta a ködbe:
– Ronda!
Nem tudta, hogy a tanár ur a közelben van-e és nem is törődött
vele. A szegény vállas vidéki kamaszt elragadta a szenvedélye, hogy
még egyszer utóljára egy pillanatra recsegtesse hangját, mielőtt két
óra hosszat kuporog egy üres fehér lap előtt, amelyet neki kell majd
– ugyancsak üres koponyája segitségével – szavakkal tele szántani.
Véletlenül Ronda csakugyan akkor ment keresztül az udvaron.
Mikor meghallotta a kiáltást, félreugrott. Fent a ködben felismerte
Ertzum tömzsi körvonalait. Egyetlen diák se volt lent az udvaron,
senkinek sem szólhatott Ertzum kiáltása.
– Most az egyszer – gondolta magában kárörömmel Ronda –
engem értett. Most az egyszer tetten értem.
Öt ugrással felrohant a lépcsőn, kitárta az osztály ajtaját,
keresztül rontott a padok között és rápattant a katedrára. Itt
reszketve megállott, fuldokolt, lélekzetet kellett vennie. A diákok
felállottak, hogy üdvözöljék, a fülsiketitő lárma egy pillanat alatt
bénult némasággá változott. Ugy tekintették az osztályfőnöküket,
mint egy közveszélyes állatot, akit sajnos, lebunkózni nem lehet, sőt,
aki rövid ideig veszedelmes fölényt nyert rajtuk. Ronda melle
hevesen zihált; végül vésztjósló hangon kibökte:
– Az imént ujból hallottam egy bizonyos szót, valaki felém
kiáltotta, egy jelzőt – egy nevet, amelyet egyáltalán nem türök. Nem
türöm, hogy olyan valaki, mint ön, akinek jellemét és tudását sajnos,
nagyon is van szerencsém ismerni, engem gyalázatos csufnévvel
illessen. Nem türöm, érti, nem türöm. Az ön elvetemültsége Ertzum
határtalan, de biztositom, hogy megtanitom keztyübe dudálni. Még
ma jelentést teszek az igazgató urnak és ami engem illet, minden
befolyásomat latba vetem, – jól jegyezzük meg – hogy az intézet
legalább az emberiség ilyen söpredékétől megtisztittassék.
Utána ledobta válláról a köpenyét és igy hörgött:
– Leülni!
Az osztály leült, csupán Ertzum maradt állva. Vastag, szeplős feje
most oly tüzvörös volt, mint sörtéi, a feje bubján. Valamit akart
mondani, többször pedzette, de benne rekedt a szó. Végre kinyögte:
– Nem én voltam, tanár ur kérem.
Több hang támogatta őt, áldozatkészen és barátian:
– Nem ő volt, tanár ur kérem.
Ronda felhördült:
– Csend legyen!… És ön, Ertzum, jegyezze meg, hogy már volt
egy éppen ilyen nevü ember – nemde, ugyebár – akinek a pályáját
hátráltattam és azt is jegyezze meg, hogy az ön további
előmenetelét ha nem is lehetetlenné, de mint annak idején a
nagybátyjáét, kinos-keservessé fogom tenni. Maga tiszt akar lenni,
ugy-e Ertzum? A nagybátyja is az akart lenni. Mivel azonban az előirt
tananyagot sohasem tudta sikeresen befejezni és az egy évi
önkéntesi szolgálathoz szükséges érettségi bizonyitványt – ennek
következéseképpen és folytán – sokáig nem kapta meg, afféle
svindli-gimnáziumba ment, ahol szintén megbukhatott és később
csak őfelsége legmagasabb kegyelme folytán lehetett tiszt, bár – ugy
látszik – ezt a pályát is hamar abba kellett hagynia. Nos tehát!
Ugyanez a sors, legalább is hasonló sors vár önre is, Ertzum. Sok
szerencsét hozzá! Egyébként a véleményem az ön egész familiájáról
Ertzum, már tizenöt esztendeje megvan és nem változott… Mivel
pedig –
Itt Ronda hangja siri karaktert öltött.
– Ön szellemtelen fajankó, meg se érdemli, hogy foglalkozzék
annak a magasztos szüznek az alakjával, akire most áttérünk:
takarodjék innen, ki a dutyiba!
Von Ertzum, aki kissé nehézfejü volt, még mindig figyelt, ámult-
bámult, hogy mit akar. Észre se vette, hogy a megfeszitett figyeléstől
állkapcsával öntudatlanul utánozta a professzor állának a
mozdulatait. Ronda álla, amelynek felső részéből több sárgás tüske
meredezett kifelé, ugy forgott a két feszes szájszöglet között, mintha
tengelyen keringene, a nyála pedig egész az első padig fröccsent.
Orditani kezdett:
– Még merészkedik, szemtelen kölyök!… Takarodjék ki –
mondtam már – ki a dutyiba!
Ertzum riadtan szédült ki a padból. Kieselsack odasugott neki:
– Vigyázz.
Lohmann fojtott hangon bátoritotta:
– Ne félj, majd elbánunk vele.
Az elitélt a katedra előtt ódalgott a kis helyiségbe, amely az
osztály ruhatárául szolgált és vak sötétség uralkodott benne. Ronda
megkönnyebbülten sóhajtott fel, amikor az ajtó a vállas legény
mögött becsukódott.
– Most pedig igyekezzünk pótolni, a mulasztott időt, mondta,
amelyet ez a lurkó ellopott tőlünk. Angst, itt van a feladat, fogja, irja
a táblára.
Az eminens fogta a cédulát, közellátó szemeihez emelte és lassan
nekifogott az irásnak. Valamennyien izgalmas várakozással lesték,
hogy milyen betük támadnak a kréta nyomán. Minden ettől függött.
Ha olyan jelenetről lesz szó, amelyet véletlenül sohasem »vettek át«,
akkor egyiknek sincs »dunsztja« a dologról és akkor »benne vannak
a pácban«, Babonából már előre mondogatták, még mielőtt a betük
a táblán kialakultak volna:
– Boldog Isten, dacit kapok.
Végre felirta:
Our website is not just a platform for buying books, but a bridge
connecting readers to the timeless values of culture and wisdom. With
an elegant, user-friendly interface and an intelligent search system,
we are committed to providing a quick and convenient shopping
experience. Additionally, our special promotions and home delivery
services ensure that you save time and fully enjoy the joy of reading.
textbookfull.com