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