(* Carsten Schuermann *) (* Torres *) datatype Color = Green | Blue | Red | Orange | Black datatype Tower = Empty | Tile of Tower | Knight of Color datatype Board1 = Board1 of Tower * Tower * Tower * Tower * Tower * Tower * Tower * Tower * Tower * Tower * Tower * Tower * Tower * Tower * Tower * Tower * Tower * Tower * Tower * Tower * Tower * Tower * Tower * Tower * Tower * Tower * Tower * Tower * Tower * Tower * Tower * Tower * Tower * Tower * Tower * Tower * Tower * Tower * Tower * Tower * Tower * Tower * Tower * Tower * Tower * Tower * Tower * Tower * Tower * Tower * Tower * Tower * Tower * Tower * Tower * Tower * Tower * Tower * Tower * Tower * Tower * Tower * Tower * Tower datatype Board2 = Row of Tower * Tower * Tower * Tower * Tower * Tower * Tower * Tower | Board2 of Board2 * Board2 datatype Board = Tower of Tower | Board of Board * Board * Board * Board datatype Address = Here | UpperLeft of Address | UpperRight of Address | LowerLeft of Address | LowerRight of Address (* rest A = A' Invariant: If A is not equal to HERE then A' is the rest of the path of A *) fun rest (UpperLeft A) = A | rest (UpperRight A) = A | rest (LowerLeft A) = A | rest (LowerRight A) = A (* emptyBoard n = B' Invariant: If n >= 0 then B' = board of size of (2^n * 2^n) *) fun EmptyBoard 0 = Tower Empty | EmptyBoard n = let val B = EmptyBoard (n-1) in Board (B, B, B, B) end