local (* an exception we hopefully don't need *) exception Error of string; (* isinList == check if char is in char list *) fun isinList (c:char) ([]:char list) = false | isinList (c:char) ((clh::clt):char list) = if clh = c then true else isinList c clt; (* checkList == check if a row or column has only the following character set 1,2,3,4,5,6,7,8,9 *) fun checkList ([]) ([]) = true | checkList (l::ls) ((h::tl):char list) = if l = h then checkList (ls) (tl) else if (isinList l tl) then checkList (l::ls) (tl@[h]) else false | checkList _ _ = false; (* makeColumn == make char list list of the Columns *) fun makeColumn ([[], [], [], [], [], [], [], [], []]:char list list) (accl:char list list) = accl | makeColumn ([(h1::cl1):char list, (h2::cl2):char list, (h3::cl3):char list, (h4::cl4):char list, (h5::cl5):char list, (h6::cl6):char list, (h7::cl7):char list, (h8::cl8):char list, (h9::cl9):char list]:char list list) (accl:char list list) = makeColumn ([cl1:char list, cl2:char list, cl3:char list, cl4, cl5, cl6, cl7, cl8, cl9]) ([h1, h2, h3, h4, h5, h6, h7, h8, h9]::accl) | makeColumn (_) (_) = raise Error "Error in makeColumn"; in (* rscheck : char list list -> bool *) fun rscheck ([]:char list list) = true | rscheck ([cl1, cl2, cl3, cl4, cl5, cl6, cl7, cl8, cl9]:char list list) = if (checkList(cl1) ([#"1",#"2",#"3",#"4",#"5",#"6",#"7",#"8",#"9"])) andalso (checkList(cl2) ([#"1",#"2",#"3",#"4",#"5",#"6",#"7",#"8",#"9"])) andalso (checkList(cl3) ([#"1",#"2",#"3",#"4",#"5",#"6",#"7",#"8",#"9"])) andalso (checkList(cl4) ([#"1",#"2",#"3",#"4",#"5",#"6",#"7",#"8",#"9"])) andalso (checkList(cl5) ([#"1",#"2",#"3",#"4",#"5",#"6",#"7",#"8",#"9"])) andalso (checkList(cl6) ([#"1",#"2",#"3",#"4",#"5",#"6",#"7",#"8",#"9"])) andalso (checkList(cl7) ([#"1",#"2",#"3",#"4",#"5",#"6",#"7",#"8",#"9"])) andalso (checkList(cl8) ([#"1",#"2",#"3",#"4",#"5",#"6",#"7",#"8",#"9"])) andalso (checkList(cl9) ([#"1",#"2",#"3",#"4",#"5",#"6",#"7",#"8",#"9"])) then case (makeColumn([cl1,cl2,cl3,cl4,cl5,cl6,cl7,cl8,cl9]) ([])) of ([clc1, clc2, clc3, clc4, clc5, clc6, clc7, clc8, clc9]):char list list => if (checkList(clc1) ([#"1",#"2",#"3",#"4",#"5",#"6",#"7",#"8",#"9"])) andalso (checkList(clc2) ([#"1",#"2",#"3",#"4",#"5",#"6",#"7",#"8",#"9"])) andalso (checkList(clc3) ([#"1",#"2",#"3",#"4",#"5",#"6",#"7",#"8",#"9"])) andalso (checkList(clc4) ([#"1",#"2",#"3",#"4",#"5",#"6",#"7",#"8",#"9"])) andalso (checkList(clc5) ([#"1",#"2",#"3",#"4",#"5",#"6",#"7",#"8",#"9"])) andalso (checkList(clc6) ([#"1",#"2",#"3",#"4",#"5",#"6",#"7",#"8",#"9"])) andalso (checkList(clc7) ([#"1",#"2",#"3",#"4",#"5",#"6",#"7",#"8",#"9"])) andalso (checkList(clc8) ([#"1",#"2",#"3",#"4",#"5",#"6",#"7",#"8",#"9"])) andalso (checkList(clc9) ([#"1",#"2",#"3",#"4",#"5",#"6",#"7",#"8",#"9"])) then true else false | _ => raise Error "Error in return of makeColumn" else false; end; (* Testcase1 => true *) val test1 =[[#"1",#"2",#"3",#"4",#"5",#"6",#"7",#"8",#"9"], [#"9",#"1",#"2",#"3",#"4",#"5",#"6",#"7",#"8"], [#"8",#"9",#"1",#"2",#"3",#"4",#"5",#"6",#"7"], [#"7",#"8",#"9",#"1",#"2",#"3",#"4",#"5",#"6"], [#"6",#"7",#"8",#"9",#"1",#"2",#"3",#"4",#"5"], [#"5",#"6",#"7",#"8",#"9",#"1",#"2",#"3",#"4"], [#"4",#"5",#"6",#"7",#"8",#"9",#"1",#"2",#"3"], [#"3",#"4",#"5",#"6",#"7",#"8",#"9",#"1",#"2"], [#"2",#"3",#"4",#"5",#"6",#"7",#"8",#"9",#"1"]]; rscheck (test1); (* Testcase2 => false *) val test2 =[[#"1",#"2",#"3",#"4",#"5",#"6",#"7",#"8",#"9"], [#"9",#"1",#"2",#"3",#"4",#"5",#"6",#"7",#"8"], [#"8",#"9",#"1",#"2",#"3",#"4",#"5",#"6",#"7"], [#"7",#"8",#"9",#"1",#"2",#"3",#"4",#"5",#"6"], [#"6",#"7",#"8",#"9",#"1",#"2",#"3",#"4",#"5"], [#"5",#"6",#"7",#"8",#"9",#"1",#"2",#"3",#"4"], [#"4",#"5",#"6",#"7",#"8",#"9",#"1",#"2",#"3"], [#"3",#"4",#"5",#"6",#"7",#"8",#"9",#"1",#"2"], [#"3",#"2",#"4",#"5",#"6",#"7",#"8",#"9",#"1"]]; rscheck (test2);