2012-04-12 2 views
2

X을 제한 목록에 포함하지 않으려 고합니다. SICStus Prolog manual에서in_set/2 제약 조건 사용

:

?X in_set +FDSet 

나는 그래도 FDSet에 목록을 변환하는 방법을 알아낼 수 없습니다. 나는 정수 [2,3,8,9]의 목록을 가지고 있으며 변수 X의 도메인을 해당 목록에 포함시키지 않고 싶습니다. 어떻게해야합니까? 감사.

답변

4

documentation에서 판단 할 때, list_to_fdset/2은? FDSet으로 번역 한 다음 을 보완하고을 작성한 다음 in_set/2을 게시하십시오. 버전에 list_to_fdset/2이없는 경우 목록을 일반 도메인 표현식으로 쉽게 변환 한 다음 부정형 in/2 제약 조건을 게시 할 수 있습니다. 귀하의 예제에서는 다음 포스팅은 다음과 같습니다

list_domain([I|Is], Dom) :- 
     foldl(integer_domain_, Is, {I}, Dom). 

integer_domain_(I, D0, D0 \/ {I}). 

예 쿼리 :

#\ X in {2}\/{3}\/{8}\/{9} 

당신 만이이 목록과 싱글로 구성된 도메인 표현, 쉬운 사이의 관계를 설명하기 위해

을 내가 여기에 같은 일을 구현
?- list_domain([1,2,3], Dom). 
Dom = {1}\/{2}\/{3}. 

?- list_domain([1,2,3], Dom), X in Dom. 
Dom = {1}\/{2}\/{3}, 
X in 1..3. 
+0

무엇 :'X in \ ({2} \/{3} \/{8} \/{9})' – false

0

..

/** Constraint domain to memebers of a list (of numbers only) **/ 

domain_list_constraint(_, []) :- !. 
domain_list_constraint(DomainVar, List) :- member(E, List), 
           (atom(E)->atom_number(E, I), 
           DomainVar #= I; 
           DomainVar #= E). 
+2

이것은 * generate-and-test *이며 제약의 힘을 잃습니다. 'in/2'의 핵심은 변수의 영역을 결정 론적으로 표현하는 것입니다. 역 추적 ('member/2')을 사용하는 대신 목록을 도메인 표현식으로 결정 론적으로 변환 한 다음 CLP (FD) 제약 조건을 완전히 활용할 수 있도록 단일 in/2 제약 조건을 게시해야합니다. – mat

+0

음, 좋은 소리! 내가 그런 식으로 구현할 수 있는지 알게 될 것이다. 조언 해주셔서 감사합니다. –