isPrime(2).
isPrime(3).

isPrime(X) :- X > 2, integer(X), X mod 2 =:= 1, \+ has_factor(X, 3).

has_factor(X, L) :- X mod L =:= 0.
has_factor(X, L) :- L * L < X, Lnew is L + 2, has_factor(X, Lnew).

num_length(X, N) :- N is floor(log10(X) + 1).

numberToList(Number, List, Length) :- numberToList(Number, [], List, Length).
numberToList(_, X, X, 0).
numberToList(Number, A, X, Length) :-
	NumberNew is Number // 10,
	R is Number rem 10,
	append([R], A, Anew),
	Length =\= 0,
	LengthNew is Length - 1,
	numberToList(NumberNew, Anew, X, LengthNew).

number_of_el([X], X, 1).
number_of_el([X], Y, 0) :- X =\= Y.
number_of_el(List, Element, X) :-
	List = [H | Tail],
	(
	(H = Element, X = Xnew + 1, number_of_el(Tail, Element, Xnew))
	;
	(H =\= Element, number_of_el(Tail, Element, X))).

match3(X, Dig) :-
	num_length(X, N),
	numberToList(X, List, N),
	numlist(0, 9, Digits),
	member(Dig, Digits),
	number_of_el(List, Dig, Q),
	Q >= 3,
	!.

makePrimes(List):- findall([L, D], (between(100000, 999999, X), isPrime(X), match3(X, D), numberToList(X, L, 6)), List).

main(X) :-
	time(makePrimes(List)),
	numlist(0, 9, Digits),
	member(X, List),
	member(D, Digits),
	X = [[1,0,D,D,1,D], _].