Пролог - Форматирование кроссворда - PullRequest
0 голосов
/ 12 сентября 2011

Я написал предикат solve_crossword, который выглядит следующим образом:

solve_crossword(X,C):-
C= [A1,A2,A3,A4,A5,
    B1,' ',B3, ' ', B5,
    C1, C2,C3,C4,C5,
    D1,' ',D3,' ', D5,
    E1,E2,E3,E4,E5],
member([A1, A2, A3, A4, A5], X),
member([C1, C2, C3, C4, C5], X),
member([E1, E2, E3, E4, E5], X),
member([A1, B1, C1, D1, E1], X),
member([A3, B3, C3, D3, E3], X),
member([A5, B5, C5, D5, E5], X).

Теперь я хочу написать предикат write_crossword, который форматирует кроссворд. Если у меня есть список слов, я хочу, чтобы он выглядел так:

| ?- words(X), solve_crossword(X, C), write_crossword(C).

DITCH
O U O
DITTO
G O E
EARLY

C = [[68,73,84,67,72],[79,32,85,32,79],...
X = [[68,73,83,84,82],[68,73,84,67,72],...

С

words([
       "DISTR",
       "DITCH",
       "DITTO",
       "DITTY",
       "DODGE",
       "EARED",
       "EARLY",
       "EARTH",
       "EASEL",
       "HONOR",
       "HOOEY",
       "HORDE",
       "TUQUE",
       "TURPS",
       "TUTOR",
       "TWAIN"
       ]). 

Строки 1, 3, 5 и столбцы 1, 3, 5 должны быть словами.

1 Ответ

1 голос
/ 15 сентября 2011

Вы можете попробовать что-то вроде этого (заметьте, я исправил ваш код для solve_crossword):

solve_crossword(X,C):-
  C= [[A1,A2,A3,A4,A5],
      [B1,Space,B3, Space,B5],
      [C1,C2,C3,C4,C5],
      [D1,Space,D3,Space,D5],
      [E1,E2,E3,E4,E5]],
  atom_codes(' ', [Space]),
  member([A1, A2, A3, A4, A5], X),
  member([C1, C2, C3, C4, C5], X),
  member([E1, E2, E3, E4, E5], X),
  member([A1, B1, C1, D1, E1], X),
  member([A3, B3, C3, D3, E3], X),
  member([A5, B5, C5, D5, E5], X).

write_crossword([]).
write_crossword([Line|Lines]):-
  atom_codes(SLine, Line),
  write(SLine),
  nl,
  write_crossword(Lines).

atom_codes / 2 преобразует атом в список кодов символов.

...