Существуют ли альтернативные способы отображения списка, кроме использования цикла? - PullRequest
0 голосов
/ 11 апреля 2010

Я знаю, как отобразить список с помощью loop. Например,

choice(a):-write('This is the top 15 countries list:'),nl,
loop(X).

loop(X):-country(X),write(X),nl,fail.

К сожалению, я не знаю, как отобразить список с помощью list. Кто-нибудь может направить меня?

Ответы [ 2 ]

4 голосов
/ 11 апреля 2010

не очень понятно, чего вы пытаетесь достичь.

Из вашего описания я не уверен, насколько хорошо вы справились с декларативным стилем Пролога. Когда вы писали свое правило для 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, это может вводить в заблуждение и соблазн процедурно относиться к Прологу, но это только вызовет у вас проблемы.

Надеюсь, это поможет

0 голосов
/ 13 апреля 2010

write/1 не только пишет строки, он пишет любой термин Пролога. Таким образом, хотя Оли и дал более симпатичный write_list, следующее будет работать:

choice(Countries):-write('This is the top 15 countries list:'),nl,write(Countries).
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...