gpt4 book ai didi

list - Prolog 中是否有相当于 Haskell 的 enumFromTo 的东西?

转载 作者:行者123 更新时间:2023-12-01 12:16:22 24 4
gpt4 key购买 nike

我刚刚开始使用 Prolog,我希望执行以下任务:

Make a predicate A(P,N,L) such that for all C which is nth element of L, P(N,C).

基本上我想在范围 [0..N] 上执行映射。在我最熟悉的 Haskell 语言中,这看起来像

f p n = map(p)[0..n]

(Haskell 没有谓词,所以我在这里采取一些自由)

或者在 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中的空白?我是不是以错误的方式解决了问题?

最佳答案

-- % f p n = map (p) [0..n] = [p 0, p 1, p 2, ..., p n]

被翻译成 Prolog 为

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) ).

假设 p :: Int -> a对于一些 a ,正如 Haskell 代码所暗示的那样。

这还假设您获得了一个具体的(“基础”)可调用双参数谓词 P和一个整数 N .

另一种可能是

g(P,N,L):- findall(X, (between(0, N, I), call(P,I,X)), L).

这会找到所有 X s 使得 ( 0 <= I <= N P(I,X) ) 成立。

在 SWI-Prolog 中测试:

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].

关于list - Prolog 中是否有相当于 Haskell 的 enumFromTo 的东西?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47864088/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com