X
을 제한 목록에 포함하지 않으려 고합니다. SICStus Prolog manual에서in_set/2 제약 조건 사용
:
?X in_set +FDSet
나는 그래도 FDSet에 목록을 변환하는 방법을 알아낼 수 없습니다. 나는 정수 [2,3,8,9]
의 목록을 가지고 있으며 변수 X
의 도메인을 해당 목록에 포함시키지 않고 싶습니다. 어떻게해야합니까? 감사.
X
을 제한 목록에 포함하지 않으려 고합니다. SICStus Prolog manual에서in_set/2 제약 조건 사용
:
?X in_set +FDSet
나는 그래도 FDSet에 목록을 변환하는 방법을 알아낼 수 없습니다. 나는 정수 [2,3,8,9]
의 목록을 가지고 있으며 변수 X
의 도메인을 해당 목록에 포함시키지 않고 싶습니다. 어떻게해야합니까? 감사.
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.
..
/** 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).
이것은 * generate-and-test *이며 제약의 힘을 잃습니다. 'in/2'의 핵심은 변수의 영역을 결정 론적으로 표현하는 것입니다. 역 추적 ('member/2')을 사용하는 대신 목록을 도메인 표현식으로 결정 론적으로 변환 한 다음 CLP (FD) 제약 조건을 완전히 활용할 수 있도록 단일 in/2 제약 조건을 게시해야합니다. – mat
음, 좋은 소리! 내가 그런 식으로 구현할 수 있는지 알게 될 것이다. 조언 해주셔서 감사합니다. –
무엇 :'X in \ ({2} \/{3} \/{8} \/{9})' – false