Kikapu kutoka sokoni
Amara na babu yake wamerudi nyumbani kutoka sokoni wakiwa na kikapu kikubwa. Kuna ndizi na malimau, matufaha na stroberi, tango moja, pea moja, chungwa moja na karoti moja.
"Tuweke kila kitu mahali pake," anasema Babu. "Lakini kila kitu kinakwenda wapi?"
Ili kupanga vizuri, Amara anahitaji kanuni — njia ya kuamua kila kitu kinakaa wapi. Wanahisabati hufanya hivi kila wakati. Wao hukusanya vitu katika mikusanyiko.
Panga kikapu
Jaribu kupanga kikapu wewe mwenyewe. Kwanza panga kwa rangi. Kisha anza upya na upange kwa umbo.
Mchezo wa kupanga sokoni
Chagua kitu kutoka kwenye kikapu, kisha chagua sanduku linalokifaa.
Kikapu
Chagua kitu kutoka kwenye kikapu.
Je, uliona sanduku la vitu vya buluu? Hakuna kitu kilichoingia ndani yake. Je, bado ni mkusanyiko? Endelea kusoma ili ujue!
Mawazo makuu
Fasili— mkusanyiko
Mkusanyiko ni vitu kadhaa tunavyovifikiria kwa pamoja. Vitu vilivyomo katika mkusanyiko huitwa wanachama wake.
Kitu kinapokuwa katika mkusanyiko, tunasema kwamba kitu hicho ni mwanachama wa mkusanyiko huo. Ndizi ni mwanachama wa mkusanyiko wa vitu vya njano. Tufaha si mwanachama.
Fasili— mkusanyiko uleule
Mikusanyiko miwili ni mkusanyiko uleule inapokuwa na wanachama walewale kabisa. Haijalishi wanachama wamepangwa kwa mpangilio gani.
Fasili— mkusanyiko mtupu
Mkusanyiko usio na mwanachama hata mmoja huitwa mkusanyiko mtupu. Sanduku la vitu vya buluu ni tupu — lakini bado ni mkusanyiko!
Tufanye mazoezi pamoja
Mfano— Je, ni mwanachama?
Huu hapa ni mkusanyiko: 🍎 🍌 🍐.
- Je, 🍌 ni mwanachama? Ndiyo — iko pale pale.
- Je, 🍋 ni mwanachama? Hapana — tazama kwa makini. Hakuna limau.
Mfano— Uleule, au tofauti?
Sanduku la Kenji lina 🍎 na 🍌. Sanduku la Lucía lina 🍌 na 🍎.
Yana wanachama walewale, ila kwa mpangilio tofauti tu. Kwa hiyo ni mkusanyiko uleule.
Mfano— Ni vingapi?
Hesabu mkusanyiko 🍊 🍋 🍎 🍓. Gusa kila kimoja mara moja na useme namba: moja, mbili, tatu, nne. Kuna wanachama 4.
Sasa vihesabu ukianzia kwenye stroberi. Bado unapata 4!
Kwa nini kuhesabu hutoa jibu lilelile kila mara
Tunapohesabu, tunaoanisha kila kitu na neno moja tu la kuhesabia: moja, mbili, tatu, nne. Kila kitu kinapata neno moja, na hakuna neno linalotumika mara mbili.
Ukianzia mahali pengine, unafanya uoanishaji tofauti — lakini bado unatumia maneno yaleyale ya kuhesabia, kwa sababu idadi ya vitu ni ileile kama mwanzo. Hakuna kilichoongezwa na hakuna kilichoondolewa.
Kwa watu wazima · wazo hili linakuwa nini baadaye
Wazo kwamba "kuhesabu ni kuoanisha" ni mbegu ya wazo zito katika hisabati: mikusanyiko miwili ina idadi sawa ya wanachama ikiwa na tu ikiwa wanachama wake wanaweza kuoanishwa mmoja kwa mmoja. Baadaye sana, wazo hili la kuoanisha huwawezesha wanahisabati kulinganisha ukubwa wa mikusanyiko isiyo na kikomo.
Mchezo wa ndiyo-au-hapana wa Gideon
Gideon anapenda kauli ambazo ni kweli waziwazi au si kweli waziwazi. Tazama mkusanyiko wa vitu vya njano: 🍌 🍋. Je, kila kauli ni kweli au si kweli?
- "Ndizi ni mwanachama wa mkusanyiko wa njano." — Kweli.
- "Kila mwanachama wa mkusanyiko wa njano ni mrefu." — Si kweli! Limau ni la mviringo. Mfano mmoja unaovunja kanuni unatosha kuonyesha kwamba kauli si kweli.
- "Kuna mwanachama wa mkusanyiko wa buluu." — Si kweli. Mkusanyiko wa buluu ni mtupu.
Kwa watu wazima · mawazo yaleyale katika Lean, kikagua uthibitisho
Wasaidizi wa uthibitisho wa kompyuta kama Lean wanaweza kukagua kauli kama hizi. Hapa chini, kikapu kimeandikwa kama orodha ya Lean. Lean inakagua kwamba embe ni mwanachama wa kikapu, kwamba kikapu kina wanachama 3, na kwamba hakuna kitu kilicho mwanachama wa orodha tupu.
/-- There is a mango in the basket: it is the very first thing in the list. -/
theorem mango_in_basket : "mango" ∈ basket :=
List.Mem.head ["orange", "banana"]/-- The basket holds three pieces of fruit. Lean counts them itself, so `rfl` is enough. -/
theorem basket_count : basket.length = 3 := rfl/-- The empty list has no members at all. -/
theorem nothing_in_empty : ∀ x : String, x ∉ ([] : List String) := by
intro x h
-- A proof of `x ∈ []` would have to come from one of the ways of building membership,
-- but none of them produces an empty list, so there is no case left to consider.
cases hOrodha hukumbuka mpangilio, kwa hiyo Lean inasema orodha [1, 2] ni tofauti na [2, 1] — ingawa zina wanachama walewale kabisa. Mkusanyiko unaosahau mpangilio ndio wanahisabati wanaouita seti, mada ya somo linalofuata.
/-- For lists, order matters: `[1, 2]` and `[2, 1]` are different lists.
`decide` asks Lean to compare the two lists element by element. -/
theorem order_matters_for_lists : ([1, 2] : List Nat) ≠ [2, 1] := by decide/-- …but `[1, 2]` and `[2, 1]` have exactly the same members. As *sets* they would be equal;
as *lists* they are not (see `order_matters_for_lists`). -/
theorem same_members : ∀ x : Nat, x ∈ [1, 2] ↔ x ∈ [2, 1] := by
intro x
-- Being in a list means being equal to one of its entries:
-- `x ∈ [1, 2]` unfolds to `x = 1 ∨ x = 2`, and `x ∈ [2, 1]` to `x = 2 ∨ x = 1`.
simp only [List.mem_cons, List.not_mem_nil, or_false]
-- "or" does not care about order.
exact Or.commMargaret anahesabu kikapu cha sokoni
Kwa watu wazima · Programu ya Margaret
Programu hii ya Python inapanga kikapu cha sokoni kwa aina na kwa rangi, na inahesabu kila fungu. Bonyeza Endesha ili uijaribu kwenye kivinjari chako. Pia inajaribu mipangilio yote 720 ya kikapu chenye vitu 6. Hilo linakagua kikapu hiki tu; maelezo yaliyo hapo juu yanatuambia kwa nini inafanya kazi kwa kila kikapu.
"""Sorting and counting a market basket.
A *collection* here is a basket of items. Two mangoes are two different items
that happen to share a name, so the basket is a list (order and repeats are
recorded), not a set. We sort the basket by a property, count each group, and
check that the counts do not depend on the order in which the items were
picked.
Runs unchanged in the browser (Pyodide) using only the standard library.
"""
from collections import Counter
from itertools import permutations
from math import factorial
import textwrap
#: The basket, in the order the items were picked. Each item is
#: (name, kind, colour). Repeated names are separate items.
BASKET = (
("mango", "fruit", "yellow"),
("okra", "vegetable", "green"),
("banana", "fruit", "yellow"),
("lime", "fruit", "green"),
("carrot", "vegetable", "orange"),
("mango", "fruit", "yellow"),
("aubergine", "vegetable", "purple"),
("orange", "fruit", "orange"),
("lime", "fruit", "green"),
("yam", "vegetable", "brown"),
)
#: Positions of each property inside an item tuple.
PROPERTIES = {"name": 0, "kind": 1, "colour": 2}
def value(item, prop):
"""Return the value of property ``prop`` ("name", "kind" or "colour") of an item."""
try:
return item[PROPERTIES[prop]]
except KeyError:
raise ValueError(f"unknown property {prop!r}; expected one of {sorted(PROPERTIES)}") from None
def sort_by(items, *props):
"""Return a new list of the items sorted by the given properties, in priority order.
The original collection is not changed. With no properties, items are sorted
by (name, kind, colour) as plain tuples.
"""
if not props:
return sorted(items)
return sorted(items, key=lambda item: tuple(value(item, p) for p in props))
def group_by(items, prop):
"""Group items by a property: return {value: [items with that value]} with keys sorted."""
groups = {}
for item in items:
groups.setdefault(value(item, prop), []).append(item)
return {key: groups[key] for key in sorted(groups)}
def count_by(items, prop):
"""Count how many items have each value of ``prop``: {value: count}, keys sorted."""
counts = Counter(value(item, prop) for item in items)
return {key: counts[key] for key in sorted(counts)}
def distinct_values(items, prop):
"""Return the set of different values of ``prop`` that occur in the collection."""
return {value(item, prop) for item in items}
def counts_same_in_every_order(items, prop):
"""Check every ordering of ``items``: do the group counts by ``prop`` ever change?
Returns ``(orders_checked, all_same)``. The number of orders is n!, so this
is only practical for small collections (n <= 8 or so).
"""
items = list(items)
reference = count_by(items, prop)
checked = 0
for order in permutations(items):
checked += 1
if count_by(order, prop) != reference:
return checked, False
return checked, True
def format_counts(counts):
"""Format {value: count} as 'a 2, b 3' with the total in brackets."""
parts = ", ".join(f"{key} {n}" for key, n in counts.items())
return f"{parts} (total {sum(counts.values())})"
def main():
basket = list(BASKET)
print(f"A market basket of {len(basket)} items, in the order they were picked:")
print(" " + ", ".join(value(item, "name") for item in basket))
print()
print("Sorted by kind, then colour, then name:")
print(f" {'kind':<10} {'colour':<8} name")
for item in sort_by(basket, "kind", "colour", "name"):
print(f" {value(item, 'kind'):<10} {value(item, 'colour'):<8} {value(item, 'name')}")
print()
by_kind = count_by(basket, "kind")
by_colour = count_by(basket, "colour")
print("Counts by kind: " + format_counts(by_kind))
print("Counts by colour: " + format_counts(by_colour))
sums = " + ".join(str(n) for n in by_kind.values())
print(f"Every item lands in exactly one group, so the groups add up: {sums} = {len(basket)}.")
names = distinct_values(basket, "name")
print(f"Different names: {len(names)} (two mangoes are two items with one name).")
print()
small = basket[:6]
n_orders = factorial(len(small))
print(f"Does order matter? Take the first {len(small)} items and try all {len(small)}! = {n_orders} orders:")
for prop in ("kind", "colour"):
checked, same = counts_same_in_every_order(small, prop)
print(f" counts by {prop:<6} identical in all {checked} orders: {same}")
print()
print(textwrap.fill(
"Epistemic status: the counts above are exact, and all "
f"{n_orders} orders of the 6-item basket were checked, which proves "
"order-independence for that basket only. Why it holds for every finite "
"collection (counting pairs items with 1, 2, 3, ...) is explained in the "
"lesson, not by this program.",
width=78,
))
if __name__ == "__main__":
main()Zamu yako
Usiwe na haraka. Unaweza kuomba kidokezo wakati wowote unapotaka.
1. Mikusanyiko
Kupasha motoKibinadamuHuu hapa ni mkusanyiko: 🍎 🍌 🍐. Ni kipi kati ya hivi ambacho ni mwanachama wa mkusanyiko huu?
2. Mikusanyiko
Kupasha motoKibinadamuMkusanyiko huu una wanachama wangapi? 🍊 🥕 🍋 🍎 🍐
3. Mikusanyiko
MsingiKibinadamuSanduku la Kenji lina 🍎 🍌 🍐. Sanduku la Lucía lina 🍐 🍎 🍌. Je, ni mkusanyiko uleule?
4. Mikusanyiko
MsingiKibinadamuSanduku la matunda ya buluu ni tupu. Mkusanyiko mtupu una wanachama wangapi?
5. Mikusanyiko
MsingiRasmiMchezo wa Gideon: mkusanyiko ni 🍌 🍋 🥒. Je, kauli hii ni kweli au si kweli? "Kila mwanachama wa mkusanyiko huu ni wa njano."
6. Mikusanyiko
ChangamotoKibinadamuKwa watoto wakubwa zaidi: kutoka kwa tufaha (apple), ndizi (banana), stroberi (strawberry) na limau (lemon), andika mkusanyiko wa vitu vyekundu. Tumia maneno ya Kiingereza yanayoonyeshwa kama msimbo, yakitenganishwa kwa koma, kama {kiwi, plum}.
Mambo yanayowachanganya watu
Wazo potofu
"Sanduku tupu si mkusanyiko." Ni mkusanyiko! Mkusanyiko mtupu ni mkusanyiko halisi — ila tu hauna wanachama. Wanahisabati wanauona kuwa wa manufaa sana.
Wazo potofu
"Nikivihamisha vitu, napata mkusanyiko tofauti." Kuwahamisha wanachama hubadilisha mpangilio, si mkusanyiko. Wanachama walewale maana yake ni mkusanyiko uleule.
Wazo potofu
"Vitu vikubwa huhesabiwa zaidi." Nazi kubwa na stroberi ndogo, kila kimoja huhesabiwa kama mwanachama mmoja.
Staajabu zaidi
Je, unaweza kuweka sanduku ndani ya sanduku? Kuna nini ndani ya sanduku lenye sanduku tupu peke yake? Fuata njia hii ikiwa una udadisi — ni ya hiari kabisa.
Njia ya Maajabu · Hiari · haipewi alama kamweBoxes inside boxesWhat is inside a box that contains only an empty box? Is it empty? And can every description you can think of make a collection?Fuata njiaMikusanyiko inatupeleka wapi
Katika somo linalofuata, mikusanyiko inapata jina la watu wazima: seti. Wanahisabati huandika seti ndani ya mabano ya maua, kama , na huandika seti tupu kama .
Kanuni kwamba "mikusanyiko miwili ni mkusanyiko uleule inapokuwa na wanachama walewale" ni mojawapo ya kanuni muhimu zaidi kuhusu seti. Inaitwa kanuni ya upanuzi (kwa Kiingereza, principle of extensionality).
Kwa watu wazima · kanuni za kupanga ni fanksheni
Kanuni ya kupanga inayopeleka kila kitu kwenye sanduku moja tu ni mfano wa fanksheni — mada ya somo la 4. Fanksheni, na njia zinavyojumuishwa, hatimaye huelekea kwenye nadharia ya kategoria. Wanafunzi wadogo hawahitaji neno lolote kati ya haya; kupanga kunatosha.
Kuhesabu duniani kote, zamani sana
Watu wamekuwa wakihesabu mikusanyiko kwa muda mrefu sana.
- Kusini mwa Afrika, mfupa wa nyani wenye mikato — mfupa wa Lebombo — una umri wa zaidi ya miaka elfu arobaini. Baadhi ya watafiti wanadhani mikato hiyo ilikuwa alama za kuhesabia, ingawa hakuna anayejua kwa hakika.
- Katika milima ya Andes ya Amerika Kusini, watunza kumbukumbu wa Inka walitumia khipu: kamba zenye mafundo ili kurekodi idadi ya watu, wanyama na bidhaa.
- Tamaduni nyingi zilihesabu kwa vidole vya mikono na miguu, kokoto na mafundo. Neno la Kiingereza calculate (kukokotoa) linatokana na neno la Kilatini linalomaanisha kokoto ndogo.
Kwa watu wazima: usomaji zaidi
- Paul R. Halmos, Naive Set Theory (1960) — utangulizi maarufu na unaosomeka kwa urahisi kuhusu seti kwa watu wazima (kwa Kiingereza).
- Shughuli za kupanga na kuhesabu kwa watoto wadogo zinapatikana katika tovuti nyingi za elimu za bure, kama sehemu ya miaka ya awali ya NRICH (nrich.maths.org, kwa Kiingereza).
Tafakari ya Kikristo ya hiari · kila mmoja ana thamani
Tafakari kutoka katika mapokeo ya Kikristo yanayoihamasisha The Lumenary. Si sehemu ya hisabati, na uko huru kuiruka.
Katika mojawapo ya mifano ya Yesu, mchungaji ana kondoo mia moja. Mmoja anapopotea, mchungaji anatambua — kwa sababu analijua kundi lake, mmoja mmoja — na anatoka kwenda kumtafuta (Luka 15:3–7). Katika hadithi hiyo, kuhesabu ni namna ya kujali: kila mwanachama wa mkusanyiko ana thamani. Hisabati hufundisha tabia hiyohiyo ya kuwa makini, na kila mwanafunzi, kila mahali, ana thamani.