TL; DR:要在I1
位置插入项目E
到列表Es0
,我们不需要编写递归代码。相反,我们可以将工作(以及对获取它的担忧也归功于!)转换为多功能辅助谓词,所有这些都是Prolog prologue的一部分。要定义ins_/4
我们写:
ins_(E, Es0, I1, Es) :-
maplist (any_thing, Es, [_|Es0]),
append (Prefix, Suffix, Es0),
length ([_|Prefix], I1),
append (Prefix, [E|Suffix], Es).
any_thing(_, _). % auxiliary predicate (used above)
注意maplist(any_thing, Es, [_|Es0])
相当于same_length(Es, [_|Es0])
。
样品使用GNU Prolog的版本1.4.4(64位)查询1,2,3:
?- ins_(X, [a,b,c,d,e], N1, Xs).
N1 = 1, Xs = [X,a,b,c,d,e]
; N1 = 2, Xs = [a,X,b,c,d,e]
; N1 = 3, Xs = [a,b,X,c,d,e]
; N1 = 4, Xs = [a,b,c,X,d,e]
; N1 = 5, Xs = [a,b,c,d,X,e]
; N1 = 6, Xs = [a,b,c,d,e,X]
; false.
?- ins_(X, [a,b,c,d,e], 3, Xs).
Xs = [a,b,X,c,d,e]
; false.
?- ins_(X, Xs0, 3, [a,b,c,d,e]).
X = c, Xs0 = [a,b,d,e]
; false.
让我们不要忘记最普通的查询!
?- ins(X, Es0, I1, Es).
Es0 = [], I1 = 1, Es = [X]
;
Es0 = [A], I1 = 1, Es = [X,A]
; Es0 = [A], I1 = 2, Es = [A,X]
;
Es0 = [A,B], I1 = 1, Es = [X,A,B]
; Es0 = [A,B], I1 = 2, Es = [A,X,B]
; Es0 = [A,B], I1 = 3, Es = [A,B,X]
;
Es0 = [A,B,C], I1 = 1, Es = [X,A,B,C]
; Es0 = [A,B,C], I1 = 2, Es = [A,X,B,C]
; Es0 = [A,B,C], I1 = 3, Es = [A,B,X,C]
; Es0 = [A,B,C], I1 = 4, Es = [A,B,C,X]
;
Es0 = [A,B,C,D], I1 = 1, Es = [X,A,B,C,D]
; ...
所有解决方案的公平列举,好的!
编辑: 我重复最常用的查询与ins3/4
作为SWI-Prolog的7.3.11和SICStus Prolog的4.3.2(都采用库谓词nth1/4
)定义 by @m09 in his answer。 我很惊讶地看到的nth1/4
的底层实现表现出不同的程序语义(w.r.t.“公平枚举”)。你自己看!
% SICStus Prolog 4.3.2 % SWI Prolog 7.3.11
% %
?- ins3(X, Es0, I1, Es). % ?- ins3(X, Es0, I1, Es).
I1 = 1, Es0 = [], Es = [X] % I1 = 1, Es = [X|Es0]
; % ; I1 = 2, Es0 = [_A|_Z],
I1 = 1, Es0 = [_A], Es = [X,_A] % Es = [_A,X|_Z]
; I1 = 2, Es0 = [_A], Es = [_A,X] % ; I1 = 3, Es0 = [_A,_B|_Z],
; % Es = [_A,_B,X|_Z]
I1 = 1, Es0 = [_A,_B], Es = [X,_A,_B] % ; I1 = 4, Es0 = [_A,_B,_C|_Z],
; I1 = 2, Es0 = [_A,_B], Es = [_A,X,_B] % Es = [_A,_B,_C,X|_Z],
; I1 = 3, Es0 = [_A,_B], Es = [_A,_B,X] % ; I1 = 5, Es0 = [_A,_B,_C,_D|_Z],
; % Es = [_A,_B,_C,_D,X|_Z]
... % ...
脚注1:所示上述普遍终止所有样品的查询。
脚注2:由GNU Prolog顶层给出的答案已经相当印刷了一点。
脚注3:以上代码用于原样,不需要额外的库谓词。
pos> 1,newPos是P-1,wuaa这就是我一直在寻找的东西:) thx很多 – Johnzzz 2012-04-08 15:29:04