简而言之,这就是问题所在: 16名儿童将坐在4x4排的椅子上。这些儿童有8名女孩(编号1.8)和8名男孩(编号9.16)。1,3,5,8认为男孩是令人讨厌的9,10,11,14女孩是粗俗的--这些人是敌人:[1,2,4,6,4,7,4,9,11,12,14,14,16]
查找两个子级不是敌人的谓词定义为:
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]]).
以上代码被发现为这里。
但是当我查询?- 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.
有人能帮忙纠正第一段代码吗?提前谢谢。
发布于 2015-07-25 07:41:41
我找到了另一个答案,而不是用这个
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]]).
用#否定tuples_in就行了
not_enemy(A, B) :-
#\ tuples_in([[A,B]],
[[1,2], [4,6], [4,7], [4, 9],[9,11], [12, 14], [14,16]]).
发布于 2015-07-03 21:49:25
我会改进你的代码,只是为了使它成为通用的
not_enemy(A, B) :-
maplist(not_enemy(A,B), [[1,2], [4,6], [4,7], [4,9], [9,11], [12,14], [14,16]]).
not_enemy(A,B,[X,Y]) :-
X #= A #==> Y #\= B.
我找不到合适的方法来使用tuples_in来解决这个问题。
发布于 2015-07-03 22:10:25
以上使用tuples_in/2
是错误的。
将tuples_in
视为定义“兼容性表”的一种方法:那么很明显,与(#\=)/2
的组合不可能用于表示“不兼容表”。
为什么?因为--使用不兼容表--我们不想排除任何一个不兼容的元组,但是所有这些元组同时都是。
当处理有限区域时,我们可以显式地构造一个相容表,方法是以笛卡尔积作为消除不相容对的基础。
https://stackoverflow.com/questions/31212357
复制相似问题