Prolog:将 2 个列表压缩为一个

Prolog: zip 2 lists into one

假设,我们有 2 个列表 [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 中有这方面的系统函数吗?

您可能想使用 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].