Mar*_*ger 6 syntax lambda prolog swi-prolog maplist
有一个充满数字的列表List,我想获得一个对的列表Pairs,其中每对的Pairs形式为<number>-0,即每个数字List后应跟随着-0。
我想出了以下解决方案,使用maplistlambda:
List = [1,2,30], maplist([X,X-0]>>(!), List, Pairs).
Run Code Online (Sandbox Code Playgroud)
结果: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).
Run Code Online (Sandbox Code Playgroud)
编辑
尝试简单回答
有没有办法完全避免 lambda
在我旧的天真的解释器中,我没有maplist/N,因为它是基于Clocksin-Mellish第一本书,其中没有引入call/N。
所以我经常使用这种基于 findall/3 和 member/2 的模式来转换列表。
?- List = [1,2,30], findall(X-0,member(X,List),Pairs).
Run Code Online (Sandbox Code Playgroud)
findall(Template,Goal,ResultList)有点像 Prolog 中列表处理的“瑞士刀”。由于它捕获了Goal回溯和副本 Template的所有解决方案,因此它执行“穷人”垃圾收集,因为证明/变量/跟踪堆栈在Goal调用之间重置。