2013-05-12 4 views
1

다음 프로그램을 단축하고 싶습니다. 단지 이미징에는 XY 대신 수십 개의 변수가 있습니다. 문제는 각 변수에 대해 별도로 도메인을 정의해야한다는 것입니다. 내 프로그램이 훨씬 길고 투명 해지기 때문에 나는 그것을 좋아하지 않습니다.다음 프로그램 단축 방법?

입력 :

?- Dom1 in 0..2, Dom2 in 0..2, global_cardinality([X,Y], [0-Dom1,1-Dom2]), labeling([],[X,Y]). 

결과 :

X = 0, 
Y = 0, 
Dom1 = 2, 
Dom2 = 0 ? ; 
X = 0, 
Y = 1, 
Dom1 = 1, 
Dom2 = 1 ? ; 
X = 1, 
Y = 0, 
Dom1 = 1, 
Dom2 = 1 ? ; 
X = 1, 
Y = 1, 
Dom1 = 0, 
Dom2 = 2 ? ; 
no 

는 처음에는 내가 작성하여 간단하게 해결할 것이라고 생각 :

?- Dom1 in 0..2, global_cardinality([X,Y], [0-Dom1,1-Dom1]), labeling([],[X,Y]). 

하지만이 작동하지 않습니다 DOM1을 통합하여 때문에 (이것은 clpfd에서 일어나는 일에 대한 적절한 용어입니까?) 하나의 값으로 결과는 다음과 같습니다.

X = 0,  
Y = 1, 
Dom1 = 1 ? ; 
X = 1, 
Y = 0, 
Dom1 = 1 ? ; 
no 

고마워요!

답변

3

L = [X1, ..., Xn ] 그리고 모든 변수를 1.10에 넣기를 원할 것입니다. ,

?- domain(L, 1, 10). 

대안이 간격이 너무없는 도메인에 대한 작동합니다 :

대안 1 만 간격으로 작동

?- (foreach(X,L) do X in 1..10). 
2

사용 사례를 이해할 수 없습니다. 당신이 후있어 그 결과

?- [X,Y] ins 0..1, labeling([], [X,Y]). 
X = Y, Y = 0 ; 
X = 0, 
Y = 1 ; 
X = 1, 
Y = 0 ; 
X = Y, Y = 1. 

귀하의 설명과 동일한 것으로 보인다

하나 개의 값과 DOM1을 통합하여 (...)이

명확 것 때문에 작동하지 않습니다 나에게. Dom1은 키의 발생 수를 의미하고 2 개의 가능한 값 ('keys'0, 1)을 갖는 2 개의 변수가 있으므로 Dom1은 1이어야합니다.

+0

아하,'ins' 상당히 프로그램을 단축하지만 여전히 나는 필요 많은'Dom '변수. 나는 그것이 더 단축 될 수 없다고 생각한다. 나는 시간 설정 문제를 해결하고 있는데, global_cardinality는 시간 슬롯에 수업이 없거나 수업을 하나만 가질 수 있다고 말하기 위해 필요하다. –

+1

시간 테이블에 관해서는 스케줄 된 각 레슨마다 하나의 유한 도메인 변수를 사용하는 것이 더 좋을 수 있으며,이 변수 (각 레슨의 시간 슬롯을 보유)는 'all_different/1'이어야합니다. 빈 시간 슬롯은 자신의 변수를 요구하지 않고 단순히 어떤 레슨에도 할당되지 않으므로 변수의 수를 줄일 수 있습니다. – mat