Фактическая причина не прекращения, которое вы наблюдали, заключается в следующем: следующий пункт не ограничивает L2
каким-либо образом, формой или формой.
<b>equal([H1|T], L2) :-
member(H1, L2)</b>,
del(H1, L2, L3),
equal(T, L3).
Таким образом, ваш запрос ?- equal([1,2,3], X).
подразумевает доказательство цели member(_, L2)
, которая не заканчивается универсально. Следовательно, equal([1,2,3], X)
также не может завершаться универсально!
Для получения дополнительной информации о том, как объяснить отсутствие завершения кода Пролога, прочитайте о fail-slice !
PS. Глядя на проблему завершения с другой точки зрения, мы видим, что отсутствие завершения является, на самом деле, необходимым следствием в этом случае.
Почему? Потому что вы не ограничиваете количество кратностей, что делает размер решения бесконечным. Набор не может быть представлен конечным числом ответов (при условии, что вы не разрешаете откладывать цели).