Tôi đang phát xung quanh với các ràng buộc trong (swi) prolog sử dụng thư viện clpfd.SWI-Prolog và các ràng buộc, thư viện CLP (FD)
Tôi đang cố gắng xác định khi nào một tập hợp các ràng buộc đóng gói hoặc thuê gói khác, ví dụ: X < 4 đóng gói X < 7 như bất cứ khi nào cái cũ là đúng, cái sau là đúng. Điều này có thể dễ dàng được biểu diễn bằng cách sử dụng hàm ý logic. Tuy nhiên, tôi không thể có được toán tử # ==> cho tôi kết quả mong muốn, vì vậy tôi đã sử dụng không (Co1 #/\ # \ Co2) trong đó Co1 và Co2 là những ràng buộc. Điều này là tốt cho các ràng buộc cá nhân, nhưng sau đó tôi muốn chuyển một liên kết của các ràng buộc vào Co1 và Co2.
Bây giờ, đây là chà. Khi tôi cố gắng
X#<7 #/\ #\X#<4.
tôi nhận được lại
X in 4..6,
X+1#=_G822,
X+1#=_G834,
_G822 in 5..7,
_G834 in 5..7.
(kỳ quặc đủ, làm điều này trong kết quả Sicstus trong một lỗi segmentation)
Khi tôi vượt qua trong
X#<7,X#<4
tôi nhận được mong muốn
X in inf..3.
Rõ ràng, tôi không thể chuyển phần sau vào không (Co1 #/\ # \ Co2), nhưng trước đây không cho tôi kết quả tôi muốn. Bất cứ ai có thể giải thích lý do tại sao hai phương pháp tiếp cận mang lại kết quả khác nhau, và làm thế nào tôi có thể có được cựu hành động như sau này?
Rất cám ơn, tôi đang đối phó với sự bất bình đẳng tuyến tính. Tôi đang cố gắng tự động tìm phạm vi cho một tập hợp các ràng buộc liên kết (có thể phủ định). Vì vậy, tôi muốn có thể vượt qua (ví dụ) X # <4,\#(X#> 2), hoạt động. Tôi cũng muốn truyền đạt điều phức tạp hơn, ví dụ: X # <4,#\\(X#> 2, X # <1), không hoạt động, vì # \ sau đó được coi là toán tử nhị phân. Tương tự, cho nó X # <4,#\\((X#> 2, X # <1)) cũng dẫn đến lỗi. – Nir
Để hủy kết hợp, bạn phải sử dụng #/\, ví dụ: # \ (A #/\ B). – mat