TL; DR:リストEs0
に位置I1
でアイテムE
を挿入するには、我々は再帰的なコードを書く必要はありません。
代わりに、Prolog prologueの一部である多彩な補助述語に作業(およびそれを正しく得ることについての心配)を委任できます。 ins_/4
を定義するために、我々は書く:maplist(any_thing, Es, [_|Es0])
はsame_length(Es, [_|Es0])
と同等であることを
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)
注意を。
サンプルは、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]
; ...
すべてのソリューションのフェア列挙、OK!
EDIT: SWI-Prologの7.3.11およびSICStusプロローグ4.3.2(両方ともライブラリ述語nth1/4
を備えています)に by @m09 in his answerを定義したように私はins3/4
で最も一般的なクエリを繰り返しました。 nth1/4
の基本的な実装が異なる手続きセマンティクス(公正な列挙型)を示すのに驚いた。自分で見て!
% 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は私が探していたものです。:) thx a lot – Johnzzz