2011-11-29 9 views
5

Estoy tratando de modificar una lista mediante búsqueda y reemplazo, me preguntaba ¿cómo busco una lista con el término de búsqueda como una lista también?¿Cómo se hace una búsqueda y reemplazo de una lista con otra sublista en Prolog?

Digamos que tengo una lista [1,2,3,4] Quiero destacar el 2 y 3 y reemplazarlo con 5,6 por lo que idealmente podría tener un predicado:

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

Respuesta

4

Puede utilizar append/2 de la siguiente manera:

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

Con o sin uso de once/1 dependiendo de si desea todas las posibilidades o no.

Para reemplazar todas las ocurrencias me gustaría ir con algo como:

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 ... Noté que el predicado solo busca y reemplaza uno, ¿cómo se aplica a todos los términos globalmente? – chutsu

+1

@chutsu He editado. – m09

+0

Muchas gracias :) – chutsu

6

Déjeme asumir que quiere reemplazar una subsecuencia subsecuencia dentro de una lista por otra lista.

Aquí hay una manera general de cómo hacer esto. Es posible que desee insertar otras condiciones en el programa.

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

Y, sí, esto se puede optimizar un poco - incluso su propiedad terminación se beneficiarían. Pero la claridad conceptual es un valor muy preciado ...

Editar: Su consulta de ejemplo:

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

muy agradable, DCG es bastante nuevo para mí, pero parece que una solución elegante. – chutsu

Cuestiones relacionadas