Prologue: La Suppression Des Doublons
Je suis en train de supprimer les doublons d'une liste en prolog. Ainsi, une liste [a,b,a,c,b,a] retour [a,b,c]. Je ne peux pas utiliser toutes les fonctions intégrées. J'ai cherché ici et j'ai trouvé ce code.
member(X,[X|_]) :- !.
member(X,[_|T]) :- member(X,T).
set([],[]).
set([H|T],[H|Out]) :- not(member(H,T)), set(T,Out).
set([H|T],Out) :- member(H,T), set(T,Out).
Mais ce serait prendre ma liste et retour [c,b,a] et non pas [a,b,c]
J'ai supprimer le code qui va prendre un élément et une liste et retourne une liste avec les occurrences de cet élément dans la liste supprimé. J'ai donc essayé de les intégrer dans mon supprimer les doublons de méthode, mais je ne comprends pas vraiment prologue très bien, donc il n'est pas de travail. Logiquement je veux faire une liste des inconvénients de la tête avec l'appel récursif sur la nouvelle liste moins toutes les occurrences de la tête. C'est ce que le code pourrait ressembler à sml.
fun remv(_,nil) = nil
| remv(a,x::xs) = if x=a then remv(a,xs) else x::remv(a,xs);
fun remvdub (nil) = nil
| remvdub(x::xs) = x::remvdub(remv(x,xs));
C'est donc ce que j'ai essayé en prolog
remv(_,[],[]).
remv(X,[X|T],Ans) :- remv(X,T,Ans).
remv(X,[H|T],[H|K]) :- remv(X,T,K).
remvdub([],[]).
remvdub([H|T],[H|Ans]) :- remvdub(Ans1,Ans), remv(H,T,Ans1).
Ce qui me manque?
OriginalL'auteur user3043403 | 2013-11-28
Vous devez vous connecter pour publier un commentaire.
hmm je pense que j'ai tout compris, de l'ordre de l'intérieur: il est important donc, ma ligne. remvdub([H|T],[H|Ans]) :- remvdub(Ans1,Ans), remv(H,T,Ans1). Devrait être remvdub([H|T],[H|Ans]) :- remv(H,T,Ans1), remvdub(Ans1,Ans).
OriginalL'auteur SQB
L'extrait du Prologue de code que vous avez posté est logiquement correct. Si vous souhaitez garder la première, contrairement à la dernière, copie de chaque élément dupliqué, vous pouvez modifier votre code comme suit:
L'idée est d'ajouter un troisième paramètre, qui représente la liste des éléments que vous avez vu jusqu'à présent, et de vérifier l'adhésion contre elle, plutôt que de vérifier l'adhésion contre le reste de la liste. Notez que
set/2
est ajouté à cacher ce troisième argument de la part des utilisateurs de votre prédicat.Démo sur ideone.
Je ne comprends pas sml, donc je ne peux pas donner un sens au travail prototype de code. La deuxième clause de l'
remvdub/2
prédicat semble hautement suspect, bien que, parce que cela semble comme il se passe dans une récursion infinie.OriginalL'auteur dasblinkenlight