Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
List prolog中列表中的列表_List_Prolog - Fatal编程技术网

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),就像华夫饼干一样。