问题描述
有一个用数字填充的列表 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}} 次调用。