我刚刚在序言开始了,我希望能执行以下任务:在Prolog中是否有相当于Haskell的enumFromTo?
做谓语
A(P,N,L)
使得对所有C
这是L
,P(N,C)
第n个元素。
基本上我想执行范围[0..N]
的地图。 在Haskell,我最熟悉的语言,这看起来像
f p n = map(p)[0..n]
(哈斯克尔不相当有谓语,所以我在这里采取了一些自由)
或pointfree
f = (.enumFromTo 0).map
而且看起来我应该能够在Prolog中轻松完成它。 Prolog的maplist/3
基本上已经是这样了,所以它应该是一个微不足道的修改。我的定义应该看起来像这样:
A(P,N,L) :- maplist(P, ??? , L).
但是我真的不知道要把什么放在空白处。在Haskell中,我将使用像enumFromTo
这样的函数,但似乎Prolog中不存在这样的事情。关闭当量将是between/3
,但这不是一个清单,所以我不能使用maplist
。
或者我可以做我自己的范围谓词。
我想的第一件事是:
range(0,[0]).
range(N,[N|T]) :- range(N-1,T).
A(P,N,L) :- range(N,rangeN), maplist(P, rangeN, L).
但我不能得到这在所有的解决。我也试过
range(N,L):-findall(X,between(0,N,X),L),sort(L,L).
A(P,N,L) :- range(N,rangeN), maplist(P, rangeN, L).
但是,对于这样一个小问题,看起来真的很笨拙。
我该如何填补我的maplist
中的空白?我以错误的方式接近问题吗?
我认为错误的方法。 Haskell是懒惰的,因此整个列表不会一次存在,所以映射到列表上就好了。在Prolog中,你应该做一个递归谓词,只更新一个整数。 –