4

有一个List充满数字的列表,我想获得一个列表 pairs 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(我想将解决方案保留在一行)?谢谢!

4

1 回答 1

3

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

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

编辑

尝试一个简单的答案

有没有办法完全避免 lambda

在我以前的幼稚解释器中,我没有 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 中列表处理的“瑞士刀”。由于它捕获所有Goal关于回溯和副本 Template的解决方案,因此它执行“穷人”垃圾收集,因为证明/变量/跟踪堆栈在Goal调用之间被重置。

于 2021-06-12T07:31:52.543 回答