prolog - 像功能映射函数一样努力使用 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]).
使用这个谓词我得到:
?- 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)
将两个进一步的参数一X
和一添加Y
到P_2
. 所以multByN(3)
需要两个额外的参数,比如
multByN(N, X, Y) :-
Y is N*X.
?- maplist(multByN(3), [1,2,3], Ys).
Ys = [3,6,9].
还有一些地图列表大致对应于它们的功能表亲。
推荐阅读
- c# - 如何使用 Epplus 从工作表模板复制或扩展条件格式
- xcode10 - Xcode 线程 1:Signabrt 使用触发的 segues
- reactjs - 将“this.setState”方法放在一行上是不好的做法吗?
- wordpress - 迁移到新服务器后,Wordpress 插件无法正常工作
- apache-spark - Spark Structured Streaming:为每个微批次消耗来自 Kafka 主题的所有数据
- php - 我怎样才能让我的网站更新或删除用户?
- c# - 如何与 SslStream 和 TcpClient 一起发出 HTTP Get 请求
- javascript - 更新电报机器人中的菜单
- ios - 如何获取在循环中创建并添加到 Swift 中的 stackView 的开关的开关状态
- c# - SyntaxError:在 asp.net 中的 ajax 调用中位置 4 的 JSON 中的意外令牌 <