Списки в списках в прологе - PullRequest
2 голосов
/ 09 марта 2011

У меня есть следующий список в прологе:

[[1,2],[2,3]]

Теперь я могу сделать простой обход в списке следующим образом:

traverse([]).

traverse([H|T]):-
   write(H),
   traverse(T).

Но я не хочуэтот;Я хочу иметь доступ к каждому элементу в списке как к самому списку, а не как к простой переменной.Из этого я хочу преобразовать каждую итерацию H в список, чтобы я мог распечатать первое или второе значение в H. Однако я не могу придумать синтаксис в прологе, чтобы сделатьтак.Кто-нибудь может помочь?

Ответы [ 2 ]

2 голосов
/ 09 марта 2011

Вам необходимо объединить (не приводить) переменную H с помощью конструктора списка.

traverse([H|T]) :-
  (
     H = [],
     % The list within the list is the empty list.
  ;
     H = [HH | HT]
     % HH is the head of the list within the list.
     % HT is the tail of the list within the list (note, not the second item in the list).
  ),
  traverse(T).

Это дизъюнкция (два операнда оператора;;) такая же, как и в главахдва пункта траверсы.Поэтому отдельный предикат также можно использовать для обхода списка внутри списка.

0 голосов
/ 09 марта 2011

Мне не совсем понятно, что вы ищете, но поможет ли одно из следующего?

% process head and tail recursively, feeding all leaves to write()
write_leaves([]).
write_leaves([H|T]) :- write_leaves(H), write_leaves(T).
write_leaves(X) :- write(X).

или, может быть,

% process_list iterates over just one level of list;
% process_item decides what to do with each element.
process_item([1|T]) :- write(T).
process_item([H|_]) :- write(H).
process_list([]).
process_list([H|T]) :- process_item(H), process_list(T).

Если ни один из них не близок к тому, что вы хотите, возможно, стоит сделать ваш вопрос немного более явным.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...