:-use_module(library(clpfd)).

% TP4

% Ex1
% solution Louis
my_abs(X,X):- X>=0.
my_abs(X,MX) :- X<0, MX #= -X.
% appel: maplist(my_abs,[1,3,-4],R).

% Ex2
% solution Gauthier modifiée
somme(X,Y,Z) :- Z #= abs(X) + Y.
% appel: foldl(somme,[1,2,-3,4,-5],0,Y).

% Cette solution ne fonctionne pas car un foncteur ne peut pas être une variable
% somme(F,X,Y,Z) :- Z #= F(X) + Y.
% appel foldl(somme(abs),[1,2,-3,4,-5],0,Y).

% Ex3
% Quicksort
% - on part d'une liste [2,3,1,5,4]
% - on choisit un pivot (en général le premier élement) et on sépare la liste en 2 : 
%    - les éléments < pivot
%    - les elements > pivot
% - on rappelle recursivement la fonction sur ces 2 listes jusqu'à
%   ce que les listes n'aient plus q'un élément
% - on concatene (fonction append) la liste des plus petits, 
%   le pivot et la liste des plus grands

% solution de tony et louis
sup(X,Y) :- X >Y.

quicksort([],[]).
quicksort([H|Q], Resultat) :-
%partition(Q, H, Gauche, Droite),
partition(sup(H), Q,Gauche,Droite), 
quicksort(Gauche, G_trie),
quicksort(Droite, D_trie),
append(G_trie, [H|D_trie], Resultat).

% Ex4
% solution jordan et killian
div(X,Y) :- 0 #= X mod Y.
diviseur(N,Res) :- findall(X,(between(1,N,X),div(N,X)),Res).

my_between(I,N,I):-I=<N.
my_between(I,N,R):- I=<N, IP1 #= I+1,my_between(IP1,N,R).

% Ex5
% solution younes, jordan et arthur
% on modélise les dames par une liste de 8 cases (lignes), 
% qui contienent chacune la position de la dame dans la colonne associée
% par exemple [1,2,3,4,5,6,7.8] correspond à l'échiquier où toutes les dames 
% sont sur la diagonale

% solution Sylvain
% On parcours la liste et  pour chaque paire indice - valeur. 
% on compare les résultat  
% et si il y a une égalité alors la solution n'est pas bonne
% permut  : [4,7,3,8,2,5,1,6] est une permutation valide
% par ex pour les 2 premiers élements : '1,4 et 2,7 : on vérifie que (2-1 <> 7-4)
valide(Permutation) :- 'TODO'.
    










