首先,差异列表只不过是一个开放式(通常)列表及其结尾列表单元/指针/logvar的配对。对于[1,2,3|X]
,X
是它的结束列表单元,仍然未分配/未实例化。配对的要点是能够通过实例化第二部分(变量)轻松扩展第一部分(列表)。
X=[4]
配对后[1,2,3,4]-[4]
仍然是差异列表,但无法再扩展。如果我们使用,和X=[4|Y]
的配对将成为我们新的差异列表。[1,2,3,4|Y]
Y
我们不必将两者包装在一个复合术语中,我们可以将两者放在谓词的两个不同参数中。
因此,对于您的zipWith
谓词,只有结束条件会改变:
zipW(_,L1,Z1,_ ,_ ,L3,Z3) :- L1=@=Z1, L3=Z3, !. % 1st exhausted
zipW(_,_ ,_ ,L2,Z2,L3,Z3) :- L2=@=Z2, L3=Z3, !. % 2nd exhausted
对于var,var
pair 和一对两个相等的接地列表,测试都成功,这两种情况都表示一个空的差异列表。
工作条款很容易修改:
zipW(F, [H1|T1],Z1, [H2|T2],Z2, [H3|R], Z3) :-
X =.. [F, H1, H2, H3],
call(X),
zipW(F, T1,Z1, T2,Z2, R,Z3).
用 SWI Prolog 测试:
3 ?- A=[1,2,3|X],B=[10,11,12,13|Y],zipW(plus, A,X, B,Y, C,Z).
A = [1, 2, 3|X]
B = [10, 11, 12, 13|Y]
C = [11, 13, 15|Z] ;
No
4 ?-