2017-07-09 1 views
1

Je dois diviser une liste en une plus grande que N et une plus petite, tout en ignorant les non-entiers. Cela fonctionne parfaitement sauf qu'il lance une exception quand j'inclus des entiers non entiers. Quelqu'un peut-il voir ce que je fais mal s'il vous plaît:Programme Prolog pour exclure un entier de la liste de résultats

split([],N, [],[]). 
split([HeadOrig | TailOrig], N, L1, TailOrig):- 
    \+ integer(HeadOrig), 
    split(TailOrig, N, L1, TailOrig). 
split([HeadOrig|TailOrig],N, [HeadOrig|Tail1],L2):- 
    integer(HeadOrig), HeadOrig >= N, 
    !, 
    split(TailOrig, N, Tail1, L2). 
split([HeadOrig | TailOrig], N, L1, [HeadOrig | Tail2]) :- 
    integer(HeadOrig), HeadOrig < N, 
    !, 
    split(TailOrig, N, L1, Tail2). 
+0

OK j'ai vu que maintenant (ont modifié le code ci-dessus d'origine) mais maintenant il retourne juste 'faux' si je lui donne une liste avec une lettre par exemple: [1,2, 'a']. Pas plus d'erreur, mais maintenant ne continue pas avec le fractionnement – ildsarria

Répondre

1

Le problème est que le dernier terme de cette clause ne doit pas être TailOrig:

split([], _, [],[]). 

split([HeadOrig | TailOrig], N, L1, L2):- 
    \+ integer(HeadOrig), 
    split(TailOrig, N, L1, L2), 
    !. 

split([HeadOrig|TailOrig], N, [HeadOrig|Tail1], L2):- 
    integer(HeadOrig), HeadOrig >= N, 
    !, 
    split(TailOrig, N, Tail1, L2). 

split([HeadOrig | TailOrig], N, L1, [HeadOrig | Tail2]) :- 
    integer(HeadOrig), HeadOrig < N, 
    !, 
    split(TailOrig, N, L1, Tail2). 
+0

Merci OMGosh! Regarder trop longtemps :) – ildsarria

+0

Vous êtes les bienvenus :) – enezhadian