1

我很难理解 zipwith 在 Prolog 中的这种应用,并想知道是否有人得到它。我已经知道仿函数的作用,但我不知道它在这种情况下如何应用。我隐约认为将argCL 的 arg no 1 和 arg no 2 放在AandB中,但之后就不再使用它们了。这是谓词:

zipWith( _, [], [], [] ).
zipWith( OP, [A | AS], [B | BS], [CL | RS] ) :-
   functor( CL, OP, 2 ),
   arg( 1, CL, A ),
   arg( 2, CL, B ),
   zipWith( OP, AS, BS, RS ).

这是使用此谓词的示例:

| ?- zipWith( F, L1, L2, [b(w, w), b(f, g)] ).
F = b,
L1 = [w,f],
L2 = [w,g] ?yes
4

2 回答 2

1

functor/3 充当守卫,列表中的每个元素都匹配预期的化合物。

这是一种替代编码,使用所谓的univ和 library( yall ):

zipWith( F, L1, L2, L ) :-
    maplist({F}/[A,B,C]>>(C=..[F,A,B]), L1, L2, L).
于 2021-05-03T19:20:42.247 回答
1

这是一个等效的代码:

zipWith(      _,  []      , []      , []       ).
zipWith(     OP,  [A | AS], [B | BS], [T | RS] ) :-
   T  =.. [  OP,   A,        B     ],                %% T = OP( A, B )
   zipWith(  OP,       AS,       BS,       RS  ).

T =.. [ OP, A, B]与后者相同,T = OP( A, B )只是在仿函数位置实际上不允许逻辑变量。因此,以下都成立:

T = p(a,b), T =.. [p, a, b].
p(a,b) =.. [p, a, b].
p(a,b) =.. [P, A, B], P=p, A=a, B=b.
...

zipWith( p, [a,b,c], [x,y,z], [p(a,x), p(b,y), p(c,z)] ).
zipWith( p, [a,b,c], XYZ, [p(a,x), p(b,y), p(c,z)] ), XYZ = [x,y,z].
zipWith( p, ABC, [x,y,z], [p(a,x), p(b,y), p(c,z)] ), ABC = [a,b,c].
zipWith( P, ABC, [x,y,z], [p(a,x), p(b,y), p(c,z)] ), ABC = [a,b,c], P=p.
....

所以前两个列表的元素只是在第三个中进行了整理。

于 2021-05-04T10:55:53.723 回答