2016-05-19 22 views
-1

Ich möchte eine Beziehung del_all(X, L, L1) zum Entfernen aller Artikel X (falls vorhanden) aus der Liste L definieren.Wie kann ich jeden Artikel aus der Liste in Prolog löschen

Beispielabfrage:

?- del_all(a, [a,b,a,c,d,a], L1). 
L1 = [b, c, d].       % expected answer 
+0

Sie möchten alle * gleichen * Elemente oder alle * verifizierbaren * Elemente löschen? Oder sind Ihre Listenelemente * immer * geschliffen, wodurch die Unterscheidung stumm wird? –

Antwort

1
dele_all(X, [], []). 
dele_all(X, [H|T], R) :- 
    H = X, 
    dele_all(X, T, R). 
dele_all(X, [H|T], [H|R]) :- 
    dif(H, X), 
    dele_all(X, T, R). 
2

Hier ist eine andere Version, die (=)/2 und dif/2 kombiniert:

list_without([], _, []). 
list_without([X|Xs], H, Ys0) :- 
    if_(X = H, Ys0 = Ys, Ys0 = [H|Ys]), 
    list_without(Xs, H, Ys). 

Es verwendet if_/3

1

Partitioning Listenelemente nach einigen bestimmten Kriterium ist ein allgemeines Idiom in Prol og.

Mit tfilter/3 in Kombination mit dif/3 können wir einfach query:

 
?-  tfilter (dif (a), [a,b,a,c,d,a], L1). 
L1 = [b,c,d].       % expected result 
0
del_all(_,[],[]). 
del_all(Item,[Item|Rest],RRest) :- 
    !, 
    del_all(Item,Rest,RRest). 
del_all(Item,[OtherItem|Rest],[OtherItem|RRest]) :- 
    del_all(Item,Rest,RRest). 

als so einfach.