Ich habe gerade erst wurde in Prolog und ich hatte gehofft, dass die folgende Aufgabe auszuführen:Gibt es ein Äquivalent von Haskells enumFromTo in Prolog?
ein Prädikat
A(P,N,L)
so Sie sich, dass für alleC
, die vonL
n-te Element ist,P(N,C)
.
Grundsätzlich möchte ich eine Karte auf den Bereich [0..N]
durchführen. In Haskell, die Sprache, die ich am meisten vertraut bin mit, würde dies aussehen
f p n = map(p)[0..n]
(Haskell nicht ganz haben Prädikate so einige Freiheiten hier nehme ich)
oder in pointfree
Und es scheint, ich sollte es in Prolog leicht genug tun können. Prologs maplist/3
ist im Grunde schon so, dass es eine triviale Modifikation sein sollte. Meine Definition sollte etwa so aussehen:
A(P,N,L) :- maplist(P, ??? , L).
Allerdings kann ich nicht wirklich herausfinden, was in den Rohling zu setzen. In Haskell würde ich eine Funktion wie enumFromTo
verwenden, aber es scheint, dass so etwas in Prolog nicht existiert. Das schließt äquivalent wäre between/3
, aber das ist keine Liste, so dass ich nicht für maplist
verwenden kann.
Alternativ könnte ich mein eigenes Bereichsprädikat machen.
Das erste, was ich versuchte, war:
range(0,[0]).
range(N,[N|T]) :- range(N-1,T).
A(P,N,L) :- range(N,rangeN), maplist(P, rangeN, L).
Aber ich kann nicht, dass überhaupt zu lösen bekommen. Ich versuchte auch
range(N,L):-findall(X,between(0,N,X),L),sort(L,L).
A(P,N,L) :- range(N,rangeN), maplist(P, rangeN, L).
Aber das scheint nur wirklich klobig für so ein kleines Problem.
Wie könnte ich die Lücke in meinem maplist
ausfüllen? Komme ich das Problem falsch an?
Falscher Ansatz denke ich. Haskell ist faul, also ist die Zuordnung über eine Liste in Ordnung, da die ganze Liste niemals auf einmal existiert. In Prolog sollten Sie ein rekursives Prädikat machen, das nur eine Ganzzahl aktualisiert. –