Преобразование L в список цифр Prolog

Если у меня есть следующая база данных:

digit(0).
digit(1).
digit(2).
digit(3).
digit(4).
digit(5).
digit(6).
digit(7).
digit(8).
digit(9).

Я хочу запрос

digits([X,Y]). 

чтобы добиться успеха, создав X и Y до 10 * 10 = 100 различных комбинаций цифр, как мне это сделать?

Нужно ли мне использовать конечные ограничения домена для этого и что-то вроде

L ins 0..9

заранее спасибо


person CompilerSaysNo    schedule 17.05.2014    source источник


Ответы (2)


вам не нужен clpfd для этого. Вы можете использовать более высокий порядок для получения выразительного решения:

digits(L) :- maplist(digit, L).

Вы также можете сделать рекурсию самостоятельно:

digits([]) :- [].
digits([H|T]) :- digit(H), digits(T).
person m09    schedule 17.05.2014

Использование clpfd очень просто:

?- use_module(library(clpfd)).
true.

?- length(Zs, 3), Zs ins 1..2, labeling([], Zs).
  Zs = [1,1,1]
; Zs = [1,1,2]
; Zs = [1,2,1]
; Zs = [1,2,2]
; Zs = [2,1,1]
; Zs = [2,1,2]
; Zs = [2,2,1]
; Zs = [2,2,2].
person repeat    schedule 30.11.2015