小编Nez*_*aii的帖子

努力将 Prolog 的 maplist/2 用作函数映射函数

我正在使用 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]).
Run Code Online (Sandbox Code Playgroud)

使用这个谓词我得到:

?- mapFunc(3, [1,2,3], X).
[9,6,3|_1746]
true ;
Run Code Online (Sandbox Code Playgroud)

在这里,我实际上是在打印最终列表以查看它的样子,但是我们可以看到查询实际上并没有说,X = …

mapping prolog meta-predicate

0
推荐指数
1
解决办法
710
查看次数

标签 统计

mapping ×1

meta-predicate ×1

prolog ×1