2017-06-30 1 views
1

J'ai besoin de trouver un mot dans la liste de caractères et le supprimer de cela. Le prédicat ocurre ([Liste], [Word], [CleanList]).Trouver un mot dans la liste et le supprimer

[List] is a list of elements for example [a,b,c,d]. 
[Word] contains in a list the word that I must find in List for example [b,c] 
[CleanList] return List with out Word (in the example [a,d]) 

Le programme est le suivant:

ocurre([X|LS],[X|P],Aux):- ocurre(LS,P,Aux),!. 
ocurre([X|LS],[Y|P],Aux):- concatenar(Aux,[X],Aux2), 
          ocurre(LS,[Y|P],Aux2). 
ocurre([],[],Aux):-!. 
ocurre([],P,Aux):-!. 
ocurre(LS,[],[Aux|LS]):-!. 


concatenar([],X,X):-!. 
concatenar([X|Y],R,[X|M]):- concatenar(Y,R,M). 

Alors, quand je consulte ocurre([a,b,c,d] , [b,c] , L). Mon retour du programme L=[] et il doit retourner L=[a,d]. Je ne sais pas ce qui ne va pas. J'apprécie votre aide

+0

'delete' est en train de faire exactement cela. –

+2

Pourquoi toutes les coupes? Vous devriez les supprimer. S'ils sont là parce que les résultats n'étaient pas ce que vous attendiez, alors c'est la mauvaise utilisation pour une coupe. Tout de suite, vos cas de base ne sont pas logiques. 'ocurre ([], [], Aux)' dit que si vous avez une liste vide et que vous supprimez des mots dans une autre liste vide, alors le résultat est quelque chose ('Aux', non instancié). Cela n'a pas de sens. Pourquoi la règle n'est pas 'ocurre ([], [], [])'? De même avec vos autres cas de base. Je soupçonne que vous avez beaucoup d'avertissements variables singleton que vous devriez aborder. – lurker

Répondre

2

Tout d'abord, vous pouvez vous débarrasser de tous les opérateurs de coupe inutiles. Vous pouvez réécrire votre programme sans coupures et vous n'avez pas besoin du concatenar/3 prédicat:

ocurre([],_,[]). 
ocurre([H|T],[],[H|T]). 
ocurre([X|LS],[X|P],Aux):- ocurre(LS,P,Aux). 
ocurre([X|LS],[Y|P],[X|Aux]):- dif(X,Y),ocurre(LS,[Y|P],Aux). 

Exemple:

?- ocurre([a,b,c,d] , [b,c] , L). 
L = [a, d] ; 
false. 

Les problèmes avec votre mise en œuvre a d'abord été de tous les cas de base, il vous suffit lLa deux cas de base ci-dessus pour la première liste vide et la première seconde vide, tous les autres cas sont inclus dans la récursivité. De même que j'ai compris ce que vous essayiez de faire, c'est que lorsque vous trouvez un élément à ajouter dans la troisième liste, vous concaténez la troisième liste avec la nouvelle liste et transmise en tant que nouveau paramètre. Dans ce cas, vous utilisez la troisième liste comme un accumulateur où vous devez initialiser au début comme la liste vide. Ainsi, au lieu de tout cela pourrait simplement instancier la troisième liste-résultat au cours de la récursion, par exemple la règle:

ocurre([X|LS],[Y|P],[X|Aux]):- dif(X,Y),ocurre(LS,[Y|P],Aux). 

simple, dit que si X et Y sont différents, les ocurre d'appel avec le reste de la liste, par exemple LS et deuxième liste [Y | P] et vous avez instancié le premier élément actuel de la troisième liste: [X | Aux] avec X et continuez avec le reste, par exemple Aux.

+0

Je pense que cela aiderait le PO à ajouter quelques explications sur l'endroit où ils se sont trompés dans leur implémentation, et à inclure une explication/définition de vos règles pour plus de clarté. – lurker

+0

@lurker, merci !! ajouté quelques explications .. – coder

+0

Vous avez raison, c'est le travail pour mon. merci – chinocejas

0

une bibliothèque (lists) basée alternatives:

?- [user]. 
ocurre(List,Word,CleanList) :- 
|:  append([Left,Word,Right], List), 
|:  append(Left,Right,CleanList). 
|: 
|: ^Dtrue. 

?- ocurre([a,b,c,d] , [b,c] , L). 
L = [a, d] ; 
false.