다음 프로그램을 단축하고 싶습니다. 단지 이미징에는 X
및 Y
대신 수십 개의 변수가 있습니다. 문제는 각 변수에 대해 별도로 도메인을 정의해야한다는 것입니다. 내 프로그램이 훨씬 길고 투명 해지기 때문에 나는 그것을 좋아하지 않습니다.다음 프로그램 단축 방법?
입력 :
?- 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
고마워요!
아하,'ins' 상당히 프로그램을 단축하지만 여전히 나는 필요 많은'Dom'변수. 나는 그것이 더 단축 될 수 없다고 생각한다. 나는 시간 설정 문제를 해결하고 있는데, global_cardinality는 시간 슬롯에 수업이 없거나 수업을 하나만 가질 수 있다고 말하기 위해 필요하다. –
시간 테이블에 관해서는 스케줄 된 각 레슨마다 하나의 유한 도메인 변수를 사용하는 것이 더 좋을 수 있으며,이 변수 (각 레슨의 시간 슬롯을 보유)는 'all_different/1'이어야합니다. 빈 시간 슬롯은 자신의 변수를 요구하지 않고 단순히 어떤 레슨에도 할당되지 않으므로 변수의 수를 줄일 수 있습니다. – mat