Zero is the Devil:Vanlige måter å konstruere falske bevis på

 C Programming >> C C# Program >  >> Tags >> struct
Zero is the Devil:Vanlige måter å konstruere falske bevis på

Det er lett å gjøre feil når du utfører matematiske bevis. Likevel kan du finne noen tilbakevendende feilmønstre i disse bevisene. Og noen av de vanligste årsakene er knyttet til det ufarlige tallet null.

Division-by-zero-fun

La oss se på følgende "bevis" av 1 = 2 1 =2 1=2:

la  a , b Z  slik det  a = b a 2 = a b a 2 b 2 = a b b 2 ( a + b ) ( a b ) = b ( a b ) a + b = b a + a = a 2 a = a 2 = 1 \begin{aligned}\text{la } a, b \in \mathbb{Z} \text{ slik at } a =b \\a^2 &=ab \\a^2 - b^2 &=ab - b^2 \\(a + b)(a - b) &=b(a - b) \\a + b &=b \\a + a &=a \\2a &=a \\2 &=1\end{aligned} la a,b∈Z slik at a=ba2a2−b2(a+b)(a−b)a+ba+a2a2​=ab=ab−b2=b(a−b)=b=a=a=1 ?

Hva er galt her? Vi kansellerer begge sider av ligningen med a b a - b a−b, men premisset vårt inkluderer a = b a =b a=b, så vi har et divisjon-på-null-problem.

Vanligvis er det en forferdelig idé å utføre kansellering uten en nullsjekk og bør unngås.

Sett med null elementer

Ok, her er nok et dumt "bevis" på at "alle objekter er like." Vi vil anta at objekter er tellbare.

Bevis:

La S S S være settet av alle objekter.Og la egenskapen P ( n ) P(n) P(n) betyr at alle undersett av S S S av størrelse maksimalt n n n inneholder de samme objektene. Formelt:

P ( n ) X Pow ( S ) ,    X n  slik det  o , o   X , o = o P(n) \equiv \forall X \in \text{Pow}(S),\; |X| \leq n \text{ slik at } \forall o, o' \ \i X, o =o' P(n)≡∀X∈Pow(S),∣X∣≤n slik at ∀o,o′ ∈X,o=o′

hvor Pow ( S ) \text{Pow}(S) Pow(S) er kraftsettet til settet S S S, som er definert av alle undersett av S S S, og X |X| ∣X∣ betyr kardinaliteten (antall elementer) til X X X.

Stopp et øyeblikk og forstå hva denne definisjonen betyr, slik vi vil bruke den i følgende "bevis".

Vi ønsker å bevise at n > 1 , P ( n ) \forall n> 1, P(n) ∀n>1,P(n). Og vi vil bevise det ved matematisk induksjon på n n n.

Grunnfall (n = 1 n =1 n=1):

Dette er trivielt ettersom enkeltsettet med objekter bare kan inneholde det samme objektet.

Induktive tilfeller:

Vi behandler P ( n ) P(n) P(n) som vår induktive hypotese, og vi må bevise P ( n + 1 ) P(n + 1) P(n+1). Uten tap av generalitet, velg et vilkårlig sett X Pow ( S ) X \in \text{Pow}(S) X∈Pow(S) slik at X = n + 1 |X| =n + 1 ∣X∣=n+1.Velg to objekter x , x X x, x' \i X x,x′∈X, og la oss vise x = x x =x' x=x′.La Y = X x Y =X - {x} Y=X−x og Y = X x Y' =X - {x'} Y′=X−x′. Siden Y n , Y n |Y| \le n, |Y'| \le n ∣Y∣≤n,∣Y′∣≤n, vi vet at P ( Y ) P(Y) P(Y) og P ( Y ) P(Y') P(Y′) ved den induktive hypotesen.Velg et vilkårlig objekt y Y Y y \in Y \cup Y' y∈Y∪Y′.Vi får y = x y =x y=x på grunn av P ( Y ) P(Y) P(Y) og x , y Y x,y \i Y x,y∈Y. Tilsvarende y = x y =x' y=x′. Dermed x = x x =x' x=x′,som beviser de induktive trinnene og "teoremet" n > 1 , P ( n ) \forall n> 1, P(n) ∀n>1,P(n).

Igjen er feilen her knyttet til null. Y Y |Y \cup Y'| ∣Y∪Y′∣ kan godt være null, så vi kan ikke bare "plukke" et element fra det.

Hvis du har en mer programmeringsbakgrunn, er det ingen tilfeldighet at å dele med null eller hente et element fra en samling av null-elementer vil forårsake fryktelige kjøretidsfeil.

Og de fleste typesystemer vil ikke redde deg (bortsett fra avhengige typesystemer, som har sine egne begrensninger.)

Jeg håper du har det gøy med å lese dette innlegget, akkurat som jeg har det gøy med å skrive det.