% N est le nombre de lignes de l'échiquier test(N) :- % max est le nombre de caes Max is N N, % on crée l'échiquier, une simple liste % dont les éléments ne sont pas initialiséx length(L, Max), % on lance la recherche cavalier(N, 0, Max, 0, 0, L), affiche(N, 0, L). % cavalier(NbCol, Coup, Max, Lig, Col, L), % NbCol est le nombre de colonnes par ligne % Coup est le numéro du déplacement en cours d'étude % Max est le noimbre maximum de déplacements % Lig Col la position courant du cavalier % L est la liste échiquier % ici on est arrive cavalier(_, Max, Max, _, _, _) - !. cavalier(NbCol, N, MaxN, Lg, Cl, L) :- % On s'assure d'abord que la position est valide Lg = 0, Cl = 0, Lg NbCol, Cl NbCol, % On calcule la position de la case sur l'échiquer Pos is Lg NbCol + Cl, % on calcule le numéro du coup N1 is N+1, % on met dans la case le numéro du coup % spécificité Prolog, si la case est déjà occupée il y a echec % donc backtrack ici nth0(Pos, L, N1), % on calcule les différentes cases accessibles LgM1 is Lg - 1, LgM2 is Lg - 2, LgP1 is Lg + 1, LgP2 is Lg + 2, ClM1 is Cl - 1, ClM2 is Cl - 2, ClP1 is Cl + 1, ClP2 is Cl + 2, % et on essaye les cases suivantes % le ; permet, s'il y a echec d'une recherche, % de continuer avec la suivante ( cavalier(NbCol, N1, MaxN, LgP1, ClM2, L); cavalier(NbCol, N1, MaxN, LgP2, ClM1, L); cavalier(NbCol, N1, MaxN, LgP2, ClP1, L); cavalier(NbCol, N1, MaxN, LgP1, ClP2, L); cavalier(NbCol, N1, MaxN, LgM1, ClM2, L); cavalier(NbCol, N1, MaxN, LgM2, ClM1, L); cavalier(NbCol, N1, MaxN, LgM2, ClP1, L); cavalier(NbCol, N1, MaxN, LgM1, ClP2, L) ).