Sri*_*aic 4 prolog meta-predicate
所述MAPLIST / 3谓词具有以下形式
maplist(:Goal, ?List1, ?List2)
Run Code Online (Sandbox Code Playgroud)
然而,非常相似的函数findall/3具有以下形式
findall(+Template, :Goal, -Bag)
Run Code Online (Sandbox Code Playgroud)
它不仅有一个目标,还有一个模板。我发现这个模板在很多地方都非常有用,并开始想知道为什么 maplist/3 没有一个。
为什么 maplist/3 没有模板参数而 findall/3 有?这些谓词之间的显着区别是什么?
模板中findall/3,setof/3以及bagof/3在模拟与Prolog的的变量适当的量化的尝试。大多数时候(在所有三种情况下),它们都涉及在模板中显式复制这些术语。
因为maplist/3这种机制并不总是必要的,因为这里的实际量化仅与列表的元素有关。通常,不会发生进一步的修改。的第一个参数不是使用模板,而是maplist/3一个不完整的目标,缺少两个进一步的参数。
maplist(Goal_2, Xs, Ys).
Run Code Online (Sandbox Code Playgroud)
如果您坚持,您可以使用library(lambda)以下方法获取您的模板版本:
templmaplist(Template1, Template2, Goal_0, Xs, Ys) :-
maplist(\Template1^Template2^Goal_0, Xs, Ys).
Run Code Online (Sandbox Code Playgroud)
(请注意,我避免调用 this maplist/5,因为 this 已经用另一种含义定义了)
一般来说,我宁愿避免制作“我自己的模板”,因为这很容易导致误解(已经在我和我之间):这些论点不是人们通常期望的纯粹关系论点。通过(\)/1改为使用,局部变量会得到更好的处理,并且因为特殊而更加明显。
... 啊,还有另一个很好的理由来避免使用模板:它们实际上迫使您始终将一些不太纯粹的机制考虑为复制。这意味着您的程序可能会暴露一些单调性异常。你真的必须研究非常细节。
另一方面,没有模板,只要不涉及复制,即使您的高阶谓词也会像魅力一样保持单调性。