Судоку по алфавиту в прологе - PullRequest
0 голосов
/ 01 сентября 2018
:- use_module(library(clpfd)).

go(Rows):- 
  foreach(J in 1..9, K in 1..9, Number = Rows[J,K], 
  Code is 0'A + Number - 1, char_code(Letter, Code), Rows[J,K] is Letter,nl)

sudoku(Rows) :-  
  append(Rows, Vs), Vs ins 1..9,
  maplist(all_distinct, Rows),
  transpose(Rows, Columns),     
  maplist(all_distinct, Columns),     
  Rows = [A,B,C,D,E,F,G,H,I],     
  blocks(A, B, C), 
  blocks(D, E, F), 
  blocks(G, H, I), 
  maplist(label, Rows),

blocks([], [], []).       
  blocks([A,B,C|Bs1], [D,E,F|Bs2], [G,H,I|Bs3]) :-     
  all_distinct([A,B,C,D,E,F,G,H,I]),      
  blocks(Bs1, Bs2, Bs3).

Но это решает судоку, содержащую числа от 1 до 9, мне нужно что-то сделать, чтобы преобразовать 1 в 9 в А в I

Я думаю обойти каждый элемент в сетке и, соответственно, проверить значение и заменить его соответствующим алфавитом.

Как я могу пройти и заменить числа или есть какой-то лучший способ решить эту проблему?

Ошибка:

enter image description here

Спасибо! : D

1 Ответ

0 голосов
/ 01 сентября 2018

Для преобразования чисел в интервале 1..9 в буквы в интервале A..I вы можете использовать цель:

Code is 0'A + Number - 1, char_code(Letter, Code)

Например:

?- Number = 4, Code is 0'A + Number - 1, char_code(Letter, Code).
Number = 4,
Code = 68,
Letter = 'D'.

Предполагая, что матрица решений представлена ​​списком списков, преобразование может быть выполнено с использованием чего-то вроде:

convert_matrix([], []).
convert_matrix([Row| Rows], [ConvertedRow| ConvertedRows]) :-
    convert_row(Row, ConvertedRow),
    convert_matrix(Rows, ConvertedRows).

convert_row([], []).
convert_row([Number| Numbers], [Letter| Letters]) :-
    Code is 0'A + Number - 1,
    char_code(Letter, Code),
    convert_row(Numbers, Letters).

Но код преобразования можно упростить с помощью предикатов maplist. Я оставляю это вам как упражнение. Подсказка: определите вспомогательный предикат, который принимает число и возвращает соответствующую букву.

...