nalezy(X,[_|T]):-nalezy(X,T).
nalezy(X,[X|_]).


dlugosc([_|T],D):-dlugosc(T,D0),D is D0+1.
dlugosc([],0).


suma([H|T],S):-suma(T,S0),S is S0+H.
suma([],0).


sklej([],L,L).
sklej([H|T1],L,[H|T3]):-sklej(T1,L,T3).


silnia(0,1).
silnia(N,M):-N1 is N-1,silnia(N1,X), M is X*N.


podzielny(A,B):- A mod B =:= 0.
przestepny(R):-podzielny(R,4), not(podzielny(R,100));podzielny(R,400).


wybierz(X,[X|T],T).
wybierz(X,[H|T],[H|T2]):- H\=X, wybierz(X,T,T2).


wybierz2(X,Y,L):-wybierz(X,L,L2),wybierz(Y,L2,_).


isDate(D,M,_):-select(M,[1,3,5,7,8,10,12],_),D>0,D<32.
isDate(D,M,_):-select(M,[4,6,9,11], _),D>0,D=<30.


select5(X1,X2,X3,X4,X5,L1):-select(X1,L1,L2),select(X2,L2,L3),select(X3,L3,L4),select(X4,L4,L5),select(X5,L5,_).


bieg(W,G,D,A,B):-
select5(W,G,D,A,B,[1,2,3,4,5]),
D\=2,A>1,A<5,G is D+2,W\=1,B is W+1.


symetria(X1,X0,Y1,Y0):-L=[0,1,2,3,4,5,6,8,9],
select(X1,L,_),select(X0,L,_),select(Y1,L,_),select(Y0,L,_),
U0 is Y0*X0 mod 10,
P1 is Y0*X0 // 10,
U1 is (Y0*X1+P1) mod 10,
P2 is (Y0*X1+P1) // 10,
Y0 * 2 + P2 =:= 5,
V0 is Y1 * X0 mod 10,
P3 is Y1*X0 //10,
(Y1 * X1 + P3) mod 10 =:= 4,
P4 is (Y1 * X1 + P3) //10,
(Y1 * 2 + P4) < 10,
(3 * X0) mod 10 =:= 3,
P5 is 3 * X0 //10,
Z0 is (3 * X0 + P5) mod 10,
P6 is (3 * X1 + P5) //10,
Z1 is (3 * 2 + P6),
Z1 < 10.


koledzy(W,B,S):-L=[inf,fiz,ele],
select(W,L,L1),select(B,L1,L2),select(S,L2,_),
B \= inf, S \= inf, S \= fiz.


atom4(A,T,O,M):-L=[2,3,4,5,6,7,8,9],
select(A,L,_),select(T,L,_),select(O,L,_),select(M,L,_),
Z5 is M*M mod 10,
P1 is M*M // 10,
Z4 is (M*O+P1) mod 10,
P2 is (M*O+P1) // 10,
Z3 is (M*T+P2) mod 10,
P3 is (M*T+P2) // 10,
Z2 is (M*T+P3) mod 10,
X5 is O*M mod 10,
P12 is O*M //10,
X4 is (O*O+P12) mod 10,
P22 is (O*O+P12) // 10,
X3 is (O*T+P22) mod 10,
C5 is T*M mod 10,
P13 is T*M //10,
C4 is (T*M+P13) mod 10,
V5 is A*M mod 10,
Z5 =:= M,
(Z4 + X5) mod 10 =:= O,
R1 is (Z4 + X5) // 10,
(Z3 + X4 + C5 + R1) mod 10 =:= T,
R2 is (Z3 + X4 + C5 + R1) // 10,
(Z2 + X3 + C4 + V5 + R2) mod 10 =:= A.


garaze(E,H,K,R,T,Ford,Citroen,Fiat,Opel,Volvo):-Gar=[1,2,3,4,5],
select5(E,H,K,R,T,Gar),select5(Ford,Citroen,Fiat,Opel,Volvo,Gar),
E =:= Ford,
R \= Opel,
T =:= Citroen,
T < (E-1),
K \= Citroen,
K \= Fiat,
K \= Ford,
Ford =:= 3,
R > Fiat,
R - Fiat =:= 1.


rybacy(B,L,P,S):-select4(B,L,P,S,[3,4,5,6]),
B+L+P+S=:=18,
P<B, P<L, P<S,
P+B =:= 9,
L+S =:=9,
S>=5.


%sel(ListaZmiennych, Lista, Reszta).
sel([H], L, R) :- select(H, L, R).
sel([ZH|ZT], L, R) :-
select(ZH, L, L2),
sel(ZT, L2, R).


wykladowcy(Anna, Barbara, Katarzyna, Daniel, Filip, Igor) :-
L0=[angielski, francuski, geografia, historia, matematyka, niemiecki],
L1= [Anna, Barbara, Katarzyna, Daniel, Filip, Igor],
sel(L1, L0,_),
Igor\=matematyka, Igor\=niemiecki,
Filip\=matematyka, Filip\=niemiecki,
Daniel\=matematyka, Daniel\=niemiecki,
Anna\=niemiecki,
Filip\=francuski,
Igor\=francuski,
Igor\=angielski,
Filip\=angielski,
Igor\=geografia,
Anna\=angielski,
Anna\=matematyka,
Anna\=historia,
Barbara\=angielski,
Barbara\=matematyka,
Barbara\=historia.


rodzice_sa_przyjaciolmi(mocko, bareja).
rodzice_sa_przyjaciolmi(bareja, mocko).


biora_slub(mocko, bareja).
biora_slub(bareja, mocko).
siatkowka(bareja, szafran).
siatkowka(szafran, bareja).


studenci(Ewa,Kuba,Marcin,Piotr,Sandra):-
L0=[bareja, kowalczyk, mocko, sulej, szafran],
L1=[Ewa,Kuba,Marcin,Piotr,Sandra],
sel(L1,L0,_),
not(rodzice_sa_przyjaciolmi(Sandra, Piotr)),
not(rodzice_sa_przyjaciolmi(Piotr, Sandra)),
Kuba\=bareja,
Kuba\=mocko,
Kuba\=szafran,
Kuba\=kowalczyk,
Ewa\=kowalczyk,
Sandra\=kowalczyk,
Piotr\=kowalczyk,
not(biora_slub(Sandra, Piotr)),
not(biora_slub(Piotr, Sandra)),
not(biora_slub(Ewa, Sandra)),
not(biora_slub(Sandra, Ewa)),
not(biora_slub(Kuba, Marcin)),
not(biora_slub(Marcin, Kuba)),
not(biora_slub(Marcin, Piotr)),
not(biora_slub(Piotr, Marcin)),
siatkowka(Ewa,Sandra),
siatkowka(Sandra,Ewa).