List prolog中列表中的列表
我在序言中有以下列表:List prolog中列表中的列表,list,prolog,List,Prolog,我在序言中有以下列表: [[1,2],[2,3]] 现在,我可以在列表中进行如下简单遍历: traverse([]). traverse([H|T]):- write(H), traverse(T). 但是,我不想要这个;我希望能够将列表中的每个元素作为列表本身访问,而不是作为简单变量访问。因此,我想做的是将H的每个迭代转换成一个列表,这样我就可以打印出H中的第一个或第二个值。但是,我无法用prolog中的语法来实现这一点。有人能帮忙吗?您需要将H变量与列表构造函数统一(而不是
[[1,2],[2,3]]
现在,我可以在列表中进行如下简单遍历:
traverse([]).
traverse([H|T]):-
write(H),
traverse(T).
但是,我不想要这个;我希望能够将列表中的每个元素作为列表本身访问,而不是作为简单变量访问。因此,我想做的是将H的每个迭代转换成一个列表,这样我就可以打印出H中的第一个或第二个值。但是,我无法用prolog中的语法来实现这一点。有人能帮忙吗?您需要将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).
这种析取(对;运算符的两个操作数)与遍历的两个子句头中发生的情况相同。
因此,也可以使用一个单独的谓词遍历列表中的列表。我并不完全清楚您的目的,但以下两种方法是否有帮助
% 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).
如果这两个问题都与您想要的不太接近,那么您的问题应该更明确一些。如果“列表”(实际上是树)包含变量,那么第一个问题将进入无限回归/堆栈溢出。是的:以同样的方式,出于同样的原因,如果您要求遍历(X),就像华夫饼干一样。