Головоломка восьми ферзей
Головоломка восьми ферзей - это проблема размещения восьми шахматных ферзей на шахматной доске 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
Далее мы покажем, как запустить пример и посмотреть код.