【问题标题】:Prolog map procedure that applies predicate to list elements将谓词应用于列表元素的 Prolog 映射过程
【发布时间】:2011-10-04 17:00:42
【问题描述】:

如何编写一个 Prolog 过程 map(List, PredName, Result) 将谓词 PredName(Arg, Res) 应用于 List 的元素,并在列表 Result 中返回结果?

例如:

test(N,R) :- R is N*N.

?- map([3,5,-2], test, L).
L = [9,25,4] ;
no

【问题讨论】:

    标签: prolog map-function meta-predicate


    【解决方案1】:

    这通常称为maplist/3,是Prolog prologue 的一部分。注意不同的参数顺序!

    :- meta_predicate(maplist(2, ?, ?)).
    
    maplist(_C_2, [], []).
    maplist( C_2, [X|Xs], [Y|Ys]) :-
       call(C_2, X, Y),
       maplist( C_2, Xs, Ys).
    

    不同的参数顺序允许您轻松嵌套多个maplist-goals。

    ?- maplist(maplist(test),[[1,2],[3,4]],Rss).
    Rss = [[1,4],[9,16]].
    

    maplist 有不同的属性,对应于the following constructs in functional languages,但要求所有列表的长度相同。请注意,Prolog 在zip/zipWithunzip 之间没有不对称性。目标maplist(C_3, Xs, Ys, Zs) 包含两者,甚至提供更一般的用途。

    • maplist/2 对应于all
    • maplist/3 对应于map
    • maplist/4 对应于zipWith,但也对应于unzip
    • maplist/5 对应于 zipWith3unzip3
    • ...

    【讨论】:

    • +1。在现代 Prologs 中,您会在库中的某处找到 maplist
    • @DavidTonhofer:更多信息请参考meta-predicate
    • 我不相信 maplist/3 的 SWI-Prolog 版本对应于 map 了。它似乎是all,但从两个列表中成对提供输入。是否有与map 功能相同的谓词?
    • 也许我对文档感到困惑。 maplist/3,“作为 maplist/2,对两个列表中的元素对进行操作”对我(一个新手 prolog 程序员)来说意味着 maplist/3maplist/2 具有相同的功能 all 但输入不同第一个论点。这导致我忽略了 maplist/3 并找到/编写了我自己的地图谓词。
    • @bennyty:该文档实际上有点误导。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多