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
) :- append([R], A, Anew),
Length =\= 0,
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], _].
aXNQcmltZSgyKS4KaXNQcmltZSgzKS4KCmlzUHJpbWUoWCkgOi0gWCA+IDIsIGludGVnZXIoWCksIFggbW9kIDIgPTo9IDEsIFwrIGhhc19mYWN0b3IoWCwgMykuCgpoYXNfZmFjdG9yKFgsIEwpIDotIFggbW9kIEwgPTo9IDAuCmhhc19mYWN0b3IoWCwgTCkgOi0gTCAqIEwgPCBYLCBMbmV3IGlzIEwgKyAyLCBoYXNfZmFjdG9yKFgsIExuZXcpLgoKbnVtX2xlbmd0aChYLCBOKSA6LSBOIGlzIGZsb29yKGxvZzEwKFgpICsgMSkuCgpudW1iZXJUb0xpc3QoTnVtYmVyLCBMaXN0LCBMZW5ndGgpIDotIG51bWJlclRvTGlzdChOdW1iZXIsIFtdLCBMaXN0LCBMZW5ndGgpLgpudW1iZXJUb0xpc3QoXywgWCwgWCwgMCkuCm51bWJlclRvTGlzdChOdW1iZXIsIEEsIFgsIExlbmd0aCkgOi0KCU51bWJlck5ldyBpcyBOdW1iZXIgLy8gMTAsCglSIGlzIE51bWJlciByZW0gMTAsCglhcHBlbmQoW1JdLCBBLCBBbmV3KSwKCUxlbmd0aCA9XD0gMCwKCUxlbmd0aE5ldyBpcyBMZW5ndGggLSAxLAoJbnVtYmVyVG9MaXN0KE51bWJlck5ldywgQW5ldywgWCwgTGVuZ3RoTmV3KS4KCm51bWJlcl9vZl9lbChbWF0sIFgsIDEpLgpudW1iZXJfb2ZfZWwoW1hdLCBZLCAwKSA6LSBYID1cPSBZLgpudW1iZXJfb2ZfZWwoTGlzdCwgRWxlbWVudCwgWCkgOi0KCUxpc3QgPSBbSCB8IFRhaWxdLAoJKAoJKEggPSBFbGVtZW50LCBYID0gWG5ldyArIDEsIG51bWJlcl9vZl9lbChUYWlsLCBFbGVtZW50LCBYbmV3KSkKCTsKCShIID1cPSBFbGVtZW50LCBudW1iZXJfb2ZfZWwoVGFpbCwgRWxlbWVudCwgWCkpKS4KCm1hdGNoMyhYLCBEaWcpIDotCgludW1fbGVuZ3RoKFgsIE4pLAoJbnVtYmVyVG9MaXN0KFgsIExpc3QsIE4pLAoJbnVtbGlzdCgwLCA5LCBEaWdpdHMpLAoJbWVtYmVyKERpZywgRGlnaXRzKSwKCW51bWJlcl9vZl9lbChMaXN0LCBEaWcsIFEpLAoJUSA+PSAzLAoJIS4KCm1ha2VQcmltZXMoTGlzdCk6LSBmaW5kYWxsKFtMLCBEXSwgKGJldHdlZW4oMTAwMDAwLCA5OTk5OTksIFgpLCBpc1ByaW1lKFgpLCBtYXRjaDMoWCwgRCksIG51bWJlclRvTGlzdChYLCBMLCA2KSksIExpc3QpLgoKbWFpbihYKSA6LQoJdGltZShtYWtlUHJpbWVzKExpc3QpKSwKCW51bWxpc3QoMCwgOSwgRGlnaXRzKSwKCW1lbWJlcihYLCBMaXN0KSwKCW1lbWJlcihELCBEaWdpdHMpLAoJWCA9IFtbMSwwLEQsRCwxLERdLCBfXS4=