Задача о 8 ферзях

Головоломка восьми ферзей

Головоломка восьми ферзей - это проблема размещения восьми шахматных ферзей на шахматной доске 8×8 так, чтобы никакие два ферзя не угрожали друг другу.

Проблема поиска всех решений задачи о восьми ферзях может быть достаточно вычислительно затратной, поскольку существует 4 426 165 368 возможных расположений восьми ферзей на доске 8×8, но только 92 решения.

Семантический способ решения этой проблемы заключается в следующем:

  • Представьте, что у нас есть робот, который может произвольно расставить восемь ферзей на шахматной доске. Но он не знает, правильная это позиция или нет.
  • Затем, после каждой расстановки, робот спрашивает нас, правильно ли он расположил ферзей на доске. Если мы отвечаем, что правильно, робот считает задание выполненным. Если же мы говорим, что неправильно, робот пытается расположить ферзей по-другому.
  • Для того чтобы определить, правильно ли расставлены ферзи на шахматной доске, мы напишем семантические правила на языке d0sl. Например: Для любых двух ферзей на шахматной доске должно быть верно, что они не находятся на одной диагонали и не находятся на одной линии.
def check board(board : ChessBoard) means
  check all
    var queens = ChessDSL.get queens(board)
    for all q1, q2 in queens
      not ChessDSL.on one line(q1, q2) and
      not ChessDSL.on one diagonal(q1, q2)
  end
end def

Далее мы покажем, как запустить пример и посмотреть код.