使用序言中其他列表的增量创建第二个列表

Creating second list with increment from other list in prolog

我正在尝试从 list1 创建 list2,但每个成员都应该有 Z 增量。
如果 Z=1 则:
[1,2,3] -> [2,3,4]

addZ(Z,[X | Xs],[Y | Ys]):-
Y is X+Z,
addZ(Z,Xs,Ys).

如果我尝试 addZ(1,[1,2,3],X). 我只会得到否定答案。

添加基本情况后,按照@DavidTonhofer 的建议,您可以更改谓词前两个参数的顺序以避免虚假选择点(因为 Prolog 首先应用参数索引以快速缩小适用条款的范围):

addZ([], _, []).

addZ([X|Xs], Z, [Y|Ys]):-
    Y is X + Z,
    addZ(Xs, Z, Ys).

示例:

?- addZ([1,2,3], 1, Z).
Z = [2, 3, 4].

?- 

这是另一个使用 maplist/3 and library yall 的解决方案:

addZ(Z, Xs, Ys):-
  maplist({Z}/[X, Y]>>(Y is X+Z), Xs, Ys).

样本运行

?- addZ(1, [1,2,3], X).
X = [2, 3, 4].

?- addZ(5, [1,2,3], X).
X = [6, 7, 8].

一如既往,当您使用 CLP 时,最有趣的事情就开始了,例如

:- use_module(library(clpz)).

addZ(_, [], []).
addZ(I, [X|Xs], [Y|Ys]) :- 
    Y #= I + X, 
    addZ(I, Xs, Ys).

现在您可以执行以下操作:

?- addZ(1, [1, 2, 3], C).
   C = [2,3,4].

?- addZ(1, [1, 2, X], [X, Y, 9]).
false.

?- addZ(4, [1, 2, X], [A, Y, 9]).
   A = 5, Y = 6, X = 5.

?- addZ(I, [1, 2, X], [5|Ys]).
   I = 4, Ys = [6,_A], clpz:(4+X#=_A).