将 maplist 与没有正文的 lambda 一起使用?

Using maplist with a lambda that does not have a body?

有一个用数字填充的列表 List,我想获得一个对 Pairs 的列表,其中 Pairs 中的每个对都采用 <number>-0 的形式,即,List 的每个数字后应跟有 -0

我想出了以下解决方案,使用 maplist 和 lambda:

List = [1,2,30], maplist([X,X-0]>>(!), List, Pairs).

结果:Pairs = [1-0, 2-0, 30-0].

虽然这有效,但 lambda [X,X-0]>>(!) 对我来说看起来很奇怪。 我知道我也可以写 [X,Y]>>(Y=X-0) 来让正文中有一些“有用”的东西,但我想知道我是否可以写第一个没有“空 lambda 正文”的版本?或者有没有办法在不引入新谓词的情况下完全避免使用 lambda(我想将解决方案保留在一行中)?谢谢!

一个替代方案 less 'intrusive' 可能是

?- List = [1,2,30], maplist([X,X-0]>>true, List, Pairs).

编辑

尝试简单回答

is there a way to avoid the lambda at all

在我老天真的解释器中,我没有 maplist/N,因为它基于 Clocksin-Mellish 第一本书,其中 call/N 没有被引入。

所以我经常使用这种基于 findall/3 和 member/2 的模式来转换列表。

?- List = [1,2,30], findall(X-0,member(X,List),Pairs).

findall(Template,Goal,ResultList)有点像Prolog中列表处理的'swiss knife'。由于它在回溯和 副本 Template 上捕获了 Goal 的所有解决方案,因此它执行了 'poor man' 垃圾收集,因为 proof/variables/trail 堆栈在 Goal 个调用中重置。