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].
假设,我们有 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].