2011-11-11 10 views
5

Duplicar posibles:
Prolog delete: doesn't delete all elements that unify with ElementEliminación de todos los miembros de una lista sin unificación en Prolog

En Prolog si se escribe esto:

delete([(1,1),(1,2),(1,1),(3,4)],(1,_),L). 

el resultado será:

L = [ (1, 2), (3, 4)]. 

Lo que es normal porque la variable _ se une con 1 en el primer elemento y busca más elementos de (1,1) y los elimina.

Hay una manera de evitar que ocurra esta unificación y eliminar todos los miembros del formulario (1, _). En ese caso, el resultado debe ser: L = [(3, 4)].

Respuesta

3
delete_pattern([], _, []). 
delete_pattern([H|T], P, O) :- 
    ( H \= P 
    -> O = [H|O1], 
     delete_pattern(T, P, O1) 
    ; delete_pattern(T, P, O)). 

Es posible que quiera utilizar otros predicados para el filtrado que daría lugar a una semántica ligeramente diferente como ==/2 o [email protected]=/2.

+0

Obras en principio, pero si se rompe elementos de la lista no están suficientemente instanciados en el momento '/ 3' está dirigido delete_pattern. – repeat

3

Aquí hay otra versión. En realidad, una pura uno:

list_el_deleted([], _, []). 
list_el_deleted([X|Xs], X, Ys) :- 
    list_el_deleted(Xs, X, Ys). 
list_el_deleted([X|Xs], E, [X|Ys]) :- 
    dif(X,E), 
    list_el_deleted(Xs, E, Ys). 

Tratando en su consulta revela las fuentes reales de ambigüedad en su planteamiento del problema:

?- list_el_deleted([(1,1),(1,2),(1,1),(3,4)],(1,X),L). 
X = 1, 
L = [ (1, 2), (3, 4)] ; 
X = 2, 
L = [ (1, 1), (1, 1), (3, 4)] ; 
L = [ (1, 1), (1, 2), (1, 1), (3, 4)], 
dif(X, 1), 
dif(X, 2), 
dif(X, 1). 

Así que todo depende de lo que X realidad es: 1, 2, o algo mas. Tenga en cuenta que las versiones anteriores discutidos aquí dependen de la creación de instancias real que hace el razonamiento mucho más difícil:

?- delete([a],X, Xs), X = c. 
false. 

?- X = c, delete([a],X, Xs). 
X = c, 
Xs = [a]. 
+1

@repeat: Ponga su solución [aquí] (http://stackoverflow.com/questions/8100586/prolog-delete-doesnt-delete-all-elements-that-unify-with-element#). – false

Cuestiones relacionadas