将 maplist 与没有主体的 lambda 一起使用?

问题描述

一个用数字填充的列表 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(我想将解决方案保留在一行)?谢谢!

解决方法

另一种不那么“侵入性”的可能是

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

编辑

尝试一个简单的答案

有没有办法完全避免 lambda

在我以前的幼稚解释器中,我没有 maplist/N,因为它基于 Clocksin-Mellish 的第一本书,其中没有引入 call/N。

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

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

findall(Template,Goal,ResultList) 有点像 Prolog 中列表处理的“瑞士刀”。由于它在回溯和副本 Goal 上捕获了 Template 的所有解决方案,因此它执行“穷人”垃圾收集,因为证明/变量/跟踪堆栈在 { {1}} 次调用。