(* Lecture 1: Introduction *) (* SGDM, Carsten Schuermann *) datatype Pebble = White | Blue (* Flipper *) fun skip nil = nil | skip (White :: rest) = White :: (flip rest) | skip (Blue :: rest) = Blue :: (flip rest) and skip2 nil = nil | skip2 (White :: rest) = White :: (skip rest) | skip2 (Blue :: rest) = Blue :: (skip rest) and flip nil = nil | flip (White :: rest) = Blue :: (skip2 rest) | flip (Blue :: rest) = White :: (skip rest) (* Flipper end *) fun toString nil = "" | toString (White :: rest) = "." ^ (toString rest) | toString (Blue :: rest) = "X" ^ (toString rest) fun iterate f 0 C = nil | iterate f n C = (print ((toString C) ^ "\n"); iterate f (n-1) (f C)) val example1 = [White, White, White, White, White, White, Blue, Blue, Blue, Blue, Blue, Blue] val example2 = [White, White, White] val example3 = [White, White, White, White, Blue, Blue, Blue, Blue] fun minimal f C = let fun minimal' n' C' = if C = C' then n' else minimal' (n' + 1) (f C') in minimal' 1 (f C) end fun whites 0 = nil | whites n = White :: (whites (n - 1)) fun cycle f C = iterate f (minimal f C) C