(* a - definicija kartice *) (* Omejimo možnost izbire tipa kartice *) datatype vrsta = Debit | Credit (* Omejimo možnost izbire mesecev *) datatype mesec = Jan | Feb | Mar | Apr | Maj | Jun | Jul | Avg | Sep | Okt | Nov | dec (* Omejimo stevilko kartice na dolžino 16 *) type stevilka = int * int * int * int * int * int * int * int * int * int * int * int * int * int * int * int type kartica = { imePriimek : string, vrstaKartice : vrsta, izdajatelj : string, datumVeljavnosti : mesec * int, stevilkaKartice : stevilka } (* b - veljavna kartica *) val asistent : kartica = { imePriimek = "Peter Gabrovsek", vrstaKartice = Debit, izdajatelj = "Visa", datumVeljavnosti = (Maj, 21), stevilkaKartice = (4, 6, 4, 3, 0, 4, 0, 0, 0, 0, 4, 2, 3, 4, 5, 1) } (* c - neveljavna kartica *) val profesor : kartica = { imePriimek = "", (* neveljaven je prazen niz ... *) vrstaKartice = Debit, izdajatelj = "NeveljavnoImeIzdajatelja", (* ... ali prepoln *) datumVeljavnosti = (Maj, 219875), (* neveljavno leto *) stevilkaKartice = (4, 6, 4, 3, 0, 4, 0, 0, 0, 0, 4, 2, 3, 4, 5, 1) } (* d - validacija kartice *) (* validacija posameznih komponent kartice *) fun validirajImePriimek (s : string) : bool = size s > 0 andalso size s <= 21 fun validirajIzdajatelj (s : string) : bool = size s > 0 andalso size s <= 16 fun validirajLeto (l : int) : bool = l >= 0 andalso l <= 100 fun preveriCifre [] = true | preveriCifre (h::t) = (h >= 0) andalso (h <= 9) andalso (preveriCifre t) fun validirajStevilkaKartice (sk : stevilka) : bool = let val (a, b, c, d, e, f, g, h, i, j, k, l, m, n, p, q) = sk in preveriCifre [a, b, c, d, e, f, g, h, i, j, k, l, m, n, p, q] end (* validacija kartice *) fun validiraj (k : kartica) : bool = validirajImePriimek (#imePriimek k) andalso validirajIzdajatelj (#izdajatelj k) andalso validirajLeto (#2 (#datumVeljavnosti k)) andalso validirajStevilkaKartice (#stevilkaKartice k) (* validiramo le posamezne cifre *)