Je veux supprimer toutes les apparences d'un élément dans une liste, similaire à this, mais dans mon cas, la liste peut avoir des variables non-instanciées. Par exemple:Prolog: supprime un membre de la liste avec des valeurs non-instanciées
delMember(z, [A,B,A,z], L).
L = [A, B, A];
false.
et
delMember(A, [A, B, A, z], L).
L = [B,z];
false.
J'ai essayé de définir delMember comme suit:
delMember(_, [], []).
delMember(X, [X|Xs], Y) :- delMember(X, Xs, Y).
delMember(X, [T|Xs], [T|Y]) :- X \== T, delMember(X, Xs, Y).
Avec cette définition, le dernier résultat que je reçois est correct mais il essaie encore pour instancier les variables avant cela.
?- delMember(A, [A,B,A,z], R).
A = B, B = z,
R = [] ;
A = B,
R = [z] ;
A = z,
R = [B] ;
R = [B, z] ;
des idées ???
L'unification se produit dans votre deuxième alinéa: 'delMember (X, [X | X], Y): - delMember (X, Xs, Y). », qui va unifier le premier argument avec la tête de la liste dans le second argument s'ils sont unifiables. Puisque vous essayez d'éviter cela, vous devez utiliser '==' là aussi: 'delMember (X, [Y | Xs], R): - X == Y, delMember (X, Xs, R). – lurker
Merci @lurker! C'était exactement ce dont j'avais besoin. Si vous voulez mettre une réponse à cela, je serai heureux de l'accepter. – lithiium