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
?-

Как указать Prolog не использовать слишком длинные списки или повторяющиеся элементы?


person Josh R    schedule 26.05.2016    source источник
comment
Спасибо, но я не могу использовать findall. Есть ли способ сделать это без findall?   -  person Josh R    schedule 26.05.2016


Ответы (1)


Ваше определение all_unique/1 лучше основано на

мета-предикат maplist/2 вы можете определить cities/1 следующим образом:

city_(new_york, 47).
city_(chicago, 100).

city(C) :-
   city_(C, _).

cities(List) :-
   length(Ref, 2),
   append(List, _, Ref),
   all_unique(List),
   maplist(city, List).

Пример запроса:

?- cities(Xs).
Xs = [] ;
Xs = [new_york] ;
Xs = [chicago] ;
Xs = [new_york, chicago] ;
Xs = [chicago, new_york] ;
false.                                    % terminates universally
person repeat    schedule 26.05.2016
comment
Да, извините, у вас все работает. Это просто не работает с моим all_unique. Я не уверен, почему мой не работает. Я не могу использовать maplist или dif - person Josh R; 26.05.2016
comment
@ДжошР. Какой процессор Prolog вы используете? - person repeat; 26.05.2016
comment
я использую swi-пролог - person Josh R; 26.05.2016
comment
@ДжошР. Хорошо, в SWI есть и dif/2, и maplist/2. - person repeat; 26.05.2016
comment
@CapelliC Все это не может использовать XYZ для упражнений по программированию настолько глупо, что я изо всех сил пытаюсь найти слова, чтобы выразить свои чувства по этому поводу. - person ; 27.05.2016