Prolog-遍历列表
Prolog-iterating through list
假设我有列表Xs = [a,b,c].
现在我想遍历所有元素并为此元素调用另一个函数。我的问题是:如何使用 head 和 tail 来做到这一点?我将不胜感激。
通常,您不会在 Prolog 中进行迭代。相反,您编写一个带有一对递归子句的规则,如下所示:
dosomething([]).
dosomething([H|T]) :- process(H), dosomething(T).
当列表 []
为空时,第一个子句处理基本情况。在这种情况下,没有什么可做的,所以规则的主体也是空的。
第二个子句处理列表至少有一个元素的情况。语法 [H|T]
与您的列表统一,使 H
成为列表的头部,而 T
成为列表的尾部。例如,如果您处理 dosomething([a,b,c])
,H
将变为 a
,而 T
将变为 [b,c]
。
这条规则的正文有两部分。第一部分对头部进行操作,在其上调用 process
。这是您要为列表的每个元素执行的规则。第二部分在列表的尾部递归调用 dosomething
规则。当尾列表不为空时,dosomething
的第二个子句将与较短的列表结合以继续处理。当尾列表为空时,第一个子句将合并,从而结束处理。
假设我有列表Xs = [a,b,c].
现在我想遍历所有元素并为此元素调用另一个函数。我的问题是:如何使用 head 和 tail 来做到这一点?我将不胜感激。
通常,您不会在 Prolog 中进行迭代。相反,您编写一个带有一对递归子句的规则,如下所示:
dosomething([]).
dosomething([H|T]) :- process(H), dosomething(T).
当列表 []
为空时,第一个子句处理基本情况。在这种情况下,没有什么可做的,所以规则的主体也是空的。
第二个子句处理列表至少有一个元素的情况。语法 [H|T]
与您的列表统一,使 H
成为列表的头部,而 T
成为列表的尾部。例如,如果您处理 dosomething([a,b,c])
,H
将变为 a
,而 T
将变为 [b,c]
。
这条规则的正文有两部分。第一部分对头部进行操作,在其上调用 process
。这是您要为列表的每个元素执行的规则。第二部分在列表的尾部递归调用 dosomething
规则。当尾列表不为空时,dosomething
的第二个子句将与较短的列表结合以继续处理。当尾列表为空时,第一个子句将合并,从而结束处理。