我剛剛在序言開始了,我希望能執行以下任務:在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中,你應該做一個遞歸謂詞,只更新一個整數。 –