Je suis nouveau dans Prolog et j'essaie de faire trier la sélection. Voici ce que j'ai:Tri de sélection dans prolog
ssort([],[]).
ssort([M|S],L):-min(M,L),remove(M,L,N),ssort(S,N).
min(M,[M]).
min(M,[H,T]):-min(N,T),min2(M,H,N).
min2(A,A,B):-less(A,B).
min2(B,A,B):-not(less(A,B)).
less(A,B):-(A<B).
append([],B,B).
append([H|A],B,[H|AB]):-append(A,B,AB).
remove(X,L,N):-append(A,[X|B],L),append(A,B,N).
Mais quand j'essaie ceci par exemple:
ssort(S,[5,3,1]),write(S).
Je me false
, peu importe ce que j'essaie. Pouvez-vous me dire comment je peux trier la liste et obtenir le résultat écrit en S
?
L'avez-vous tracé? Triez-vous le premier ou le deuxième argument? Avez-vous essayé de tester chacun des prédicats de façon isolée? Par exemple, êtes-vous sûr que votre 'min/2' fait ce que vous attendez de faire? Je demande parce que vous pourriez être capable de résoudre votre problème par vous-même sans trop d'effort, et parce que si j'essayais de faire un tri de sélection dans Prolog, ce serait un peu trop différent de ce que vous avez en ce moment, et c'est un travail désagréable pour traquer les erreurs des autres ("bugs"). –
Malheureusement, je ne sais pas comment le tracer. Je trie le deuxième argument, et écrit le résultat dans le premier. 'min2' est supposé trouver le minimum entre le 2ème et le 3ème argument et l'écrire dans le premier. Je ne suis pas sûr si je le fais bien, cependant: D –
Voici une suggestion: tester votre 'min/2' et votre' min2/3'. Si elles fonctionnent comme prévu, vous avez un problème ailleurs (et il n'y a pas beaucoup de code). Si elles ne fonctionnent pas comme prévu, vous pouvez poser une question plus petite et plus précise, plus facile à répondre. En ce moment vous avez juste un tas de code et "corrigez-le s'il vous plaît" ce qui n'est pas une bonne approche à demander. –