:-use_module(library(clpfd)).
% EX 1 Fibonnacci

% Q1
% Version non récursive terminale
% solution Louis et Lucas et Tony
% Cas d'arrêts
%fibo(0,1):-!.
%fibo(1,1):-!.
%% Cas récursif
%fibo(N,R) :-
%    N>1,
%    N1#=N-1,
%    N2#=N-2,
%    fibo(N1,X1),
%    fibo(N2,X2),
%    R#=X1+X2.
%
% Q2
% Version récursive terminale
% TODO

% Q3
% Version non récursive terminale
% en utilisant asserta
% Solution de Jordan
fibo(0,1) :- !.
fibo(1,1) :- !.
fibo(N,X) :-
    N >1,
    K #= N-1,
    L #= N-2,
    fibo(K,Y),
    asserta(fibo(K,Y):-!),
    fibo(L,Z),
    X #=Y + Z.

% Q4(ne marche pas avec prolog 7.6.4)
%:- table fib/2.
%
fib(0, 1) :- !.
fib(1, 1) :- !.
fib(N, F) :-
        N > 1,
        N1 #= N-1,
        N2 #= N-2,
        fib(N1, F1),
        fib(N2, F2),
        F #= F1+F2.

% EX 2
:- dynamic arc/3.
chemin(X,Y,[X,Y]) :-
    arc(X,Y,_).
chemin(X,Y,[X|W]) :-
    arc(X,Z,_),
    chemin(Z,Y,W).

% Ajouter dynamiquement les arc/3,
% lus depuis le fichier texte
% Solution Etienne, Kilian,
% Jordan, Louis, Guy
charger(Graphe):-
    csv_read_file(Graphe,[_,_|Rows],
		  [separator(32),
		   match_arity(false),
		   functor(arc)]),
    maplist(assertz,Rows).

% EX 3
% solution Kilian et Louis
google(In,Out) :-
    % Lecture de In
    csv_read_file(In,[_|L],
		  [
		   separator(32),
		   match_arity(false)]),
    maplist(appeler,L,Res),
    % Ecrire Res dans fichier Out
    open(Out,write,Stream),
    maplist(ecrire(Stream),Res),
    close(Stream,[]).

ecrire(Stream,Val):-
    write(Stream,'Case #i: '),
    write(Stream,Val),
    write(Stream,'\n').

appeler(row(N,M),Res):- rn(N,M,Res).

rn(N,M,NBRN):-
findall(
    [L,P],
    (
        between(N,M,X),
        number_codes(X,L),
        append(D,F,L),
        append(F,D,P),
        number_codes(Y,P),
        between(N,M,Y),Y > X
        ),
    List),
list_to_set(List,Set),    
length(Set,NBRN),!.
