Вот решение, основанное на damianodamiano ответ с использованием встроенных предикатов:
contains_digits(Number,Digit1,Digit2) :-
between(0,inf,Number),
between(0,9,Digit1),
between(0,9,Digit2),
atom_number(Char1,Digit1),
atom_number(Char2,Digit2),
number_chars(Number,Chars),
member(Char1,Chars),
member(Char2,Chars).
Вы можете использовать memberchk/2
вместо member/2
. Важным моментом является то, что contains_digits/3
имеет следующую спецификацию :
contains_digits(?Number,?Digit1,?Digit2) is nondet.
Например:
?- contains_digits(N,D1,D2).
% succeeds with all solutions for N, D1 and D2.
?- findall((N,M),contains_digits(123,N,M),Sols).
Sols = [(1, 1), (1, 2), (1, 3), (2, 1), (2, 2), (2, 3), (3, 1), (3, 2), (3, 3)].
?- findall(N,contains_digits(123,N,2),Sols).
Sols = [1, 2, 3].
?- findall(N,contains_digits(123,1,N),Sols).
Sols = [1, 2, 3].
?- contains_digits(123,1,2).
true ;
false.
?- contains_digits(123,1,5).
false.
?- contains_digits(123,5,1).
false.
?- contains_digits(123,5,8).
false.
Это решение жертвует полудетерминизмом для возможности создания решений для произвольно созданных номеров и цифр. Более сложные подходы будут использовать библиотеку CLP (FD) или DCG для эффективной генерации возможных решений. Это выходит за рамки этого ответа.