5

検索と置換によってリストを変更しようとしていますが、検索語をリストとして使用してリストを検索するにはどうすればよいでしょうか。

リストがあるとしましょう[1,2,3,4]2と3を選び出し、5,6に置き換えたいので、理想的には述語を持つことができます。

search_and_replace(Search_Term, Replace_Term, Target_List, Result_List).

eg.

search_and_replace([2,3], [5,6], [1,2,3,4], Result_List), write(Result_List).
4

2 に答える 2

6

リスト内のサブシーケンス部分文字列を別のリストに置き換えたいと仮定しましょう。

これを行う一般的な方法を次に示します。プログラムにさらに条件を挿入することもできます。

replacement(A, B,  Ag, Bg) :-
   phrase((seq(S1),seq(A),seq(S2)), Ag),
   phrase((seq(S1),seq(B),seq(S2)), Bg).

seq([]) --> [].
seq([E|Es]) --> [E], seq(Es).

そして、はい、これは少し最適化できます-その終了プロパティでさえ利益を得るでしょう. しかし、概念の明快さは非常に貴重な価値です...

編集:あなたの例のクエリ:

?- replacement([2,3], [5,6], [1,2,3,4], Xs).
Xs = [1, 5, 6, 4] ;
false.
于 2011-11-29T14:44:45.210 に答える
4

次のようにappend/2を使用できます。

replace(ToReplace, ToInsert, List, Result) :-
    once(append([Left, ToReplace, Right], List)),
    append([Left, ToInsert, Right], Result).

すべての可能性が必要かどうかに応じて、 once/1を使用するか使用しないか。

すべての出現を置き換えるには、次のようなものにします:

replace(ToReplace, ToInsert, List, Result) :-
    replace(ToReplace, ToInsert, List, [], Result).
replace(ToReplace, ToInsert, List, Acc, Result) :-
    append([Left, ToReplace, Right], List),
    append([Acc, Left, ToInsert], NewAcc),
    !,
    replace(ToReplace, ToInsert, Right, NewAcc, Result).
replace(_ToReplace, _ToInsert, [], Acc, Acc).
于 2011-11-29T14:48:25.410 に答える