2010-12-03 11 views
1

Attention, je suis assez nouveau pour Prolog. J'ai écrit un prédicat de split dans Prolog. Il divise une liste en deux nouvelles listes. Un qui contient des éléments plus grands que Key, et un qui contient des éléments inférieurs ou égaux à Key. Il devrait seulement retourner une série de réponses. Le problème est si je tape; pour vérifier plus de réponses, il continue à me donner la réponse que j'ai déjà reçue et puis finalement l'auditeur plante. Je me demandais si vous pouviez m'aider à résoudre ce problème?Donner la même réponse encore et encore, que les plantages de l'écouteur - Prolog

code:

split([],_,[],[]). 
split([H|T],Key,Small,Big):- 
    H=<Key, 
    removeFirst(Small,H,NewSmall), 
    split(T,Key,NewSmall,Big). 
split([H|T],Key,Small,Big):- 
    H>Key, 
    removeFirst(Big,H,NewBig), 
    split(T,Key,Small,NewBig). 

removeFirst([H|T],H,T). 
removeFirst(L,Key,Result):- 
    divide(L,Key,F,E), 
    X = F, 
    Y = E, 
    append(X,Y,Z), 
    Result = Z. 

Sortie:

?- split([1,2,3,4,5],3,S,B).

S = [1, 2, 3]
B = [4, 5] ;

S = [1, 2, 3]
B = [4, 5] ;

S = [1, 2, 3]
B = [4, 5] ;
Listener se bloque sur 4 tentative.

Répondre

2

Je vous suggère de résoudre cet algorithme d'une autre manière:

  • Définir un prédicat récursif (split/4) que vous avez fait, la vérification de chaque élément dans la liste d'entrée, mais construire les listes résultant du retour des récursivité (c'est-à-dire, ajouter l'élément actuel en tant que tête de la liste appropriée sur l'en-tête de la clause).

Ce serait quelque chose comme ceci:

split([], _, [], []). % Base case 
split([Item|Tail], Key, [Item|Small], Big):- 
    Item =< Key, 
    !, % Optimization, the cut here is to avoid the comparison in the next clause 
    split(Tail, Key, Small, Big). 
split([Item|Tail], Key, Small, [Item|Big]):- 
    split(Tail, Key, Small, Big). 
+1

+1; c'est comme ça que j'irais aussi écrire un tel prédicat. Si vous ne voulez pas utiliser cut ('!') Pour la pureté, il suffit simplement de laisser le test 'Item> Key' en tant que premier sous-objectif de la dernière clause de' split/4' comme l'OP avait initialement. – sharky