У меня возникли проблемы с созданием всех списков, соответствующих определенным критериям.
city(new_york, 47).
city(chicago, 100).
all_unique([]).
all_unique([H|T]) :- H = [] ; (not(member(H, T)), all_unique(T)).
cities([Head|Tail]) :-
length(Tail, L),
L < 2,
city(Head, _A),
(Tail = [] ; cities(Tail)).
Когда я выдаю запрос cities(L)
, я хочу, чтобы он генерировал все списки городов с максимальной длиной 2 и без повторений. Теперь он возвращает все возможные списки, а затем продолжает пробовать списки, которые явно не соответствуют критериям.
?- cities(L).
L = [new_york] ;
L = [chicago] ;
L = [new_york, new_york] ;
L = [new_york, chicago] ;
L = [chicago, new_york] ;
L = [chicago, chicago] ;
ERROR: Out of global stack
?-
Как указать Prolog не использовать слишком длинные списки или повторяющиеся элементы?