не очень понятно, чего вы пытаетесь достичь.
Из вашего описания я не уверен, насколько хорошо вы справились с декларативным стилем Пролога. Когда вы писали свое правило для loop
, вы предоставляли набор условий, при которых Prolog будет соответствовать правилу. Это отличается от набора процедурных инструкций.
Если вы хотите собрать все страны в список, вы можете использовать правило setof
следующим образом
top_countries(Cs):-
setof(C, country(C), Cs).
Будет возвращен список [] стран, соответствующих правилу.
Если вы хотите вывести каждый элемент этого списка на новую строку, вы можете сделать что-то вроде следующей рекурсивной функции.
write_list([]).
write_list([H|T]):-
write(H),nl,
write_list(T).
Первое правило соответствует базовый случай ; это когда в списке не осталось элементов. На данный момент мы должны соответствовать и остановиться. Второе правило сопоставляет (объединяет) заголовок списка и записывает его на экран с новой строкой после него. Последняя строка снова объединяет tail (остаток) списка с функцией write_list.
Затем вы можете связать их вместе что-то вроде следующего
choice(a):-
write('This is the top 15 countries list:'),nl,
top_countries(X),
write_list(X).
На что обратить внимание
Постарайтесь, чтобы в вашем правиле выбора не было singleton переменных, таких как X. Переменные существуют для объединения (сопоставления) с чем-либо.
Посмотрите на хороший декларативный стиль программирования. Когда вы используете такие функции, как write
, это может вводить в заблуждение и соблазн процедурно относиться к Прологу, но это только вызовет у вас проблемы.
Надеюсь, это поможет