這就是問題簡而言之: 16個孩子要坐在4 x 4陣列椅子上。這些孩子是8個女孩(編號1..8)和8個男孩(編號9..16)。 1,3,5,8認爲男孩是墮胎 9,10,11,14認爲女孩是毛 這些對是敵人: [[1,2],[4,6],[4,7], [4,9],[9,11],[12,14],[14,16]]排除序言中的tuples_in列表
找到兩個孩子不是敵人謂詞被定義爲:
not_enemy(A, B) :-
NotA #\= A #\/ NotB #\= B,
tuples_in([[NotA, NotB]],
[[1,2], [4,6], [4,7], [4, 9],[9,11], [12, 14], [14,16]]).
上面代碼被發現here
但是當我查詢? - not_enemy(1,2)輸出是真實的。
我不得不改用此長碼:
not_enemy(A, B) :-
A #=1 #==> B #\= 2,
A #=4 #==> B #\= 6,
A #=4 #==> B #\= 7,
A #=4 #==> B #\= 9,
A #=9 #==> B #\= 11,
A #=12 #==> B #\= 14,
A #=14 #==> B #\= 16.
任何人都可以請幫助糾正第一段代碼?提前致謝。
這個例子是錯誤的,並且混合使用'tuples_in/2'的通知肯定不是用CLP(FD)表達給定約束的好方法。你的代碼是正確的方法(+1!)。另一種方法是應用方法@repeat描述:您可以構建關係的補充並使用tuples_in/2來將這些對約束爲* compatible *元素。另一種方法是否定個別的'tuples_in/2'約束。要小心,儘管不會意外否定涉及多對的tuples_in/2約束,因爲這不會在邏輯上等同於其他方式。 – mat