2014-05-17 2 views
2

나는 다음과 같은 데이터베이스가있는 경우 :숫자의 목록에 L 인스턴스화 프롤로그

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

내가

digits([X,Y]). 

10 * 10 = 100 가지에 X와 Y를 인스턴스화하여 성공하는 쿼리를 원하는을 자릿수의 조합은 어떻게 될까요?

난 당신이 그렇게 할 clpfd 필요가 없습니다 미리

답변

2

L ins 0..9 

감사합니다 같은이 뭔가에 대한 유한 도메인 제약 조건을 사용해야합니다. 직선적이다

digits([]) :- []. 
digits([H|T]) :- digit(H), digits(T). 
2

사용 :

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

또한 재귀 직접 수행 할 수 있습니다 당신은 표현 솔루션을 얻기 위해 높은 순서를 사용할 수 있습니다

 
?- 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].