代码之家  ›  专栏  ›  技术社区  ›  user4035

序言:将2个列表压缩为一个

  •  0
  • user4035  · 技术社区  · 4 年前

    假设我们有两个列表 [1, 2, 3] , [3, 2, 1] 我们想要创建第三个列表,它等于一个二进制函数对每个对应的列表元素对的结果。

    比如:

    f(x, y) = 
        -1, if x < y; 
        0, if x = y; 
        1 if x > y.
    

    作为我们的例子,我们得到 [-1, 0, 1] .

    我创建了代码:

    f(A, B, C) :- ( A < B ->
                    C = -1
                  ; A =:= B ->
                    C = 0
                  ; C = 1
                  ).
    
    zip([A], [B], [C]) :- f(A, B, C).
    zip([A | T1], [B | T2], [C | T]) :- f(A, B, C), zip(T1, T2, T).
    

    它的工作原理是:

    ?- zip([1,2,3], [3,2,1], X).
    X = [-1, 0, 1] .
    

    但我有一种感觉,我正在重新发明轮子。Prolog中是否有用于此的系统函数?

    1 回复  |  直到 4 年前
        1
  •  3
  •   rajashekar    4 年前

    你可能想用 maplist 谓语 https://www.swi-prolog.org/pldoc/doc_for?object=maplist/4

    就这样

    ?- maplist(f,[1,2,3],[3,2,1],C).
    C = [-1, 0, 1].
    
    推荐文章