2011-11-29 8 views
5

私はリストを検索と置換によって変更しようとしていますが、検索用語をリストとして検索するにはどうすればいいですか?Prologのリストの検索と置換をどのようにして行うのですか?

[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

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). 
+0

うーん..私は、述語が1つだけを検索して置き換えることに気付きました。どのようにグローバルにすべての用語に適用しますか? – chutsu

+1

@chutsu私は編集しました。 – m09

+0

ありがとうございました:) – chutsu

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). 

そして、はい、これはビットを最適化することができます - でも、その停止性 は利益です。しかし、概念的な明瞭さは編集

...かなり貴重な値である:あなたのクエリの例:

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

をして、または使用せずに次のようにあなたがAPPEND/2を使用することができます

?- replacement([2,3], [5,6], [1,2,3,4], Xs). 
Xs = [1, 5, 6, 4] ; 
false. 
+2

を、DCGは、私にはかなり新しいですが、それはエレガントなソリューションのように思えます。 – chutsu