努力像功能映射函数一样使用 Prolog 的 maplist/2
Struggling to use Prolog's maplist/2 like a functional mapping function
我正在使用 SWI-prolog,我正在尝试创建一个辅助函数,它将映射到一个列表并将每个元素与给定的整数相乘。我的意图是创建一个对应于 Haskell 函数 multByN x n = x * n
的谓词,并在这个意义上使用它:
map (multByN 3) [1,2,3]
这会将所有元素乘以 3 并得到 [3,6,9]
我在 Prolog 中搜索了相应的谓词并找到了 maplist/2
但是我只能用它来检查布尔条件是否适用于列表中的每个元素,而不是实际返回一个新的、处理过的列表。我了解这是如何工作的:
isEven(X) :- 0 is X mod 2
maplist(isEven, [2,4,6])
给出 true
.
但是,我不明白如何做 maplist(multByN(3), [1,2,3])
之类的事情来实际将某些变量与 [3,6,9]
统一起来。因为我无法弄清楚这一点,所以我尝试实现自己的映射函数,将我的谓词 multByN
映射到一个列表,我得到了一些看起来正确的东西,但事实并非如此。我有这个:
multByN(X, N, Y) :- Y is N*X.
mapFunc(_, [], L) :-
write(L), nl.
mapFunc(N, [H|T], L) :-
multByN(H, N, Z),
mapFunc(N, T, [Z|L]).
使用这个谓词我得到:
?- mapFunc(3, [1,2,3], X).
[9,6,3|_1746]
true ;
这里我实际上是在打印最终列表以查看它的样子,但是我们可以看到查询实际上并没有说 X = [9,6,3|_1746]
所以我实际上没有统一任何东西,就我知道,我只是刚刚打印了它——那不是我想要的。
这里的另一个问题是我想摆脱的未实例化变量 _1746
,特别是因为当我尝试反转列表时,我得到无穷无尽的答案和未实例化的变量。
理想情况下,我想找出如何使用 maplist/2
和我自己的谓词来解决问题,但是我认为其他人会对学习如何使用 maplist/2
更感兴趣,并且对我来说绰绰有余。
为了使 maplist(multByN(3), [1,2,3])
工作,您需要一个额外的变量。因此 maplist(multByN(3), [1,2,3], Ys)
.
maplist(P_2, Xs, Ys)
向 P_2
添加两个进一步的参数,一个 X
和一个 Y
。所以 multByN(3)
需要两个额外的参数,比如
multByN(N, X, Y) :-
Y is N*X.
?- maplist(multByN(3), [1,2,3], Ys).
Ys = [3,6,9].
有一些 more maplists 大致对应于它们的功能表亲。
我正在使用 SWI-prolog,我正在尝试创建一个辅助函数,它将映射到一个列表并将每个元素与给定的整数相乘。我的意图是创建一个对应于 Haskell 函数 multByN x n = x * n
的谓词,并在这个意义上使用它:
map (multByN 3) [1,2,3]
这会将所有元素乘以 3 并得到 [3,6,9]
我在 Prolog 中搜索了相应的谓词并找到了 maplist/2
但是我只能用它来检查布尔条件是否适用于列表中的每个元素,而不是实际返回一个新的、处理过的列表。我了解这是如何工作的:
isEven(X) :- 0 is X mod 2
maplist(isEven, [2,4,6])
给出 true
.
但是,我不明白如何做 maplist(multByN(3), [1,2,3])
之类的事情来实际将某些变量与 [3,6,9]
统一起来。因为我无法弄清楚这一点,所以我尝试实现自己的映射函数,将我的谓词 multByN
映射到一个列表,我得到了一些看起来正确的东西,但事实并非如此。我有这个:
multByN(X, N, Y) :- Y is N*X.
mapFunc(_, [], L) :-
write(L), nl.
mapFunc(N, [H|T], L) :-
multByN(H, N, Z),
mapFunc(N, T, [Z|L]).
使用这个谓词我得到:
?- mapFunc(3, [1,2,3], X).
[9,6,3|_1746]
true ;
这里我实际上是在打印最终列表以查看它的样子,但是我们可以看到查询实际上并没有说 X = [9,6,3|_1746]
所以我实际上没有统一任何东西,就我知道,我只是刚刚打印了它——那不是我想要的。
这里的另一个问题是我想摆脱的未实例化变量 _1746
,特别是因为当我尝试反转列表时,我得到无穷无尽的答案和未实例化的变量。
理想情况下,我想找出如何使用 maplist/2
和我自己的谓词来解决问题,但是我认为其他人会对学习如何使用 maplist/2
更感兴趣,并且对我来说绰绰有余。
为了使 maplist(multByN(3), [1,2,3])
工作,您需要一个额外的变量。因此 maplist(multByN(3), [1,2,3], Ys)
.
maplist(P_2, Xs, Ys)
向 P_2
添加两个进一步的参数,一个 X
和一个 Y
。所以 multByN(3)
需要两个额外的参数,比如
multByN(N, X, Y) :-
Y is N*X.
?- maplist(multByN(3), [1,2,3], Ys).
Ys = [3,6,9].
有一些 more maplists 大致对应于它们的功能表亲。