• 如果您觉得本站非常有看点,那么赶紧使用Ctrl+D 收藏吧

在Prolog中是否有相当于Haskell的enumFromTo?

list 来源:Wheat Wizard 5次浏览

我刚刚在序言开始了,我希望能执行以下任务:在Prolog中是否有相当于Haskell的enumFromTo?

做谓语A(P,N,L)使得对所有C这是LP(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中的空白?我以错误的方式接近问题吗?


===========解决方案如下:

<code class="prettyprint-override">-- % f p n = map (p) [0..n] = [p 0, p 1, p 2, ..., p n] 
</code>

被翻译成的Prolog作为

<code class="prettyprint-override">f(P,N,L):- f(P,0,N,L). 
f(P,I,N,[]):- I > N. 
f(P,I,N,L):- call(P,I,X), 
      (N =:= I -> L = [X] 
      ; L = [X|T], J is I+1, f(P,J,N,T)). 
</code>

这假定p :: Int -> a一些a,由Haskell代码所暗示。

这也假定给出了具体的(“地面”)可调用双参数谓词P和整数N

另一种可能性是

<code class="prettyprint-override">g(P,N,L):- findall(X, (between(0, N, I), call(P,I,X)), L). 
</code>

此查找所有X S,从而使0 <= I <= NP(I,X)成立。

测试在SWI-Prolog的:

<code class="prettyprint-override">11 ?- [user]. 
add1(X,Y):- Y is X+1. 
|: 

12 ?- f(add1,5,L). 
L = [1, 2, 3, 4, 5, 6]. 

13 ?- g(add1,5,L). 
L = [1, 2, 3, 4, 5, 6]. 
</code>

版权声明:本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系管理员进行删除。
喜欢 (0)