这就是问题简而言之: 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