2011-11-29 2 views
5

Sto cercando di modificare un elenco per ricerca e sostituzione, mi chiedevo come faccio a cercare in un elenco con il termine di ricerca anche un elenco?Come si fa a cercare e sostituire una lista con un'altra sottolista in Prolog?

Diciamo che ho una lista [1,2,3,4] Voglio individuare il 2 e 3 e sostituirlo con 5,6 così idealmente ho potuto avere un predicato:

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

risposta

4

È possibile utilizzare accodamento/2 come segue:

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

Con o senza l'uso di una volta/1 a seconda se si desidera tutte le possibilità o no.

per sostituire tutte le occorrenze mi piacerebbe andare con qualcosa di simile:

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

Hmm .. Ho notato che il predicato cerca e sostituisce solo uno, come si applica a tutti i termini a livello globale? – chutsu

+1

@chutsu Ho modificato. – m09

+0

Grazie mille :) – chutsu

6

Supponiamo che voglia sostituire una sottostringa sottosuccessione all'interno di un elenco da un altro elenco.

Ecco un modo generale per farlo. Potresti voler inserire altre condizioni nel programma.

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

E, sì, questo può essere ottimizzato un po '- anche la sua proprietà di terminazione sarebbe profitto. Ma chiarezza concettuale è un valore abbastanza prezioso ...

Edit: La vostra query di esempio:

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

Molto bello, DCG è abbastanza nuovo per me, ma sembra una soluzione elegante. – chutsu