使用序言中其他列表的增量创建第二个列表
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).
我正在尝试从 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).