将 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
个调用中重置。
有一个用数字填充的列表 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
个调用中重置。