Логическое программирование на языке Visual Prolog. Солдатова О.П - 61 стр.

UptoLike

61
Q
Q
Q
Q
Приведенная в примере 73 программа представляет решение задачи об
N ферзях. Решение задачи представляется в виде некоторой перестановки
списка от 1 до N. Порядковый номер элемента этого списка определяет номер
вертикали, а сам элементномер горизонтали, на пересечении которых
стоит ферзь. Так решение [2, 4, 1, 3] задачи о четырех ферзях соответствует
первому решению, представленному
на рисунке, а решение [3, 1, 4, 2]-
второму решению. Подобное описание решений и программа их генерации
неявно предполагают, что в любом решении задачи о ферзях на каждой
горизонтали и на каждой вертикали будет находиться по одному ферзю.
Пример 73: программа решения задачи об N ферзях.
domains
list=integer*
predicates
range (integer, integer, list)
/* предикат порождает список, содержащий числа в заданном
интервале*/
queens (list, list, list)
/* предикат формирует решение задачи о N ферзях в виде списка
решений, при этом первый списоктекущий вариант списка размещения
ферзей, второй список промежуточное решение, третий список -
результат*/
select (integer, list, list)
/*предикат удаляет из списка одно вхождение элемента*/
attack (integer, list)
/*предикат преобразует attack, чтобы ввести начальное присваивание
разности в номерах горизонталей */
attack (integer, integer, list)
/*предикат проверяет условие атаки ферзя
другими ферзями из
списка, два ферзя находятся на одной и той же диагонали, на расстоянии M
вертикалей друг от друга, если номер горизонтали одного ферзя на M
больше или на M меньше номера горизонтали другого ферзя*/
fqueens (integer, list)
clauses