PROGRAMMIERAUFGABE 1.1 (* indivbysmall n l überprüft, ob n durch alle Elemente der Liste l, deren Quadrat kleiner gleich n ist, unteilbar ist. Die Liste l ist aufsteigend geordnet. *) fun indivbysmall n [] = true | indivbysmall n (m::l) = m*m > n orelse (n mod m > 0 andalso indivbysmall n l); fun primes 0 = [] | primes 1 = [] | primes n = let val p = primes (n-1) in if indivbysmall n p then p @ [n] else p end; PROGRAMMIERAUFGABE 1.2 (* contains l e überprüft, ob e in der Liste l enthalten ist. *) fun contains [] e = false | contains (e::rest) e' = (e = e') orelse contains rest e'; fun fromfirstcomm [] _ = [] | fromfirstcomm (e::rest) elist = if contains elist e then (e::rest) else fromfirstcomm rest elist; PROGRAMMIERAUFGABE 1.3 fun addtolist _ [] l = l | addtolist s (t1::_) [] = [(t1,[s])] | addtolist s (t1::tl1) ((t,tsl)::rest) = if t1 = t then (t,s::tsl)::rest else (t,tsl)::(addtolist s (t1::tl1) rest); fun distrib [] _ = [] | distrib ((s,stl)::rest) g = let val distribrest = distrib rest g val favdate = fromfirstcomm stl g in addtolist s favdate distribrest end; AUFGABE 1.4 Siehe Skript, Abschnitt 3.2.4. AUFGABE 1.5 Die erste und die dritte Deklaration definieren die gleiche Funktion. Diese erwartet nacheinander zwei int-Argumente, hat also den Typ int -> int -> int. Die zweite Deklaration definiert eine Funktion, die als einziges Argument ein Paar von ints erwartet; sie hat also den Typ int * int -> int. AUFGABE 1.6 stdIn:33.1-33.8 Error: operator and operand don't agree [literal] Filedescriptor bzw. Eingabedatei, Ort des Fehlers (Zeile.Spalte), Art des Fehlers. operator domain: string * string list erwartete Typen der Argumente: Die Eingabe ["a",1] ist äquivalent zu "a" :: 1 :: nil; da das erste Argument "a" des ersten :: ein String ist, wird als zweites Argument eine Liste von Strings erwartet. operand: string * int list gefundene Typen der Argumente: "a" : string, (1 :: nil) : int list. in expression: "a" :: 1 :: nil