ISETL-Harjoitus 4, 1999. Laskutoimitus ja kertausta

Tehtävä 1. Määrittely- ja maalijoukoista

ISETL-funktio func on pelkistetyimmillään vain sääntö, jonka määrittelemät temput sen sisällä tehdään ja mitä saadaan ulos, ts. minkä arvon sääntö palauttaa. Edellisiä testejä ja tietenkin mitä tahansa totuusarvotyyppiä olevia lausekkeita tulee käyttää func:issa estämään vääränlaiset operaatiot, esim. nollalla jako. Jatkossa olemme entistä tarkempia funktion määrittelyjoukon ja maalijoukon suhteen.
Muunna vanha funktiomme kongruenttiko
>       kongruenttiko := func(a,b,m);
>>      return ((a-b) mod m = 0);
>>      end func;
sellaiseksi, että se palauttaa arvon OM aina, kun parametrien arvot eivät ole kongruenssin Määritelmän 3.1 mukaisia (piti siis olla a, b Î Z ja m Î N). Helpoiten temppu onnistuu estämällä testeillä return käskyrivin suoritus.
Kysymys: Mikä siis on saadun kolmen muuttujan kongruenttiko-funktion määrittelyjoukko, mikä sille sopiva maalijoukko?
Määrittelyjoukko: 
 Maalijoukko: 

Tehtävä 2. Modulo-aritmetiikkaa: kertolasku

a) Kirjoita seuraava koodi ja vastaa alla oleviin kysymyksiin.
>    Z9 := {0..8};
>    k9 := func(x,y);
>>    if (x in Z9 and y in Z9) then 
>>    return (x*y) mod 9;
>>    end if;
>>    end func;
Mikä on tämän funktion määrittelyjoukko? 
  Entä maalijoukko? 
Mitä ovat k9(2,3), k9(3,3), k9(8,8), k9(6,7), 6 .k9 7?

Vastaukset:



ISETLissä voit siis funktiokutsun k9(a,b) sijasta kirjoittaa myös a .k9 b. Mitä huomaat pisteen paikasta ja välien jättämisestä? 

b) Muodosta alle kertolaskutaulukko. Voit laskea tarvittavat tulokset helposti ISETL-rakenteilla vaikkapa tuplena tai sitten luupeilla.

Tehtävä 3. Modulo-aritmetiikkaa: yhteenlasku

Kirjoita kahden muuttujan funktio s9, jonka syötteet ovat joukon Z9 alkioita ja joka palauttaa näiden lukujen summan modulo 9 (ks. tehtävä 2). Laske s9(2,3), s9(4,5), s9(8,8), s9(6,7), 6 .s9 7
Olemme määritelleet kaksi laskutoimitusta k9 ja s9 joukossa Z9. Merkitään niitä jatkossa normaalissa matemaattisessa tekstissä *9 ja +9, mutta ISETLissä kuten edellä.

Tehtävä 4. Permutaatioaritmetiikkaa

Permutaatio on tapa järjestää n luvun joukko. ISETLissä permutaatioita esitetään TUPLEilla. Esimerkiksi [1,3,2,4] on permutaatio joukosta S4. Kirjoita seuraavat koodinpätkät ja vastaa kysymyksiin:
>    S3 := {[a,b,c]: a,b,c in {1,2,3}: #{a,b,c} = 3};
>    os := func(p,q);
>>     if (p in S3 and q in S3) then
>>      return [p(q(i)) | i in [1,2,3]];
>>     end if;
>>    end func;
Mitä ovat os([2,1,3],[1,3,2]), os([2,3,1],[3,1,2]), [2,3,1] .os [3,1,2]?
Vastaus:


Mikä on funktion os määrittelyjoukko? 
 Entä maalijoukko? 

Tehtävä 5. Suljettuko?

Laskutoimituksen on oltava funktio G×G ® G, eli jokaiseen pariin pitää liittyä kyseisen joukon alkio. Testaa funktiolla suljettuko
>  suljettuko := func(J,op);
>>  return (forall x,y in J: (x .op y) in J);
>>  end;
ovatko parit (Z9,+9), (Z9,*9) ja (S3,os) suljettuja, siis että ''pysyvätkö laskutoimituksen tulokset samassa joukossa''.
Huomautus. Tämä ja seuraavaksi määritellyt funktiot tulevat olemaan jatkossa kovassa käytössä. Ne pyydetään kotitehtävinä sijoittamaan yhteen tekstitiedostoon luettaviksi muistiin aina tarvittaessa. Teemme niistä myöhemmin yhteiset versiot.

Tehtävä 6. Neutraalialkio

Löytyykö sellaista alkiota Y Î Z9, jolle x *9 Y = x ja Y *9 x = x kaikkilla x Î Z9
  Jos löytyy, niin mikä se on? 
Sellaista alkiota sanotaan parin (Z9,*9) neutraalialkioksi eli nolla-alkioksi.
Muodostakaa ISETL-funktio neutraali, joka etsii annetusta joukosta G neutraalialkion annetun laskutoimituksen o suhteen. Jos neutraalialkiota ei löydy, palautetaan tuntematon arvo OM. Voitte alkaa taas näin:
>  neutraali := func(J,op);
ISETL-demojen 2 tehtävästä 6 löydät sopivia rakenteita!
Testatkaa toiminta pareilla (Z9,+9), (Z9,*9) ja (S3,os).
Neutraalialkiot ovat:

Tehtävä 7

a) Olkoon e2 (siis mikä?) laskutoimituksen +9 neutraalialkio joukossa Z9. Löytyykö jokaiselle joukon Z9 alkiolle x sellainen alkio y Î Z9,
että x+9y = e2 ja y +9 x = e2
Ehdottakaa nimitystä tuollaiselle alkiolle! 

b) Kirjoita funktio, jonka syötteenä on joukko G ja laskutoimitus o ja joka tutkii, onko kaikille joukon G alkioille olemassa edelläkuvatunlainen alkio laskutoimituksen o suhteen.
Kutsutaan jatkossa kyseisiä alkiota käänteisalkioiksi.
Testaa löytyykö jokaiselle joukon Z9 alkiolle käänteisalkio laskutoimituksen *9 suhteen? 
 Mikä? 
Testaa löytyykö jokaiselle joukon S3 alkiolle käänteisalkio laskutoimituksen os suhteen? 
 Mikä? 

c) Kirjoita funktio kaanteis, jonka syötteenä on joukko G, laskutoimitus o ja joukon G alkio g, ja joka palauttaa alkion g käänteisalkion laskutoimituksen o suhteen joukossa G.
Mikä on alkion [2,3,1] käänteisalkio joukossa S3 laskutoimituksen os suhteen? 
Etsi luvun 7 Î Z9 käänteisalkio laskutoimituksen +9 suhteen. 
Ja vielä laskutoimituksen *9 suhteen. 

Tehtävä 8. Eräs testi

a) Mitä seuraava funktio tutkii?
>  hehheh:=func(G,o);
>>  return forall x,y in G: x .o y = y .o x;
>>  end func;
Mille pareista (Z9,+9),(Z9,*9) ja (S3,os) se palauttaa true?
Pareille:


b) Kirjoita funktio liitannainenko, joka tutkii, onko laskutoimitus o liitännäinen joukossa G. Mille pareista (Z9,+9),(Z9,*9) ja (S3,os) se palauttaa true? 

Tehtävä 9. Tyypin testaus, relaatio

a) ISETL:issä on useita tyypintestauskäskyjä (ks. Quick Reference tai monisteen liite), joilla voi kysyä onko joku olio merkki(jono), totuusarvo, kokonaisluku, rationaaliluku tai yleensäkään mikään luku, tai onko se joukko, tuple tai funktio.
Selvitä mitä tekevät seuraavat ISETL-rivit:
>     is_string(5); is_string("5"); 
>     is_string(ISETLW); is_string("ISETLW");
>     is_number(-4*3.14); is_number(2 < 3);
>    
>     a := 3*2.4; b := "merkkijono"
>     is_number(a); is_number(b);
>     is_integer(-3); is_integer("2"); is_integer(3/2);
>     is_integer(3 div 2); is_integer(2.5); is_integer(a);
>    
>     is_defined(a); is_defined(b); is_defined(c);
>    
>     is_boolean(true); is_boolean(false);
>     is_boolean(TRUE); is_boolean("true");
>     is_boolean(is_boolean(false));
>     
>     is_tuple({a,b}); is_tuple([a,b]); 
>     is_set({a,b}); is_set([a,b]); is_set(a,b);
>     is_func(|x -> x**2|);
>     is_map({[1,2],[1,4]}); is_map([[1,2],[1,4]]);
>     is_func(k9);
>     K := {[[x,y], k9(x,y)] | x,y in Z9};
>     is_map(K); is_func(K);
b) Tyyppi map on matemaattisesti ottaen relaatio, ts. jonkin karteesisen tulon A×B osajoukko. Sen erikoistapaus smap on relaatio, joka on myös funktio. Muodosta ISETL-funktio is_smap, joka testaa onko annettu relaatio funktio.

Tehtävä 10. Logiikkaa

a) Arvaa ensin - ja kokeile jos tarpeen - mitä tulostavat seuraavat ISETL-käskyt:
>       true and false; true and (not false);
>       true impl false; false impl true;
>       (1 < 2) impl (2 > 3);
>       (1 < 2) impl (2 < 3);
>       true iff true;
>       true iff false;
b) ISETL-komento impl vastaa matematiikan ''jos-niin'' ilmausta, esimerkiksi väite
Jos a on jaollinen neljällä, niin a on jaollinen kahdella.

voidaan kirjoittaa ISETLissä näin:

>    (a mod 4 = 0) impl (a mod 2 = 0);
Miten tutkit ISETLillä äskeisen väitteen todenperäisyyttä kaikille a Î {-50,-49,...,50}?
ISETL-rakenne:


c) Mitä tehdään seuraavassa?
>   for TA1 in [true,false] do
>>      for TA2 in [true,false] do
>>      print [TA1, TA2, TA1 and TA2,
>>          TA1 or TA2, TA1 impl TA2, TA1 iff TA2];
>>      end for;
>>  end for;

File translated from TEX by TTH, version 1.96.
On 11 Oct 1999, 09:39.