У меня возникли проблемы с созданием всех списков, соответствующих определенным критериям.Prolog - Как ограничить длину списка переменных
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
?-
Как сообщить Прологу, чтобы он не пробовал слишком длинные списки или повторял элементы?
'города (L): - findall (Город, город) (Город, _, _), L) '. – lurker
Спасибо, но я не могу использовать findall. Есть ли способ сделать это без findall? –