% Author:
% Date: 11/01/2011

matiere(logique).
matiere(info).

travaille(jean,logique).

avoirbr(Eleve) :-
    matiere(X),
    travaille(Eleve,X).
    
etoile(N) :-
     N > 0,
    write('*'),
    N1 is N-1,
    etoile(N1).
    
etoile(N) :- N=<0.
    
triangle1(N) :-
         N>0,
         etoile(N),nl,
         N1 is N-1,
         triangle1(N1).

triangle2(N) :- N=<0.
triangle2(N) :-
     N>0,
     N1 is N-1,
     triangle2(N1),
     etoile(N),nl.
     
skolem(Liste) :-
    length(Liste,Size),
    SkolemOrder is Size / 2,
    checkApparition(Liste,SkolemOrder),
    checkInterval(Liste,SkolemOrder).
    
checkApparition(Liste,SkolemOrder) :-
    SkolemOrder > 0,
    checkOrderApparition(Liste,SkolemOrder),
    NextItem is SkolemOrder - 1,
    checkApparition(Liste,NextItem).
    
checkApparition(_,0).
    
checkOrderApparition(Liste,SkolemOrder) :-
    member(SkolemOrder,Liste),
    select(SkolemOrder,Liste,Tail),
    member(SkolemOrder,Tail),
    select(SkolemOrder,Tail,FinalTail),
    not( member(SkolemOrder,FinalTail) ).
    
checkInterval(Liste,Order):-
    findall(X,nth0(X,Liste,Order),NewListe),
    nth0(0,NewListe,Borninf),
    nth0(1,NewListe,Bornsup),
    Res is Bornsup - Borninf,
    Res =:= Order.

parcourir(Liste,0,Liste).

parcourir([_H|T],Taille,Final):-
    Tailleb is Taille - 1,
    parcourir(T,Tailleb,Final).

supprimerfin([H|T],Autre,[H|T2]):-
     Autre > 0,
     Autreb is Autre - 1,
     supprimerfin(T,Autreb,T2).
     
supprimerfin([H|_],0,[H]).
    
sousliste(L1,I,J,L2) :-
    I<J,
    length(L1,Taille),
    Taille >= J,
    parcourir(L1,I,Final),
    Autre is J-I+1,
    supprimerfin(Final,Autre,L2).
    