Here’s my solution - it’s not pretty, but it is fast.
% lucky_list(1, 100, L).
lucky_list(IntLower, IntUpper, Lst) :-
digits_list(IntLower, LstLower),
digits_list(IntUpper, LstUpper),
IntUpper >= IntLower,
digit_want_avoid(DigitWant, DigitAvoid),
lucky_list_(LstLower, LstUpper, DigitWant, DigitAvoid, Lst).
% Check of lower
lucky_list_(Lst, _LstUpper, DigitWant, DigitAvoid, Lst) :-
lucky_list_first(Lst, DigitWant, DigitAvoid, Lst).
lucky_list_(LstLower, LstUpper, DigitWant, DigitAvoid, Lst) :-
length(LstUpper, LenUpper),
lucky_list_inc_(LstLower, LstUpper, LenUpper, DigitWant, DigitAvoid, Lst).
lucky_list_first(Lst, DigitWant, DigitAvoid, Lst) :-
memberchk(DigitWant, Lst),
maplist(digit_without(DigitAvoid), Lst).
lucky_list_inc_(LstLower, LstUpper, LenUpper, DigitWant, DigitAvoid, Lst) :-
digit_list_inc(LstLower, DigitWant, DigitAvoid, LstInc),
digit_list_not_higher(LstInc, LstUpper, LenUpper),
( Lst = LstInc
; lucky_list_inc_(LstInc, LstUpper, LenUpper, DigitWant, DigitAvoid, Lst)
).
update_have_want(true, _, _, true).
update_have_want(false, DigitWant, DigitNext, HaveWant) :-
(DigitWant = DigitNext -> HaveWant = true ; HaveWant = false).
digit_without(Without, Digit) :-
between(0, 9, Digit),
Digit \= Without.
digit_want_avoid(6, 8).
digit_want_avoid(8, 6).
digits_list(Int, Lst) :-
atom_chars(Int, [H|T]),
% An integer does not start with zero
dif(H, 0),
chars_to_digits_(T, H, Lst).
chars_to_digits_([], H, [Digit]) :-
atom_number(H, Digit),
between(0, 9, Digit).
chars_to_digits_([H2|T], H, [Digit|Digits]) :-
atom_number(H, Digit),
between(0, 9, Digit),
chars_to_digits_(T, H2, Digits).
digit_list_not_higher(LstLower, LstUpper, LenUpper) :-
length(LstLower, LenLower),
( LenLower < LenUpper -> true
; digit_list_not_higher_same_len_(LstLower, LstUpper)
).
digit_list_not_higher_same_len_([], []).
digit_list_not_higher_same_len_([HeadLower|_TailLower], [HeadUpper|_TailUpper]) :-
HeadLower < HeadUpper, !.
digit_list_not_higher_same_len_([HeadLower|TailLower], [HeadUpper|TailUpper]) :-
HeadLower = HeadUpper,
digit_list_not_higher_same_len_(TailLower, TailUpper).
digit_list_inc(Lst, DigitWant, DigitAvoid, LstUpdated) :-
% If any of the digits are > 9, percolate the increments to be =< 9
digit_list_inc_(Lst, DigitWant, DigitAvoid, false, false, LstUpdated),
% The first answer is the correct one
LstUpdated \= Lst, !.
digit_list_inc(Lst, DigitWant, _DigitAvoid, LstUpdated) :-
% Increase the number of digits
length(Lst, LstLen),
succ(ZerosLen, LstLen),
length(Zeros, ZerosLen),
maplist(=(0), Zeros),
append([[1], Zeros, [DigitWant]], LstUpdated).
digit_list_inc_([], _, _, true, _, []).
digit_list_inc_([H], _DigitWant, DigitAvoid, true, false, [HAvoided]) :-
% Increment the final digit
inc_avoid(H, DigitAvoid, HAvoided).
% Is a subtle dance between carrying, incrementing, and when to skip ahead
digit_list_inc_([H], DigitWant, _DigitAvoid, false, false, [DigitWant]) :-
H < DigitWant.
digit_list_inc_([_H], DigitWant, _DigitAvoid, false, true, [DigitWant]).
digit_list_inc_([H], _DigitWant, DigitAvoid, true, true, [HAvoided]) :-
% Do not increment the final digit, because a carry has been performed
avoid_check(H, DigitAvoid, HAvoided).
% Ensuring that H is not the last element
digit_list_inc_([H,H2|T], DigitWant, DigitAvoid, HaveWant, false, [HAvoided|Lst]) :-
avoid_check(H, DigitAvoid, HAvoided),
update_have_want(HaveWant, DigitWant, HAvoided, HaveWant1),
digit_list_inc_([H2|T], DigitWant, DigitAvoid, HaveWant1, false, Lst).
digit_list_inc_([H,H2|T], DigitWant, DigitAvoid, HaveWant, _PrevInc, [HAvoided|Lst]) :-
% Perform a carry
inc_avoid(H, DigitAvoid, HAvoided),
update_have_want(HaveWant, DigitWant, HAvoided, HaveWant1),
% If HN2 is the last digit, reset it, to cater for skips
(T = [] -> HN2 = 0 ; HN2 is H2 - 10),
digit_list_inc_([HN2|T], DigitWant, DigitAvoid, HaveWant1, true, Lst).
inc_avoid(Digit, DigitAvoid, DigitIncAvoid) :-
DigitInc is Digit + 1,
avoid_check(DigitInc, DigitAvoid, DigitIncAvoid).
avoid_check(Digit, DigitAvoid, DigitIncAvoid) :-
(Digit = DigitAvoid -> DigitIncAvoid is Digit + 1 ; DigitIncAvoid = Digit),
between(0, 9, DigitIncAvoid).
Result in swi-prolog 8.5.7:
?- time((findall(L, lucky_list(1, 10000, L), Ls), length(Ls, LsLen))).
% 129,741 inferences, 0.025 CPU in 0.025 seconds (101% CPU, 5228243 Lips)
Ls = [[6],[1,6],[2,6],[3,6],[4,6],[5,6],[6,0],[6,1],[6,2],[6,3],[6,4],[6,5],[6,6],[6,7],[6,9],[7,6],[9,6],[1,0,6],[1,1,6],[1,2,6],[1,3,6],[1,4,6],[1,5,6],[1,6,0],[1,6,1],[1,6,2],[1,6,3],[1,6,4],[1,6,5],[1,6,6],[1,6,7],[1,6,9],[1,7,6],[1,9,6],[2,0,6],[2,1,6],[2,2,6],[2,3,6],[2,4,6],[2,5,6],[2,6,0],[2,6,1],[2,6,2],[2,6,3],[2,6,4],[2,6,5],[2,6,6],[2,6,7],[2,6,9],[2,7,6],[2,9,6],[3,0,6],[3,1,6],[3,2,6],[3,3,6],[3,4,6],[3,5,6],[3,6,0],[3,6,1],[3,6,2],[3,6,3],[3,6,4],[3,6,5],[3,6,6],[3,6,7],[3,6,9],[3,7,6],[3,9,6],[4,0,6],[4,1,6],[4,2,6],[4,3,6],[4,4,6],[4,5,6],[4,6,0],[4,6,1],[4,6,2],[4,6,3],[4,6,4],[4,6,5],[4,6,6],[4,6,7],[4,6,9],[4,7,6],[4,9,6],[5,0,6],[5,1,6],[5,2,6],[5,3,6],[5,4,6],[5,5,6],[5,6,0],[5,6,1],[5,6,2],[5,6,3],[5,6,4],[5,6|...],[5|...],[...|...]|...],
LsLen = 4930.