ВУЗ:
Составители:
Рубрика:
60
intersect(list,list)
clauses
member (Head, [Head |_ ]).
member (Head, [_ | Tail ]):- member (Head, Tail).
intersect (L1, L2):- member(X, L1), member(X, L2).
goal
intersect ([1, 4, 3, 2], [2, 5,6]).
Первая подцель member в предикате intersect генерирует элементы из
первого списка, а с помощью второй подцели member проверяется, входят ли
эти элементы во второй список. Описывая данную программу как
недетерминированную, можно говорить, что первая цель делает
предположение о том, что X содержится в списке L1,
а вторая цель проверяет,
является ли X элементом списка L2.
Следующее определение предиката member с использованием
предиката append:
member(X, L):- append(L1, [X|L2], L) само по существу является
программой, в которой реализован принцип «образовать и проверить».
Однако, в данном случае, два шага метода сливаются в один в процессе
унификации. С помощью предиката append производится расщепление
списка
и тут же выполняется проверка, является ли X первым элементом
второго списка.
Еще один пример преимущества соединения генерации и проверки
дает программа для решения задачи об N ферзях: требуется разместить N
ферзей на квадратной доске размером NxN так, чтобы на каждой
горизонтальной, вертикальной или диагональной линии было не больше
одной фигуры.
В первоначальной формулировке речь шла о размещении 8
ферзей на шахматной доске таким образом, чтобы они не угрожали друг
другу. Отсюда пошло название задачи о ферзях.
Эта задача хорошо изучена в математике. Для N=2 и N=3 решения не
существует; два симметричных решения при N=4 показаны на рисунке. Для
N=8 существует 88
(а с учетом симметричных – 92) решений этой задачи.
Q
Q
Q
Q
Страницы
- « первая
- ‹ предыдущая
- …
- 58
- 59
- 60
- 61
- 62
- …
- следующая ›
- последняя »