% 1) element_at(X, L, K)
element_at(X, [X|_], 1).
element_at(X, [_|Tail], K) :-
    K > 1,
    K1 is K - 1,
    element_at(X, Tail, K1).

% 2) dupli(L1, L2)
dupli([], []).
dupli([X|Xs], [X, X|Ys]) :-
    dupli(Xs, Ys).

% 3) my_reverse(L1, L2)
my_reverse(List, Reversed) :-
    my_reverse_acc(List, [], Reversed).

my_reverse_acc([], Acc, Acc).
my_reverse_acc([X|Xs], Acc, Reversed) :-
    my_reverse_acc(Xs, [X|Acc], Reversed).

% 4) end(X, L1, L2)
end(X, [], [X]).
end(X, [Y|Ys], [Y|Result]) :-
    end(X, Ys, Result).

% 5) remove_at(X, L, K, R)
remove_at(X, [X|Tail], 1, Tail).
remove_at(X, [Y|Tail], K, [Y|Rest]) :-
    K > 1,
    K1 is K - 1,
    remove_at(X, Tail, K1, Rest).

% 6) take(L1, N, L2)
take(_, 0, []).
take([X|Xs], N, [X|Ys]) :-
    N > 0,
    N1 is N - 1,
    take(Xs, N1, Ys).

% 7) my_flatten(L1, L2)
my_flatten([], []).
my_flatten([X|Xs], Flat) :-
    is_list(X),
    !,
    my_flatten(X, FlatX),
    my_flatten(Xs, FlatXs),
    append(FlatX, FlatXs, Flat).
my_flatten([X|Xs], [X|FlatXs]) :-
    my_flatten(Xs, FlatXs).