は、私はちょうどPrologで出始めてきたと私は、次のタスクを実行するために期待していた。 PrologにHaskellのenumFromToと同等のものがありますか?
は、述語がA(P,N,L)
ように作ることL
、P(N,C)
のn番目の要素であるすべてのC
ため。
基本的には、[0..N]
の範囲のマップを実行したいと思います。ハスケル、私が最も精通していた言語で 、これは
f p n = map(p)[0..n]
(Haskellはかなりので、私はここにいくつかの自由を取っている述語を持っていません)
またはpointfree
中のようになります。f = (.enumFromTo 0).map
私はPrologで十分に簡単にできるはずです。 Prologのmaplist/3
は基本的にはすでにそれであるので、それは簡単な修正でなければなりません。私の定義は次のようになっているはずです:
A(P,N,L) :- maplist(P, ??? , L).
しかし、私は空白に何を入れるべきかを本当に分かりません。ハスケルでは、私は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).
しかし、それはちょうどそのような小さな問題のために本当にclunkyようです。
maplist
のギャップをどのように埋めることができますか?私は間違った方法で問題に近づいていますか?
間違ったアプローチだと思います。 Haskellは怠惰なので、リスト全体のマッピングは一度に存在しないので、リストのマッピングは問題ありません。 Prologでは、単に整数を更新する再帰的述語を実行する必要があります。 –