2010-11-02 21 views
1

en utilisant le prédicat annonce de SWI-Prolog (ou prédicat de SICStus dans sa bibliothèque de liste), nous avons:Prolog - Différence entre deux listes, mais

lists:subtract([], _, []) :- !. 
lists:subtract([A|C], B, D) :- 
    memberchk(A, B), !, 
    subtract(C, B, D). 
lists:subtract([A|B], C, [A|D]) :- 
    subtract(B, C, D). 

qui fait cela avec succès:

?- subtract([2,3,4,5],[3,4],X). 
X = [2, 5]. 

MAIS , si je veux faire:

?- new_subtract([2,3,4,5],[3,X],Y). 
X = [3, 2], 
X = [3, 4], 
X = [3, 5], 

Y a alors trois solutions en prenant les trois solutions X de [2,3,4,5].

Cependant, soustraire/2 ne le permet pas.

J'ai essayé de résoudre cela depuis des lustres en retirant les découpes (!) S du corps du prédicat construit pour essayer de le faire revenir en arrière et trouver toutes les solutions.

Répondre

4

Je suppose que vous voulez dire

?- new_subtract([2,3,4,5],[3,X],Y). 
Y = [3, 2] ; 
Y = [3, 4] ; 
Y = [3, 5] 

La définition suivante fait, mais ne conserve pas tous les comportements de subtract/3:

sub(List,[],List). 
sub(List,[X|Sub],Rem) :- select(X,List,Rem0), sub(Rem0,Sub,Rem). 

Utilisation:

?- sub([2,3,4,5],[3,X],Y). 
X = 2, 
Y = [4, 5] ; 
X = 4, 
Y = [2, 5] ; 
X = 5, 
Y = [2, 4] ; 
false. 
+1

Merci encore larsmans , c'est tellement simple maintenant je le vois !! Continuez votre bon travail :). – ale

Questions connexes