당신이 당신이 돌아갈 것은 대답이다 프롤로그에 쿼리를 입력하면
을 (@twinterer 이미 설명을했다, 내 대답은 다른 각도에서 그것을 가지고하려고합니다).답변에 솔루션이 포함되어있는 경우가 많으며 때로는 여러 솔루션이 포함되어 있으며 때로는 솔루션이 전혀 포함되지 않는 경우가 있습니다. 종종이 두 개념은 혼란 스럽다. 의는 GNU 프롤로그와 예를 살펴 보자 : 여기
| ?- length(Vs,3), fd_domain_bool(Vs).
Vs = [_#0(0..1),_#19(0..1),_#38(0..1)]
yes
을, 우리는 8 개 솔루션을 포함하는 대답이있다. 즉,
| ?- length(Vs,3), fd_domain_bool(Vs), fd_labeling(Vs).
Vs = [0,0,0] ? ;
Vs = [0,0,1] ? ;
...
Vs = [1,1,1]
yes
이제 다른 쿼리입니다. 이것이 인용 된 @twinterer의 예입니다.
| ?- length(Vs,3), fd_domain_bool(Vs), fd_all_different(Vs).
Vs = [_#0(0..1),_#19(0..1),_#38(0..1)]
yes
답변은 이전과 같습니다. 그러나 더 이상 해결책이 없습니다.
| ?- length(Vs,3), fd_domain_bool(Vs), fd_all_different(Vs), fd_labeling(Vs).
no
이상적으로 이러한 경우, 최상위은 "예"하지만 "아마도"언급하지 않았다. 사실 최초의 제약 시스템 중 하나 인 CLP (R)가이를 수행했습니다.
조금 덜 신비하게 만드는 또 다른 방법은 관련된 실제 제약 조건을 표시하는 것입니다. SWI이 작업을 수행합니다 :
이
?- length(Vs,3), Vs ins 0..1, all_different(Vs).
Vs = [_G565,_G568,_G571],
_G565 in 0..1,
all_different([_G565,_G568,_G571]),
_G568 in 0..1,
_G571 in 0..1.
?- length(Vs,3), Vs ins 0..1, all_different(Vs), labeling([], Vs).
false.
그래서 SWI는 당신에게 구체적인 솔루션을 얻을 만족하는 모든 제약 조건을 보여줍니다. SWI의 답을 다음과 같이 읽으십시오 : 예, 해결책이 있습니다. 아아, 작은 글씨는 거짓입니다.
이 문제를 해결하는 또 다른 방법은보다 일관성있는 all_different/1
구현을 얻는 것입니다. 그러나 이것은 특정 경우에만 작동합니다.
?- length(Vs,3), Vs ins 0..1, all_distinct(Vs).
false.
는 일반적인 경우에 당신은 시스템이 글로벌 일관성을 유지하기 위해 기대할 수 없다. 이유 :
일관성 유지는 매우 비쌉니다. 그러한 결정을 라벨링에 위임하는 것이 종종 더 좋습니다. 사실 단순한 all_different/1
은 종종 all_distinct/1
보다 빠릅니다.
더 나은 일관성 알고리즘은 종종 매우 복잡합니다.
일반적으로 글로벌 일관성을 유지하는 것은 결정할 수없는 문제입니다.
감사합니다. 훌륭한 설명입니다. – CptOatmeal