List Prolog遍历列表

List Prolog遍历列表,list,prolog,iteration,head,List,Prolog,Iteration,Head,假设我有listXs=[a,b,c]。 现在我想遍历所有元素,并为这些元素调用另一个函数。我的问题是:如何使用头部和尾部来实现这一点?我将非常感谢您的帮助。一般来说,您不需要在Prolog中迭代。而是使用一对递归子句编写规则,如下所示: dosomething([]). dosomething([H|T]) :- process(H), dosomething(T). 当列表[]为空时,第一个子句处理基本情况。在本例中,无需执行任何操作,因此规则体也是空的 第二个子句处理列表中至少有一个元

假设我有list
Xs=[a,b,c]。

现在我想遍历所有元素,并为这些元素调用另一个函数。我的问题是:如何使用头部和尾部来实现这一点?我将非常感谢您的帮助。

一般来说,您不需要在Prolog中迭代。而是使用一对递归子句编写规则,如下所示:

 dosomething([]).
 dosomething([H|T]) :- process(H), dosomething(T).
当列表
[]
为空时,第一个子句处理基本情况。在本例中,无需执行任何操作,因此规则体也是空的

第二个子句处理列表中至少有一个元素的情况。语法
[H | T]
与列表相结合,使得
H
成为列表的头部,而
T
成为列表的尾部。例如,如果您处理
dosomething([a,b,c])
H
变成
a
T
变成
[b,c]


本规则正文分为两部分。第一部分在头部进行操作,在头部调用
进程
。这是您希望为列表中的每个元素执行的规则。第二部分递归调用列表尾部的
dosomething
规则。当尾部列表不为空时,
dosomething
的第二个子句将与较短的列表统一以继续处理。当尾部列表为空时,第一个子句将统一,从而结束处理。

首先,map是您的朋友如果您取消
head
tail
的限制,您可以通过使用
fail
和析取来完成列表元素的循环:
member(X,[1,2,3,4]),writeln(X),fail;正确。
将逐个打印列表元素,目标将成功。虽然这个答案是正确的,但非常简单。同时,还有一个错误,你是绝对正确的。然而,OP想知道“如何使用头和尾来做这件事”,所以我解释了20世纪70年代的方法。我认为对这个简单代码片段的深入理解对于理解Prolog的工作方式非常重要。当然,Prolog从业者很快就会发现
maplist/2
,而且他们再也不会回去了。虽然我们应该在这里回答提出的问题,但这些问题通常包含最好忽略的部分。@false你能告诉我的教授吗?