Пролог: с чего начать разгадывать головоломку, похожую на минера? - PullRequest
2 голосов
/ 03 апреля 2012

Мне нужно написать что-то вроде тральщика в прологе. Я могу сделать это на "нормальном" языке, но когда я пытаюсь начать программировать с пролога, я совершенно не знаю, с чего начать. Мне нужны какие-то советы. Спецификация ввода:

Размер платы: м × n ( м , n ∈ {1, ..., 16}), список троек ( i , j , k ), где i ∈ {1, ..., m }, j ∈ {1, ..., n }, k ∈ {1, ..., 8}), описывающих поля с номерами.

Например:

5
5
[(1,1,1), (2,3,3), (2,5,2), (3,2,2), (3,4,4), (4,1,1), (4,3,1), (5,5,2)].

Вывод: список цифр и атомов * (для сокровищ) и (для пустых полей). Это представление решения головоломки.

Правила этой головоломки: В 20 полях доски спрятаны сокровища. Цифра в поле показывает, сколько соседних полей имеет сокровище. В полях с цифрами нет сокровищ. Отметьте все поля с сокровищами.

Вам нужно угадать, сколько сокровищ спрятано в диагонали.

Буду благодарен за любые советы. Я не хочу полного решения, я хочу написать его самостоятельно, но без подсказок я не могу этого сделать.

1 Ответ

1 голос
/ 03 апреля 2012

Матрица обычно обрабатывается как список списка, который вы можете построить, используя length / 2 и findall / 3.Матрица пустых переменных (где вы будете размещать значения при угадывании ....)

build_matrix(NRows, NCols, Mat) :-
  findall(Row, (between(1, NRows, _), length(Row, NCols)), Mat).

Доступ к элементам через координаты может быть выполнен с помощью nth1 (см. здесь для другого ответа, где выможно найти некоторые подробности: см. cell / 3).

Затем вы накладываете все ограничения на тройки: существует конечное число способов использования счетчиков «скрытых сокровищ», позволяйте Прологу искать все пути, перечисляя смежные области.

Обработать список троек, поместив каждый счетчик в совместимые ячейки, с рекурсивным предикатом.Когда список заканчивается, у вас есть предположение.

Чтобы упростить ваш код, не беспокойтесь об индексах за пределами матрицы, помните, что при поиске сбои "нормальны" ...

...