% 2

subsequence([X|Xs],[X|Ys]) :-
	subsequence(Xs,Ys).
subsequence(Xs,[_Y|Ys]) :-
	subsequence(Xs,Ys).
subsequence([],_Ys).

% 3

:- op(700,xfx,\).

duplicate(Xs,N,Ys) :-
	duplicate2(Xs,N,Ys\[]).

duplicate2([],_N,Ys\Ys).
duplicate2([X|Xs],N,Ys0\Ys2) :-
	generate(X,N,Ys0\Ys1),
	duplicate2(Xs,N,Ys1\Ys2).

generate(_X,0,Ys\Ys).
generate(X,N,Ys0\Ys1) :-
	N > 0,
	N1 is N - 1,
	generate(X,N1,Ys0\[X|Ys1]).

% 5

:- use_module(library(clpfd)).

factorial(0,1).
factorial(N,F) :-
    N #> 0,
    N1 #= N-1,
    F #= N * F1,
    factorial(N1,F1).