/* LUGRIN Laurie G3
    IAPL TP3 : Suites d'entiers 
partie II : Suites monotones et hypermonotones

reconsult("suites_cad.pl").
*/

suiteDeriveeCad([],[]).
suiteDeriveeCad([_],[]).
suiteDeriveeCad([E1,E2|L],[E|R]) :- 
  E is E2-E1,
  freeze(R,suiteDeriveeCad([E2|L],R)).

suitePositiveCad([]).
suitePositiveCad([E|R]) :-
  E > 0,
  freeze(R,suitePositiveCad(R)).

smCad(L) :-
  freeze(R,suiteDeriveeCad(L,R)),
  freeze(R,suitePositiveCad(R)),
  liste(R).

shmCad([]).
shmCad(L) :-
  suiteDeriveeCad(L,R),
  suitePositiveCad(R),
  shmCad(R).

liste([E|L]):-
  liste(L).
liste([]).

completer(L):- suiteConstante(L,X).
completer(L):- smCad(L).
completer(L):- shmCad(L).
completer(L):- repetition(L,U).
completer(L):- suiteDeriveeCad(L,R), completer(R).

/* suiteConstante(L,X) vrai ssi L n'est composé que d'éléments X */
suiteConstante([],X).
suiteConstante([X|L],X):- suiteConstante(L,X).

/* repetition(L,U) vrai ssi L est la liste U (non vide) répétée au moins 2 fois complètement
ex: repetition([1,2,1,2,1],[1,2]) est vrai
    repetition([1,2,1,2,1],[1,2,1,2]) est faux */
repetition(L,U):-
  U = [E|U1],
  concat(U,U,P),
  concat(P,L1,L),
  prefixe(L1,U).

repetition(L,U):-
  U = [E|U1],
  concat(U,L1,L),
  repetition(L1,U).

/* prefixe(P,L) vrai ssi P est prefixe de L */
prefixe([],L).
prefixe([E|P],[E|L]):- prefixe(P,L).

/* concat(A,B,C) vrai ssi C est la liste A suivit de B */
concat([],B,B).
concat([E|L],B,[E|M]):- concat(L,B,M).

/*
smCad([1,2,2,3,3,3]).

smCad([1,2,3,4,5,6]).

shmCad([1,2,3,4,5,6]).

shmCad([1,2,4,8,16,32]).

*/
